From b02b0d2912490a6f8a275d26dab92c9bdaa99843 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Fri, 20 Sep 2013 14:07:56 -0700 Subject: [PATCH 001/389] Ticket #22929 Do not use read_by_current_user in list setting test --- tests/test_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 38c8a7bdc..746d9193c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -660,8 +660,8 @@ def test_set_float(self): def test_set_list(self): entity = 'Note' entity_id = self.note['id'] - field_name = 'read_by_current_user' - pos_values = ['read','unread'] + field_name = 'sg_note_type' + pos_values = ['Internal','Client'] expected, actual = self.assert_set_field(entity, entity_id, field_name, From c74a2e60069a65d2cf5cf50c02f49c2e8d245b71 Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Tue, 1 Oct 2013 13:29:35 -0400 Subject: [PATCH 002/389] For #20562, add python api support for new api functions 'follow' and 'unfollow'. --- shotgun_api3/shotgun.py | 40 ++++++++++++++++++++++++++++++++++++++++ tests/test_api.py | 21 +++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index f27c756a7..a317b70be 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -797,6 +797,46 @@ def work_schedule_update(self, date, working, description=None, project=None, us return self._call_rpc('work_schedule_update', params) + def follow(self, user, entity): + """Adds the entity to the user's followed entities (or does nothing if the user is already following the entity) + + :param dict user: User entity to follow the entity + :param dict entity: Entity to be followed + + :returns: dict with 'followed'=true, and dicts for the 'user' and 'entity' that were passed in + """ + + if not self.server_caps.version or self.server_caps.version < (5, 2, 0): + raise ShotgunError("Follow support requires server version 5.2 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + params = dict( + user=user, + entity=entity + ) + + return self._call_rpc('follow', params) + + def unfollow(self, user, entity): + """Removes entity from the user's followed entities (or does nothing if the user is not following the entity) + + :param dict user: User entity to unfollow the entity + :param dict entity: Entity to be unfollowed + + :returns: dict with 'unfollowed'=true, and dicts for the 'user' and 'entity' that were passed in + """ + + if not self.server_caps.version or self.server_caps.version < (5, 2, 0): + raise ShotgunError("Follow support requires server version 5.2 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + params = dict( + user=user, + entity=entity + ) + + return self._call_rpc('unfollow', params) + def schema_entity_read(self): """Gets all active entities defined in the schema. diff --git a/tests/test_api.py b/tests/test_api.py index 746d9193c..1b63fb49c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1282,6 +1282,27 @@ def test_unsupported_filters(self): self.assertRaises(shotgun_api3.Fault, self.sg.find_one, 'EventLogEntry', [['meta', 'is_not', [None]]]) self.assertRaises(shotgun_api3.Fault, self.sg.find_one, 'Revision', [['meta', 'attachment', [None]]]) +class TestFollow(base.TestBase): + def test_follow(self): + '''Test methods to follow/unfollow''' + + project = self.sg.find_one('Project', []) + user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) + entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) + + result = self.sg.follow(user, entity) + assert(result['followed']) + + def test_unfollow(self): + '''Test methods to follow/unfollow''' + + project = self.sg.find_one('Project', []) + user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) + entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) + + result = self.sg.unfollow(user, entity) + print( result ) + assert(result['unfollowed']) class TestErrors(base.TestBase): def test_bad_auth(self): From 016d399c68b4071584fb9b224c79841575ed4c8e Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Fri, 4 Oct 2013 10:18:25 -0400 Subject: [PATCH 003/389] For #20562, implement 'followers' support in python-api. --- shotgun_api3/shotgun.py | 18 ++++++++++++++++++ tests/test_api.py | 18 ++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a317b70be..27a8498c5 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -837,6 +837,24 @@ def unfollow(self, user, entity): return self._call_rpc('unfollow', params) + def followers(self, entity): + """Gets all followers of the entity. + + :param dict entity: Find all followers of this entity + + :returns list of dicts for all the users following the entity + """ + + if not self.server_caps.version or self.server_caps.version < (5, 2, 0): + raise ShotgunError("Follow support requires server version 5.2 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + params = dict( + entity=entity + ) + + return self._call_rpc('followers', params) + def schema_entity_read(self): """Gets all active entities defined in the schema. diff --git a/tests/test_api.py b/tests/test_api.py index 1b63fb49c..3f24a89e7 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1284,7 +1284,7 @@ def test_unsupported_filters(self): class TestFollow(base.TestBase): def test_follow(self): - '''Test methods to follow/unfollow''' + '''Test follow method''' project = self.sg.find_one('Project', []) user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) @@ -1294,7 +1294,7 @@ def test_follow(self): assert(result['followed']) def test_unfollow(self): - '''Test methods to follow/unfollow''' + '''Test unfollow method''' project = self.sg.find_one('Project', []) user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) @@ -1303,6 +1303,20 @@ def test_unfollow(self): result = self.sg.unfollow(user, entity) print( result ) assert(result['unfollowed']) + + def test_followers(self): + '''Test followers method''' + + project = self.sg.find_one('Project', []) + user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) + entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) + + result = self.sg.follow(user, entity) + assert(result['followed']) + + result = self.sg.followers(entity) + self.assertEqual( 1, len(result) ) + self.assertEqual( user['id'], result[0]['id'] ) class TestErrors(base.TestBase): def test_bad_auth(self): From a444d8eeb6ba5af6068bfc7dadd4619d2c6a184d Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Fri, 4 Oct 2013 14:11:14 -0400 Subject: [PATCH 004/389] For #22789, make python api follow tests do nothing if the server version is earlier than 5.2. --- tests/test_api.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index 3f24a89e7..00cb6a399 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1286,6 +1286,10 @@ class TestFollow(base.TestBase): def test_follow(self): '''Test follow method''' + server_info = self.sg.info() + if not server_info['version'] or tuple(server_info['version'][:3]) < (5, 2, 0): + return + project = self.sg.find_one('Project', []) user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) @@ -1296,17 +1300,24 @@ def test_follow(self): def test_unfollow(self): '''Test unfollow method''' + server_info = self.sg.info() + if not server_info['version'] or tuple(server_info['version'][:3]) < (5, 2, 0): + return + project = self.sg.find_one('Project', []) user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) result = self.sg.unfollow(user, entity) - print( result ) assert(result['unfollowed']) def test_followers(self): '''Test followers method''' + server_info = self.sg.info() + if not server_info['version'] or tuple(server_info['version'][:3]) < (5, 2, 0): + return + project = self.sg.find_one('Project', []) user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) From 82ffd88db99f769b5fe2c75103f7deec18d4726b Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Fri, 4 Oct 2013 14:36:58 -0400 Subject: [PATCH 005/389] For #20562, better approach to making python api tests version specific. --- tests/test_api.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 00cb6a399..25415efc7 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1286,8 +1286,7 @@ class TestFollow(base.TestBase): def test_follow(self): '''Test follow method''' - server_info = self.sg.info() - if not server_info['version'] or tuple(server_info['version'][:3]) < (5, 2, 0): + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): return project = self.sg.find_one('Project', []) @@ -1300,8 +1299,7 @@ def test_follow(self): def test_unfollow(self): '''Test unfollow method''' - server_info = self.sg.info() - if not server_info['version'] or tuple(server_info['version'][:3]) < (5, 2, 0): + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): return project = self.sg.find_one('Project', []) @@ -1314,8 +1312,7 @@ def test_unfollow(self): def test_followers(self): '''Test followers method''' - server_info = self.sg.info() - if not server_info['version'] or tuple(server_info['version'][:3]) < (5, 2, 0): + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): return project = self.sg.find_one('Project', []) From 2fd23abd614340c9b990767a64a37dcfc3c00f71 Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Sat, 5 Oct 2013 14:34:20 -0400 Subject: [PATCH 006/389] For #20562, rewrite python api unit tests for follow to fit python api unit test conventions. --- tests/test_api.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 25415efc7..8be59e5a0 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1282,18 +1282,18 @@ def test_unsupported_filters(self): self.assertRaises(shotgun_api3.Fault, self.sg.find_one, 'EventLogEntry', [['meta', 'is_not', [None]]]) self.assertRaises(shotgun_api3.Fault, self.sg.find_one, 'Revision', [['meta', 'attachment', [None]]]) -class TestFollow(base.TestBase): +class TestFollow(base.LiveTestBase): + def setUp(self): + super(TestFollow, self).setUp() + self.sg.update( 'HumanUser', self.human_user['id'], {'projects':[self.project]}) + def test_follow(self): '''Test follow method''' if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): return - - project = self.sg.find_one('Project', []) - user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) - entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) - - result = self.sg.follow(user, entity) + + result = self.sg.follow(self.human_user, self.shot) assert(result['followed']) def test_unfollow(self): @@ -1302,11 +1302,7 @@ def test_unfollow(self): if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): return - project = self.sg.find_one('Project', []) - user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) - entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) - - result = self.sg.unfollow(user, entity) + result = self.sg.unfollow(self.human_user, self.shot) assert(result['unfollowed']) def test_followers(self): @@ -1315,16 +1311,12 @@ def test_followers(self): if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): return - project = self.sg.find_one('Project', []) - user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) - entity = self.sg.find_one('Shot', [['project', 'is', project]], ['name']) - - result = self.sg.follow(user, entity) + result = self.sg.follow(self.human_user, self.shot) assert(result['followed']) - result = self.sg.followers(entity) + result = self.sg.followers(self.shot) self.assertEqual( 1, len(result) ) - self.assertEqual( user['id'], result[0]['id'] ) + self.assertEqual( self.human_user['id'], result[0]['id'] ) class TestErrors(base.TestBase): def test_bad_auth(self): From 9b390c5a65f3497699464844751aae21909ba8fa Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Tue, 8 Oct 2013 09:03:43 -0400 Subject: [PATCH 007/389] For #20562, set api follow methods minimum server version to 5.1.22. --- shotgun_api3/shotgun.py | 6 +++--- tests/test_api.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 27a8498c5..7fa285558 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -806,7 +806,7 @@ def follow(self, user, entity): :returns: dict with 'followed'=true, and dicts for the 'user' and 'entity' that were passed in """ - if not self.server_caps.version or self.server_caps.version < (5, 2, 0): + if not self.server_caps.version or self.server_caps.version < (5, 1, 22): raise ShotgunError("Follow support requires server version 5.2 or "\ "higher, server is %s" % (self.server_caps.version,)) @@ -826,7 +826,7 @@ def unfollow(self, user, entity): :returns: dict with 'unfollowed'=true, and dicts for the 'user' and 'entity' that were passed in """ - if not self.server_caps.version or self.server_caps.version < (5, 2, 0): + if not self.server_caps.version or self.server_caps.version < (5, 1, 22): raise ShotgunError("Follow support requires server version 5.2 or "\ "higher, server is %s" % (self.server_caps.version,)) @@ -845,7 +845,7 @@ def followers(self, entity): :returns list of dicts for all the users following the entity """ - if not self.server_caps.version or self.server_caps.version < (5, 2, 0): + if not self.server_caps.version or self.server_caps.version < (5, 1, 22): raise ShotgunError("Follow support requires server version 5.2 or "\ "higher, server is %s" % (self.server_caps.version,)) diff --git a/tests/test_api.py b/tests/test_api.py index 8be59e5a0..98431311d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1290,7 +1290,7 @@ def setUp(self): def test_follow(self): '''Test follow method''' - if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): return result = self.sg.follow(self.human_user, self.shot) @@ -1299,7 +1299,7 @@ def test_follow(self): def test_unfollow(self): '''Test unfollow method''' - if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): return result = self.sg.unfollow(self.human_user, self.shot) @@ -1308,7 +1308,7 @@ def test_unfollow(self): def test_followers(self): '''Test followers method''' - if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 2, 0): + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): return result = self.sg.follow(self.human_user, self.shot) From fd6a80ee708bafab08da815cfc9948516fc4c3d4 Mon Sep 17 00:00:00 2001 From: Isaac Reuben Date: Tue, 7 Jan 2014 00:01:23 -0800 Subject: [PATCH 008/389] Make sure webm/mp4 mime types are always available (they seem to be missing on some OS/distros) --- shotgun_api3/shotgun.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 7fa285558..8f659b80e 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -37,6 +37,8 @@ import logging import mimetools # used for attachment upload import mimetypes # used for attachment upload +mimetypes.add_type('video/webm','.webm') # webm and mp4 seem to be missing +mimetypes.add_type('video/mp4', '.mp4') # from some OS/distros import os import re import copy From 607ec976d752b3ec2da55cd155d66c19269e08d9 Mon Sep 17 00:00:00 2001 From: Rob Blau Date: Thu, 6 Feb 2014 11:41:08 -0800 Subject: [PATCH 009/389] Ticket #24280 - Add support to authenticate with a login/password. --- .gitignore | 1 + shotgun_api3/shotgun.py | 130 ++++++++++++++++++++++++++-------------- tests/base.py | 37 +++++++++--- tests/test_api.py | 69 +++++++++++++++++++++ 4 files changed, 182 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index acc1abf9a..2ceb44653 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ tests/config .coverage .cache +htmlcov # setup related build diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 8f659b80e..bcbba1b8f 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -215,22 +215,26 @@ class Shotgun(object): def __init__(self, base_url, - script_name, - api_key, + script_name=None, + api_key=None, convert_datetimes_to_utc=True, http_proxy=None, ensure_ascii=True, connect=True, - ca_certs=None): + ca_certs=None, + login=None, + password=None): """Initialises a new instance of the Shotgun client. :param base_url: http or https url to the shotgun server. :param script_name: name of the client script, used to authenticate - to the server. + to the server. If script_name is provided, then api_key must be as + well and neither login nor password can be provided. :param api_key: key assigned to the client script, used to - authenticate to the server. + authenticate to the server. If api_key is provided, then script_name + must be as well and neither login nor password can be provided. :param convert_datetimes_to_utc: If True date time values are converted from local time to UTC time before been sent to the server. @@ -245,11 +249,42 @@ def __init__(self, :param ca_certs: The path to the SSL certificate file. Useful for users who would like to package their application into an executable. + + :param login: The login to use to authenticate to the server. If login + is provided, then password must be as well and neither script_name nor + api_key can be provided. + + :param password: The password for the login to use to authenticate to + the server. If password is provided, then login must be as well and + neither script_name nor api_key can be provided. """ + # verify authentication arguments + if login is not None or password is not None: + if script_name is not None or api_key is not None: + raise ValueError("cannot provide both login/password " + "and script_name/api_key") + if login is None: + raise ValueError("password provided without login") + if password is None: + raise ValueError("login provided without password") + + if script_name is not None or api_key is not None: + if script_name is None: + raise ValueError("api_key provided without script_name") + if api_key is None: + raise ValueError("script_name provided without api_key") + + if all(v is None for v in [script_name, api_key, login, password]): + if connect: + raise ValueError("must provide either login/password " + "or script_name/api_key") + self.config = _Config() self.config.api_key = api_key self.config.script_name = script_name + self.config.user_login = login + self.config.user_password = password self.config.convert_datetimes_to_utc = convert_datetimes_to_utc self.config.no_ssl_validation = NO_SSL_VALIDATION self._connection = None @@ -350,7 +385,7 @@ def info(self): :returns: dict of the server meta data. """ - return self._call_rpc("info", None, include_script_name=False) + return self._call_rpc("info", None, include_auth_params=False) def find_one(self, entity_type, filters, fields=None, order=None, filter_operator=None, retired_only=False): @@ -1046,11 +1081,9 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, "entities" : ','.join(entities_str), "source_entity": "%s_%s" % (source_entity['type'], source_entity['id']), "filmstrip_thumbnail" : filmstrip_thumbnail, - "script_name" : self.config.script_name, - "script_key" : self.config.api_key, } - if self.config.session_uuid: - params["session_uuid"] = self.config.session_uuid + + params.update(self._auth_params()) # Create opener with extended form post support opener = self._build_opener(FormPostHandler) @@ -1126,11 +1159,9 @@ def upload(self, entity_type, entity_id, path, field_name=None, params = { "entity_type" : entity_type, "entity_id" : entity_id, - "script_name" : self.config.script_name, - "script_key" : self.config.api_key, } - if self.config.session_uuid: - params["session_uuid"] = self.config.session_uuid + + params.update(self._auth_params()) if is_thumbnail: url = urlparse.urlunparse((self.config.scheme, self.config.server, @@ -1331,25 +1362,28 @@ def authenticate_human_user(self, user_login, user_password): if not user_password: raise ValueError('Please supply a password for the user.') - + # Override permissions on Config obj + original_login = self.config.user_login + original_password = self.config.user_password + self.config.user_login = user_login self.config.user_password = user_password try: data = self.find_one('HumanUser', [['sg_status_list', 'is', 'act'], ['login', 'is', user_login]], ['id', 'login'], '', 'all') # Set back to default - There finally and except cannot be used together in python2.4 - self.config.user_login = None - self.config.user_password = None + self.config.user_login = original_login + self.config.user_password = original_password return data except Fault: # Set back to default - There finally and except cannot be used together in python2.4 - self.config.user_login = None - self.config.user_password = None + self.config.user_login = original_login + self.config.user_password = original_password except: # Set back to default - There finally and except cannot be used together in python2.4 - self.config.user_login = None - self.config.user_password = None + self.config.user_login = original_login + self.config.user_password = original_password raise @@ -1396,7 +1430,7 @@ def entity_types(self): # ======================================================================== # RPC Functions - def _call_rpc(self, method, params, include_script_name=True, first=False): + def _call_rpc(self, method, params, include_auth_params=True, first=False): """Calls the specified method on the Shotgun Server sending the supplied payload. @@ -1407,7 +1441,7 @@ def _call_rpc(self, method, params, include_script_name=True, first=False): params = self._transform_outbound(params) payload = self._build_payload(method, params, - include_script_name=include_script_name) + include_auth_params=include_auth_params) encoded_payload = self._encode_payload(payload) req_headers = { @@ -1438,7 +1472,31 @@ def _call_rpc(self, method, params, include_script_name=True, first=False): return results[0] return results - def _build_payload(self, method, params, include_script_name=True): + def _auth_params(self): + """ return a dictionary of the authentication parameters being used. """ + # Used to authenticate HumanUser credentials + if self.config.user_login and self.config.user_password: + auth_params = { + "user_login" : str(self.config.user_login), + "user_password" : str(self.config.user_password), + } + + # Use script name instead + elif self.config.script_name and self.config.api_key: + auth_params = { + "script_name" : str(self.config.script_name), + "script_key" : str(self.config.api_key), + } + + else: + raise ValueError("invalid auth params") + + if self.config.session_uuid: + auth_params["session_uuid"] = self.config.session_uuid + + return auth_params + + def _build_payload(self, method, params, include_auth_params=True): """Builds the payload to be send to the rpc endpoint. """ @@ -1447,28 +1505,8 @@ def _build_payload(self, method, params, include_script_name=True): call_params = [] - if include_script_name: - if not self.config.script_name: - raise ValueError("script_name is empty") - if not self.config.api_key: - raise ValueError("api_key is empty") - - # Used to authenticate HumanUser credentials - if self.config.user_login and self.config.user_password: - auth_params = { - "user_login" : str(self.config.user_login), - "user_password" : str(self.config.user_password), - } - - # Use script name instead - else: - auth_params = { - "script_name" : str(self.config.script_name), - "script_key" : str(self.config.api_key), - } - - if self.config.session_uuid: - auth_params["session_uuid"] = self.config.session_uuid + if include_auth_params: + auth_params = self._auth_params() call_params.append(auth_params) if params: diff --git a/tests/base.py b/tests/base.py index 12ba82cf3..8268c7ab5 100644 --- a/tests/base.py +++ b/tests/base.py @@ -19,6 +19,7 @@ class TestBase(unittest.TestCase): '''Base class for tests. Sets up mocking and database test data.''' + def __init__(self, *args, **kws): unittest.TestCase.__init__(self, *args, **kws) self.human_user = None @@ -35,9 +36,10 @@ def __init__(self, *args, **kws): self.connect = False - def setUp(self): + def setUp(self, auth_mode='ApiUser'): self.config = SgTestConfig() self.config.read_config(CONFIG_PATH) + self.human_login = self.config.human_login self.human_password = self.config.human_password self.server_url = self.config.server_url self.script_name = self.config.script_name @@ -45,12 +47,20 @@ def setUp(self): self.http_proxy = self.config.http_proxy self.session_uuid = self.config.session_uuid - - self.sg = api.Shotgun(self.config.server_url, - self.config.script_name, - self.config.api_key, - http_proxy=self.config.http_proxy, - connect=self.connect) + if auth_mode == 'ApiUser': + self.sg = api.Shotgun(self.config.server_url, + self.config.script_name, + self.config.api_key, + http_proxy=self.config.http_proxy, + connect=self.connect) + elif auth_mode == 'HumanUser': + self.sg = api.Shotgun(self.config.server_url, + login=self.human_login, + password=self.human_password, + http_proxy=self.config.http_proxy, + connect=self.connect) + else: + raise ValueError("Unknown value for auth_mode: %s" % auth_mode) if self.config.session_uuid: self.sg.set_session_uuid(self.config.session_uuid) @@ -164,8 +174,8 @@ def _setup_mock_data(self): class LiveTestBase(TestBase): '''Test base for tests relying on connection to server.''' - def setUp(self): - super(LiveTestBase, self).setUp() + def setUp(self, auth_mode='ApiUser'): + super(LiveTestBase, self).setUp(auth_mode) self.sg_version = self.sg.info()['version'][:3] self._setup_db(self.config) if self.sg.server_caps.version and \ @@ -244,6 +254,15 @@ def _setup_db(self, config): self.local_storage = _find_or_create_entity(self.sg, 'LocalStorage', data, keys) +class HumanUserAuthLiveTestBase(LiveTestBase): + ''' + Test base for relying on a Shotgun connection authenticate through the + configured login/password pair. + ''' + def setUp(self): + super(HumanUserAuthLiveTestBase, self).setUp('HumanUser') + + class SgTestConfig(object): '''Reads test config and holds values''' def __init__(self): diff --git a/tests/test_api.py b/tests/test_api.py index 98431311d..f876be636 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1324,6 +1324,19 @@ def test_bad_auth(self): server_url = self.config.server_url script_name = 'not_real_script_name' api_key = self.config.api_key + login = self.config.human_login + password = self.config.human_password + + # Test various combinations of illegal arguments + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, None, api_key) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, None) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, api_key, login=login, password=password) + self.assertRaises(ValueError, shotgun_api3.Shotgun, login=login) + self.assertRaises(ValueError, shotgun_api3.Shotgun, password=password) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, login=login, password=password) + + # Test failed authentications sg = shotgun_api3.Shotgun(server_url, script_name, api_key) self.assertRaises(shotgun_api3.Fault, sg.find_one, 'Shot',[]) @@ -1332,6 +1345,9 @@ def test_bad_auth(self): sg = shotgun_api3.Shotgun(server_url, script_name, api_key) self.assertRaises(shotgun_api3.Fault, sg.find_one, 'Shot',[]) + sg = shotgun_api3.Shotgun(server_url, login=login, password='not a real password') + self.assertRaises(shotgun_api3.Fault, sg.find_one, 'Shot',[]) + @patch('shotgun_api3.shotgun.Http.request') def test_status_not_200(self, mock_request): response = MagicMock(name="response mock", spec=dict) @@ -1345,6 +1361,59 @@ def test_status_not_200(self, mock_request): # pass +class TestHumanUserAuth(base.HumanUserAuthLiveTestBase): + def test_humanuser_find(self): + """Called find, find_one for known entities as human user""" + filters = [] + filters.append(['project', 'is', self.project]) + filters.append(['id', 'is', self.version['id']]) + + fields = ['id'] + + versions = self.sg.find("Version", filters, fields=fields) + + self.assertTrue(isinstance(versions, list)) + version = versions[0] + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version['id'], version["id"]) + + version = self.sg.find_one("Version", filters, fields=fields) + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version['id'], version["id"]) + + def test_humanuser_upload_thumbnail_for_version(self): + """simple upload thumbnail for version test as human user.""" + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.expanduser( + os.path.join(this_dir,"sg_logo.jpg"))) + size = os.stat(path).st_size + + # upload thumbnail + thumb_id = self.sg.upload_thumbnail("Version", + self.version['id'], path) + self.assertTrue(isinstance(thumb_id, int)) + + # check result on version + version_with_thumbnail = self.sg.find_one('Version', + [['id', 'is', self.version['id']]], + fields=['image']) + + self.assertEqual(version_with_thumbnail.get('type'), 'Version') + self.assertEqual(version_with_thumbnail.get('id'), self.version['id']) + + + h = Http(".cache") + thumb_resp, content = h.request(version_with_thumbnail.get('image'), "GET") + self.assertEqual(thumb_resp['status'], '200') + self.assertEqual(thumb_resp['content-type'], 'image/jpeg') + + # clear thumbnail + response_clear_thumbnail = self.sg.update("Version", + self.version['id'], {'image':None}) + expected_clear_thumbnail = {'id': self.version['id'], 'image': None, 'type': 'Version'} + self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) + + def _has_unicode(data): for k, v in data.items(): if (isinstance(k, unicode)): From 14848d6ce29e5e3d64fd3314dd0661e398385383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Mon, 10 Feb 2014 18:40:04 +0000 Subject: [PATCH 010/389] Added docs for the _Config.timeout_secs parameter --- shotgun_api3/shotgun.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 8f659b80e..37d85796a 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -180,6 +180,10 @@ class _Config(object): def __init__(self): self.max_rpc_attempts = 3 + # From http://docs.python.org/2.6/library/httplib.html: + # If the optional timeout parameter is given, blocking operations + # (like connection attempts) will timeout after that many seconds + # (if it is not given, the global default timeout setting is used) self.timeout_secs = None self.api_ver = 'api3' self.convert_datetimes_to_utc = True From 91e493bf93b3a26ce6500fbc8e643dbfbc457799 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Tue, 18 Feb 2014 14:46:48 -0800 Subject: [PATCH 011/389] Ticket #24097 fixed test with hard coded project --- tests/test_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 98431311d..49b911547 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -513,7 +513,7 @@ def test_work_schedule(self): end_date = '2012-01-07' end_date_obj = datetime.datetime(2012, 1, 7) - project = self.sg.find_one('Project', []) + project = self.project user = self.sg.find_one('HumanUser', [['projects', 'is', project]], ['name']) work_schedule = self.sg.work_schedule_read(start_date, end_date, project, user) @@ -540,7 +540,7 @@ def test_work_schedule(self): expected = { 'date': '2012-01-03', 'description': 'Project Holiday', - 'project': {'id': 4, 'name': 'Demo Project', 'type': 'Project'}, + 'project': project, 'user': None, 'working': False } From 0b1339ed3bd3ad3af524be09c8fe8ff46d68ae38 Mon Sep 17 00:00:00 2001 From: Brandon Ashworth Date: Fri, 21 Feb 2014 12:39:47 -0800 Subject: [PATCH 012/389] Removing python2.5 build TravisCI dropped python2.5 support so builds are not completing. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 409620395..caab72b30 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: python python: - - "2.5" - "2.6" - "2.7" # command to install dependencies From 2d4c7cdbfa60e2baee42fe64cdc07f2b1c4f58a5 Mon Sep 17 00:00:00 2001 From: Rob Blau Date: Mon, 24 Feb 2014 09:48:40 -0800 Subject: [PATCH 013/389] Ticket #24280 - Fix for unit tests. --- tests/test_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index f199aa375..d8f802d96 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1332,8 +1332,8 @@ def test_bad_auth(self): self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, None, api_key) self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, None) self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, api_key, login=login, password=password) - self.assertRaises(ValueError, shotgun_api3.Shotgun, login=login) - self.assertRaises(ValueError, shotgun_api3.Shotgun, password=password) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, login=login) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, password=password) self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, login=login, password=password) # Test failed authentications From 5da22a766aacce206cc64d67e033cac8676ff35c Mon Sep 17 00:00:00 2001 From: kbehrman Date: Tue, 4 Mar 2014 14:32:35 -0800 Subject: [PATCH 014/389] Ticket #23960 make tests run with python 2.4 --- shotgun_api3/shotgun.py | 3 ++- tests/base.py | 5 +---- tests/test_api.py | 20 +++++++++++++++++--- tests/test_api_long.py | 3 ++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index ef92b2c21..9de8eadc5 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -279,7 +279,8 @@ def __init__(self, if api_key is None: raise ValueError("script_name provided without api_key") - if all(v is None for v in [script_name, api_key, login, password]): + # Can't use 'all' with python 2.4 + if len([x for x in [script_name, api_key, login, password] if x]) == 0: if connect: raise ValueError("must provide either login/password " "or script_name/api_key") diff --git a/tests/base.py b/tests/base.py index 8268c7ab5..934f74526 100644 --- a/tests/base.py +++ b/tests/base.py @@ -3,14 +3,11 @@ import unittest from ConfigParser import ConfigParser -try: - import simplejson as json -except ImportError: - import json import mock import shotgun_api3 as api +from shotgun_api3.shotgun import json from shotgun_api3.shotgun import ServerCapabilities CONFIG_PATH = 'tests/config' diff --git a/tests/test_api.py b/tests/test_api.py index d8f802d96..b8a35a2e2 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -373,7 +373,9 @@ def test_share_thumbnail(self): shot_url = urlparse.urlparse(response_shot_thumbnail.get('image')) version_url = urlparse.urlparse(response_version_thumbnail.get('image')) - self.assertEqual(shot_url.path, version_url.path) + shot_path = _get_path(shot_url) + version_path = _get_path(version_url) + self.assertEqual(shot_path, version_path) # share thumbnail from source entity with entities source_thumbnail_id = self.sg.upload_thumbnail("Version", @@ -401,8 +403,12 @@ def test_share_thumbnail(self): version_url = urlparse.urlparse(response_version_thumbnail.get('image')) asset_url = urlparse.urlparse(response_asset_thumbnail.get('image')) - self.assertEqual(version_url.path, shot_url.path) - self.assertEqual(version_url.path, asset_url.path) + shot_path = _get_path(shot_url) + version_path = _get_path(version_url) + asset_path = _get_path(asset_url) + + self.assertEqual(version_path, shot_path) + self.assertEqual(version_path, asset_path) # raise errors when missing required params or providing conflicting ones self.assertRaises(shotgun_api3.ShotgunError, self.sg.share_thumbnail, @@ -1422,6 +1428,14 @@ def _has_unicode(data): return True return False +def _get_path(url): + # url_parse returns native objects for older python versions (2.4) + if isinstance(url, dict): + return url.get('path') + elif isinstance(url, tuple): + return os.path.join(url[:4]) + else: + return url.path if __name__ == '__main__': unittest.main() diff --git a/tests/test_api_long.py b/tests/test_api_long.py index 6bf58ca94..8f9ccc872 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -85,4 +85,5 @@ def test_schema(self): ret_val = self.sg.schema_field_delete("Version", new_field_name) self.assertTrue(ret_val) - +if __name__ == '__main__': + base.unittest.main() From a146f4d6a40f3607c02eabd7ee8746ad2206c4a6 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 5 Mar 2014 22:01:11 +0000 Subject: [PATCH 015/389] Ticket #23960 get file reads to go to end of file for windows --- tests/test_api.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index b8a35a2e2..a3e66011a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -161,10 +161,11 @@ def test_upload_download(self): self.assertEqual(orig_file, attach_file) # test download with attachment_id (write to disk) - file_path = "%s/sg_logo_download.jpg" % os.path.dirname(os.path.realpath(__file__)) + file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sg_logo_download.jpg") result = self.sg.download_attachment(attach_id, file_path=file_path) self.assertEqual(result, file_path) - fp = open(file_path) + # On windows read may not read to end of file unless opened 'rb' + fp = open(file_path, 'rb') attach_file = fp.read() fp.close() self.assertEqual(size, len(attach_file)) @@ -182,7 +183,7 @@ def test_upload_download(self): result = self.sg.download_attachment(ticket['attachments'][0], file_path=file_path) self.assertEqual(result, file_path) - fp = open(file_path) + fp = open(file_path, 'rb') attach_file = fp.read() fp.close() self.assertTrue(attach_file is not None) From 4077c2d016798f5ba1e7c879bdf5fee37e857e79 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Wed, 5 Mar 2014 14:33:47 -0800 Subject: [PATCH 016/389] Ticket #23960 fix indentation --- tests/test_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index a3e66011a..f2079ed63 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -161,10 +161,10 @@ def test_upload_download(self): self.assertEqual(orig_file, attach_file) # test download with attachment_id (write to disk) - file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sg_logo_download.jpg") + file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sg_logo_download.jpg") result = self.sg.download_attachment(attach_id, file_path=file_path) self.assertEqual(result, file_path) - # On windows read may not read to end of file unless opened 'rb' + # On windows read may not read to end of file unless opened 'rb' fp = open(file_path, 'rb') attach_file = fp.read() fp.close() From 4e2bb1bff7310276db462609ac7b3d88d86922fe Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Wed, 5 Mar 2014 18:31:01 -0500 Subject: [PATCH 017/389] Updated link to overview video tour. --- README.mdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.mdown b/README.mdown index e86d8db02..ed52bb334 100644 --- a/README.mdown +++ b/README.mdown @@ -39,7 +39,7 @@ If you're using pip with `requirements.txt`, add the following line: Tutorials and detailed documentation about the Python API are available on the [Python API Wiki](https://github.com/shotgunsoftware/python-api/wiki). There is also some additional related documentation on the [Shotgun Support Website](https://support.shotgunsoftware.com/forums/48807-developer-api-info). Some useful direct links in each are below: -* [Introduction and Video Tour](https://support.shotgunsoftware.com/entries/38181-api-introduction-video-tour) +* [Introduction and Video Tour](https://www.youtube.com/watch?v=QdL5E9XbdJQ) * [Reference: Methods](https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Methods) * [Reference: Data Types](https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Data-Types) * [Reference: Filter Syntax](https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax) From f1533095bfdd91ce58bc1c51110be7772490a106 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Thu, 6 Mar 2014 13:35:10 -0800 Subject: [PATCH 018/389] packaging for v3.0.15 release --- README.mdown | 8 +++++++- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.mdown b/README.mdown index ed52bb334..b68e9bec3 100644 --- a/README.mdown +++ b/README.mdown @@ -56,7 +56,13 @@ Integration and unit tests are provided. ## Changelog -**v3.0.15 Dev - TBD** +**v3.0.15 - 2014 March 6** + + Fixed bug which allowed a value of None for password parameter in authenticate_human_user + + Add follow, unfollow and followers methods + + Added ability to login as human user + + Ensure that webm/mp4 mime types are always available + + Updated link to video tour in README + + Fixes and update to various tests **v3.0.14 - 2013 Jun 26** diff --git a/setup.py b/setup.py index 2f1a24345..7ba7cad36 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.14', + version='3.0.15', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 9de8eadc5..ae35ab196 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -72,7 +72,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.15.dev" +__version__ = "3.0.15" # ---------------------------------------------------------------------------- # Errors From c5fb76916d03eb1e54d03b9ffab6cfea4b6ef6f2 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Thu, 6 Mar 2014 13:58:35 -0800 Subject: [PATCH 019/389] bump version to v3.0.16.dev --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index ae35ab196..007ee5aa3 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -72,7 +72,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.15" +__version__ = "3.0.16.dev" # ---------------------------------------------------------------------------- # Errors From 7a8ab9e0276a6d35938f479b7f18a0e0c28f07d9 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Mon, 21 Apr 2014 13:08:56 -0700 Subject: [PATCH 020/389] For #25127 add test using zero while filtering None --- tests/test_api.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index f2079ed63..a3d9fb98c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1289,6 +1289,40 @@ def test_unsupported_filters(self): self.assertRaises(shotgun_api3.Fault, self.sg.find_one, 'EventLogEntry', [['meta', 'is_not', [None]]]) self.assertRaises(shotgun_api3.Fault, self.sg.find_one, 'Revision', [['meta', 'attachment', [None]]]) + def test_zero_is_not_none(self): + '''Test the zero and None are differentiated using "is_not" filter. + Ticket #25127 + ''' + # Create a number field if it doesn't already exist + num_field = 'sg_api_tests_number_field' + if num_field not in self.sg.schema_field_read('Asset').keys(): + self.sg.schema_field_create('Asset', 'number', num_field.replace('sg_','').replace('_',' ')) + + # Set to None + self.sg.update( 'Asset', self.asset['id'], { num_field: None }) + + # Should be filtered out + result = self.sg.find( 'Asset', [['id','is',self.asset['id']],[num_field, 'is_not', None]] ,[num_field] ) + self.assertEquals([], result) + + # Set it to zero + self.sg.update( 'Asset', self.asset['id'], { num_field: 0 }) + + # Should not be filtered out + result = self.sg.find_one( 'Asset', [['id','is',self.asset['id']],[num_field, 'is_not', None]] ,[num_field] ) + self.assertIsNotNone(result) + + + # Set it to some other number + self.sg.update( 'Asset', self.asset['id'], { num_field: 1 }) + + # Should not be filtered out + result = self.sg.find_one( 'Asset', [['id','is',self.asset['id']],[num_field, 'is_not', None]] ,[num_field] ) + self.assertIsNotNone(result) + + + + class TestFollow(base.LiveTestBase): def setUp(self): super(TestFollow, self).setUp() From 0e73e5a6650f69b8af4d9010e02d5ac1e609ef1e Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Wed, 9 Apr 2014 12:08:13 -0400 Subject: [PATCH 021/389] For #19989, add support in the python api for authentication 'sudo_as_login' option. This allows the authenticating user to act as a different user. The authenticating script or user must have permission to sudo. All actions after authentication will apply the permissions of the sudo_as_login user, and will be logged as having been done by that user. An additional 'sudo_actual_user' property in the event log indicates the authenticated user that actually executed the actions. --- shotgun_api3/shotgun.py | 17 ++++++++++++++++- tests/base.py | 14 ++++++++++---- tests/test_api.py | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 007ee5aa3..d8363efd5 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -192,6 +192,7 @@ def __init__(self): self.script_name = None self.user_login = None self.user_password = None + self.sudo_as_login = None # uuid as a string self.session_uuid = None self.scheme = None @@ -227,7 +228,8 @@ def __init__(self, connect=True, ca_certs=None, login=None, - password=None): + password=None, + sudo_as_login=None): """Initialises a new instance of the Shotgun client. :param base_url: http or https url to the shotgun server. @@ -261,6 +263,11 @@ def __init__(self, :param password: The password for the login to use to authenticate to the server. If password is provided, then login must be as well and neither script_name nor api_key can be provided. + + :param sudo_as_login: A user login string for the user whose permissions will + be applied to all actions and who will be logged as the user performing + all actions. Note that logged events will have an additional extra meta-data parameter + 'sudo_actual_user' indicating the script or user that actually authenticated. """ # verify authentication arguments @@ -290,6 +297,7 @@ def __init__(self, self.config.script_name = script_name self.config.user_login = login self.config.user_password = password + self.config.sudo_as_login = sudo_as_login self.config.convert_datetimes_to_utc = convert_datetimes_to_utc self.config.no_ssl_validation = NO_SSL_VALIDATION self._connection = None @@ -1499,6 +1507,13 @@ def _auth_params(self): if self.config.session_uuid: auth_params["session_uuid"] = self.config.session_uuid + # Make sure sudo_as_login is supported by server version + if self.config.sudo_as_login: + if self.server_caps.version and self.server_caps.version < (5, 3, 12): + raise ShotgunError("Option 'sudo_as_login' requires server version 5.3.12 or "\ + "higher, server is %s" % (self.server_caps.version,)) + auth_params["sudo_as_login"] = self.config.sudo_as_login + return auth_params def _build_payload(self, method, params, include_auth_params=True): diff --git a/tests/base.py b/tests/base.py index 934f74526..da1fdd5bd 100644 --- a/tests/base.py +++ b/tests/base.py @@ -44,18 +44,24 @@ def setUp(self, auth_mode='ApiUser'): self.http_proxy = self.config.http_proxy self.session_uuid = self.config.session_uuid - if auth_mode == 'ApiUser': + sudo_as_login = None + if auth_mode == 'ApiUser:Sudo' or auth_mode == 'HumanUser:Sudo': + sudo_as_login = self.config.human_login + + if auth_mode == 'ApiUser' or auth_mode == 'ApiUser:Sudo': self.sg = api.Shotgun(self.config.server_url, self.config.script_name, self.config.api_key, http_proxy=self.config.http_proxy, - connect=self.connect) - elif auth_mode == 'HumanUser': + connect=self.connect, + sudo_as_login=sudo_as_login ) + elif auth_mode == 'HumanUser' or auth_mode == 'HumanUser:Sudo': self.sg = api.Shotgun(self.config.server_url, login=self.human_login, password=self.human_password, http_proxy=self.config.http_proxy, - connect=self.connect) + connect=self.connect, + sudo_as_login=sudo_as_login ) else: raise ValueError("Unknown value for auth_mode: %s" % auth_mode) diff --git a/tests/test_api.py b/tests/test_api.py index f2079ed63..44eeb4d94 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1368,6 +1368,46 @@ def test_status_not_200(self, mock_request): # pass +class TestScriptUserSudoAuth(base.LiveTestBase): + def setUp(self): + super(TestScriptUserSudoAuth, self).setUp('ApiUser:Sudo') + + def test_user_is_creator(self): + """ + Test 'sudo_as_login' option: on create, ensure appropriate user is set in created-by + """ + data = { + 'project': self.project, + 'code':'JohnnyApple_Design01_FaceFinal', + 'description': 'fixed rig per director final notes', + 'sg_status_list':'na', + 'entity': self.asset, + 'user': self.human_user + } + + version = self.sg.create("Version", data, return_fields = ["id","created_by"]) + self.assertTrue(isinstance(version, dict)) + self.assertTrue("id" in version) + self.assertTrue("created_by" in version) + self.assertEqual( self.config.human_name, version['created_by']['name'] ) + +class TestHumanUserSudoAuth(base.TestBase): + def setUp(self): + super(TestHumanUserSudoAuth, self).setUp('HumanUser:Sudo') + + def test_human_user_sudo_auth_fails(self): + """ + Test 'sudo_as_login' option for HumanUser. + Request fails on server because user has no permission to Sudo. + """ + x = shotgun_api3.Shotgun(self.config.server_url, + login=self.config.human_login, + password=self.config.human_password, + http_proxy=self.config.http_proxy, + sudo_as_login="blah" ) + self.assertRaisesRegexp(shotgun_api3.Fault, "does not have permission to 'sudo'", x.find_one, 'Shot', []) + + class TestHumanUserAuth(base.HumanUserAuthLiveTestBase): def test_humanuser_find(self): """Called find, find_one for known entities as human user""" From de532405962b70fc36ec5f7a07485a12483de334 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Wed, 30 Apr 2014 11:40:50 -0700 Subject: [PATCH 022/389] Bug fixes for unittest methods with older versions of python --- tests/test_api.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index fe52b06f3..3eabdcb24 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1310,7 +1310,7 @@ def test_zero_is_not_none(self): # Should not be filtered out result = self.sg.find_one( 'Asset', [['id','is',self.asset['id']],[num_field, 'is_not', None]] ,[num_field] ) - self.assertIsNotNone(result) + self.assertFalse(result == None) # Set it to some other number @@ -1318,9 +1318,7 @@ def test_zero_is_not_none(self): # Should not be filtered out result = self.sg.find_one( 'Asset', [['id','is',self.asset['id']],[num_field, 'is_not', None]] ,[num_field] ) - self.assertIsNotNone(result) - - + self.assertFalse(result == None) class TestFollow(base.LiveTestBase): @@ -1439,7 +1437,16 @@ def test_human_user_sudo_auth_fails(self): password=self.config.human_password, http_proxy=self.config.http_proxy, sudo_as_login="blah" ) - self.assertRaisesRegexp(shotgun_api3.Fault, "does not have permission to 'sudo'", x.find_one, 'Shot', []) + self.assertRaises(shotgun_api3.Fault, x.find_one, 'Shot', []) + try : + x.find_one('Shot',[]) + except shotgun_api3.Fault, e: + # py24 exceptions don't have message attr + if hasattr(e, 'message'): + self.assertEquals("The user does not have permission to 'sudo': ", e.message) + else: + self.assertEquals("The user does not have permission to 'sudo': ", e.args[0]) + class TestHumanUserAuth(base.HumanUserAuthLiveTestBase): From 38277b3c717f119c3495f81abf4f6cd30565d16a Mon Sep 17 00:00:00 2001 From: Neil Brandt Date: Fri, 2 May 2014 10:03:24 -0400 Subject: [PATCH 023/389] For #19989, make sudo tests backwards compatible with earlier versions of shotgun. --- tests/base.py | 14 ++++---------- tests/test_api.py | 20 +++++++++++++++++--- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/tests/base.py b/tests/base.py index da1fdd5bd..21cfc171b 100644 --- a/tests/base.py +++ b/tests/base.py @@ -44,24 +44,18 @@ def setUp(self, auth_mode='ApiUser'): self.http_proxy = self.config.http_proxy self.session_uuid = self.config.session_uuid - sudo_as_login = None - if auth_mode == 'ApiUser:Sudo' or auth_mode == 'HumanUser:Sudo': - sudo_as_login = self.config.human_login - - if auth_mode == 'ApiUser' or auth_mode == 'ApiUser:Sudo': + if auth_mode == 'ApiUser': self.sg = api.Shotgun(self.config.server_url, self.config.script_name, self.config.api_key, http_proxy=self.config.http_proxy, - connect=self.connect, - sudo_as_login=sudo_as_login ) - elif auth_mode == 'HumanUser' or auth_mode == 'HumanUser:Sudo': + connect=self.connect ) + elif auth_mode == 'HumanUser': self.sg = api.Shotgun(self.config.server_url, login=self.human_login, password=self.human_password, http_proxy=self.config.http_proxy, - connect=self.connect, - sudo_as_login=sudo_as_login ) + connect=self.connect ) else: raise ValueError("Unknown value for auth_mode: %s" % auth_mode) diff --git a/tests/test_api.py b/tests/test_api.py index fe52b06f3..a97b1a83d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1404,12 +1404,22 @@ def test_status_not_200(self, mock_request): class TestScriptUserSudoAuth(base.LiveTestBase): def setUp(self): - super(TestScriptUserSudoAuth, self).setUp('ApiUser:Sudo') + super(TestScriptUserSudoAuth, self).setUp('ApiUser') def test_user_is_creator(self): """ Test 'sudo_as_login' option: on create, ensure appropriate user is set in created-by """ + + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 3, 12): + return + + x = shotgun_api3.Shotgun(self.config.server_url, + self.config.script_name, + self.config.api_key, + http_proxy=self.config.http_proxy, + sudo_as_login=self.config.human_login ) + data = { 'project': self.project, 'code':'JohnnyApple_Design01_FaceFinal', @@ -1419,7 +1429,7 @@ def test_user_is_creator(self): 'user': self.human_user } - version = self.sg.create("Version", data, return_fields = ["id","created_by"]) + version = x.create("Version", data, return_fields = ["id","created_by"]) self.assertTrue(isinstance(version, dict)) self.assertTrue("id" in version) self.assertTrue("created_by" in version) @@ -1427,13 +1437,17 @@ def test_user_is_creator(self): class TestHumanUserSudoAuth(base.TestBase): def setUp(self): - super(TestHumanUserSudoAuth, self).setUp('HumanUser:Sudo') + super(TestHumanUserSudoAuth, self).setUp('HumanUser') def test_human_user_sudo_auth_fails(self): """ Test 'sudo_as_login' option for HumanUser. Request fails on server because user has no permission to Sudo. """ + + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 3, 12): + return + x = shotgun_api3.Shotgun(self.config.server_url, login=self.config.human_login, password=self.config.human_password, From b02a09b6b84e3826d6184154e10e60be2266ee91 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Wed, 7 May 2014 09:50:40 -0700 Subject: [PATCH 024/389] For #25082 add support for ignoring archived projects --- shotgun_api3/shotgun.py | 23 ++++++++++++++++------- tests/test_api.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index d8363efd5..8e50de6fd 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -401,7 +401,7 @@ def info(self): return self._call_rpc("info", None, include_auth_params=False) def find_one(self, entity_type, filters, fields=None, order=None, - filter_operator=None, retired_only=False): + filter_operator=None, retired_only=False, include_archived_projects=True): """Calls the find() method and returns the first result, or None. :param entity_type: Required, entity type (string) to find. @@ -429,14 +429,15 @@ def find_one(self, entity_type, filters, fields=None, order=None, """ results = self.find(entity_type, filters, fields, order, - filter_operator, 1, retired_only) + filter_operator, 1, retired_only, include_archived_projects=include_archived_projects) if results: return results[0] return None def find(self, entity_type, filters, fields=None, order=None, - filter_operator=None, limit=0, retired_only=False, page=0): + filter_operator=None, limit=0, retired_only=False, page=0, + include_archived_projects=True): """Find entities matching the given filters. :param entity_type: Required, entity type (string) to find. @@ -462,6 +463,9 @@ def find(self, entity_type, filters, fields=None, order=None, been retried. Defaults to False which returns only entities which have not been retired. + :param include_archived_projects: Optional, flag to include entities + whose projects have been archived + :returns: list of the dicts for each entity with the requested fields, and their id and type. """ @@ -483,7 +487,8 @@ def find(self, entity_type, filters, fields=None, order=None, fields, filters, retired_only, - order) + order, + include_archived_projects) if limit and limit <= self.config.records_per_page: params["paging"]["entities_per_page"] = limit @@ -526,7 +531,8 @@ def _construct_read_parameters(self, fields, filters, retired_only, - order): + order, + include_archived_projects): params = {} params["type"] = entity_type params["return_fields"] = fields or ["id"] @@ -535,6 +541,7 @@ def _construct_read_parameters(self, params["return_paging_info"] = True params["paging"] = { "entities_per_page": self.config.records_per_page, "current_page": 1 } + params["include_archived_projects"] = include_archived_projects if order: sort_list = [] @@ -555,7 +562,8 @@ def summarize(self, filters, summary_fields, filter_operator=None, - grouping=None): + grouping=None, + include_archived_projects=True): """ Return group and summary information for entity_type for summary_fields based on the given filters. @@ -570,7 +578,8 @@ def summarize(self, params = {"type": entity_type, "summaries": summary_fields, - "filters": filters} + "filters": filters, + "include_archived_projects": include_archived_projects} if grouping != None: params['grouping'] = grouping diff --git a/tests/test_api.py b/tests/test_api.py index f0cf40db8..6c235fc6f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -438,6 +438,21 @@ def test_simple_summary(self): assert(result['groups'][0]['summaries']) assert(result['summaries']) + def test_summary_include_archived_projects(self): + # archive project + self.sg.update('Project', self.project['id'], {'archived':True}) + # Ticket #25082 ability to hide archived projects in summary + summaries = [{'field': 'id', 'type': 'count'}] + grouping = [{'direction': 'asc', 'field': 'id', 'type': 'exact'}] + filters = [['project', 'is', self.project]] + result = self.sg.summarize('Shot', + filters=filters, + summary_fields=summaries, + grouping=grouping, + include_archived_projects=False) + self.assertEqual(result['summaries']['id'], 0) + self.sg.update('Project', self.project['id'], {'archived':False}) + def test_summary_values(self): '''''' shot_data = { @@ -1320,6 +1335,23 @@ def test_zero_is_not_none(self): result = self.sg.find_one( 'Asset', [['id','is',self.asset['id']],[num_field, 'is_not', None]] ,[num_field] ) self.assertFalse(result == None) + def test_include_archived_projects(self): + # Ticket #25082 + result = self.sg.find_one('Shot', [['id','is',self.shot['id']]]) + self.assertEquals(self.shot['id'], result['id']) + + # archive project + self.sg.update('Project', self.project['id'], {'archived':True}) + + # setting defaults to True, so we should get result + result = self.sg.find_one('Shot', [['id','is',self.shot['id']]]) + self.assertEquals(self.shot['id'], result['id']) + + result = self.sg.find_one('Shot', [['id','is',self.shot['id']]], include_archived_projects=False) + self.assertEquals(None, result) + + # unarchive project + self.sg.update('Project', self.project['id'], {'archived':False}) class TestFollow(base.LiveTestBase): def setUp(self): From d6edf0a9595b11e40c78d0ff53c8dddcaea9ea02 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Thu, 8 May 2014 09:11:03 -0700 Subject: [PATCH 025/389] For #25082 check server version --- shotgun_api3/shotgun.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 8e50de6fd..7f3883fe5 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -139,6 +139,14 @@ def _ensure_json_supported(self): raise ShotgunError("JSON API requires server version 2.4 or "\ "higher, server is %s" % (self.version,)) + def ensure_include_archived_projects(self): + """Checks the server version support include_archived_projects parameter + to find. + """ + if not self.version or self.version < (5, 3, 14): + raise ShotgunError("The include_archived_projects flag requires server version 5.3.14 or "\ + "higher, server is %s" % (self.version,)) + def __str__(self): return "ServerCapabilities: host %s, version %s, is_dev %s"\ @@ -483,6 +491,12 @@ def find(self, entity_type, filters, fields=None, order=None, raise ShotgunError("Deprecated: Use of filter_operator for find()" " is not valid any more. See the documentation on find()") + if not include_archived_projects: + # This defaults to True on the server (no argument is sent) + # So we only need to check the server version if it is False + self.server_caps.ensure_include_archived_projects() + + params = self._construct_read_parameters(entity_type, fields, filters, @@ -541,7 +555,10 @@ def _construct_read_parameters(self, params["return_paging_info"] = True params["paging"] = { "entities_per_page": self.config.records_per_page, "current_page": 1 } - params["include_archived_projects"] = include_archived_projects + + if include_archived_projects is False: + # Defaults to True on the server, so only pass it if it's False + params["include_archived_projects"] = False if order: sort_list = [] From 42d5dfeaf8cfd12ca0c9efe3b9aa2cc52d92cb90 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Thu, 8 May 2014 17:10:50 -0700 Subject: [PATCH 026/389] For #25082 check server version before running tests --- tests/test_api.py | 52 ++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 6c235fc6f..cd264f12a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -439,19 +439,20 @@ def test_simple_summary(self): assert(result['summaries']) def test_summary_include_archived_projects(self): - # archive project - self.sg.update('Project', self.project['id'], {'archived':True}) - # Ticket #25082 ability to hide archived projects in summary - summaries = [{'field': 'id', 'type': 'count'}] - grouping = [{'direction': 'asc', 'field': 'id', 'type': 'exact'}] - filters = [['project', 'is', self.project]] - result = self.sg.summarize('Shot', - filters=filters, - summary_fields=summaries, - grouping=grouping, - include_archived_projects=False) - self.assertEqual(result['summaries']['id'], 0) - self.sg.update('Project', self.project['id'], {'archived':False}) + if self.sg.server_caps.version > (5, 3, 13): + # archive project + self.sg.update('Project', self.project['id'], {'archived':True}) + # Ticket #25082 ability to hide archived projects in summary + summaries = [{'field': 'id', 'type': 'count'}] + grouping = [{'direction': 'asc', 'field': 'id', 'type': 'exact'}] + filters = [['project', 'is', self.project]] + result = self.sg.summarize('Shot', + filters=filters, + summary_fields=summaries, + grouping=grouping, + include_archived_projects=False) + self.assertEqual(result['summaries']['id'], 0) + self.sg.update('Project', self.project['id'], {'archived':False}) def test_summary_values(self): '''''' @@ -1336,22 +1337,23 @@ def test_zero_is_not_none(self): self.assertFalse(result == None) def test_include_archived_projects(self): - # Ticket #25082 - result = self.sg.find_one('Shot', [['id','is',self.shot['id']]]) - self.assertEquals(self.shot['id'], result['id']) + if self.sg.server_caps.version > (5, 3, 13): + # Ticket #25082 + result = self.sg.find_one('Shot', [['id','is',self.shot['id']]]) + self.assertEquals(self.shot['id'], result['id']) - # archive project - self.sg.update('Project', self.project['id'], {'archived':True}) + # archive project + self.sg.update('Project', self.project['id'], {'archived':True}) - # setting defaults to True, so we should get result - result = self.sg.find_one('Shot', [['id','is',self.shot['id']]]) - self.assertEquals(self.shot['id'], result['id']) + # setting defaults to True, so we should get result + result = self.sg.find_one('Shot', [['id','is',self.shot['id']]]) + self.assertEquals(self.shot['id'], result['id']) - result = self.sg.find_one('Shot', [['id','is',self.shot['id']]], include_archived_projects=False) - self.assertEquals(None, result) + result = self.sg.find_one('Shot', [['id','is',self.shot['id']]], include_archived_projects=False) + self.assertEquals(None, result) - # unarchive project - self.sg.update('Project', self.project['id'], {'archived':False}) + # unarchive project + self.sg.update('Project', self.project['id'], {'archived':False}) class TestFollow(base.LiveTestBase): def setUp(self): From edcdfe5fe8172ee3c6b80712051b695601a6f7b7 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Thu, 8 May 2014 17:49:25 -0700 Subject: [PATCH 027/389] For #25082 do version check for summarize as well --- shotgun_api3/shotgun.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 7f3883fe5..dde8128cf 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -593,10 +593,19 @@ def summarize(self, if isinstance(filters, (list, tuple)): filters = _translate_filters(filters, filter_operator) + if not include_archived_projects: + # This defaults to True on the server (no argument is sent) + # So we only need to check the server version if it is False + self.server_caps.ensure_include_archived_projects() + params = {"type": entity_type, "summaries": summary_fields, - "filters": filters, - "include_archived_projects": include_archived_projects} + "filters": filters} + + if include_archived_projects is False: + # Defaults to True on the server, so only pass it if it's False + params["include_archived_projects"] = False + if grouping != None: params['grouping'] = grouping From b173da5b1a320b0c6d6bf14a67436b54875d9bf6 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Thu, 8 May 2014 18:20:40 -0700 Subject: [PATCH 028/389] Fix expected data in test --- tests/test_api.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index cd264f12a..11c92b8a7 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -456,6 +456,14 @@ def test_summary_include_archived_projects(self): def test_summary_values(self): '''''' + # try to fix data if not in expected state + shots = self.sg.find('Shot',[['project','is',self.project],['code','in',['shot 1','shot 2','shot 3']]]) + print len(shots) + for shot in shots: + # These shots should have been deleted,if they still exist it is due to an failure in mid-test + self.sg.delete('Shot', shot['id']) + + shot_data = { 'sg_status_list': 'ip', 'sg_cut_duration': 100, From a80554e6dcd2e7d35bbf92207fe9d0e660d13499 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Fri, 23 May 2014 09:01:53 -0700 Subject: [PATCH 029/389] packaging for v3.0.16 release --- README.mdown | 5 +++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.mdown b/README.mdown index b68e9bec3..95ff7c93b 100644 --- a/README.mdown +++ b/README.mdown @@ -56,6 +56,11 @@ Integration and unit tests are provided. ## Changelog +**v3.0.16 - 2014 May 23** + + Add flag to ignore entities from archived projects. + + Add support for differentiating between zero and None for number fields. + + Add ability to act as a different user. + **v3.0.15 - 2014 March 6** + Fixed bug which allowed a value of None for password parameter in authenticate_human_user + Add follow, unfollow and followers methods diff --git a/setup.py b/setup.py index 7ba7cad36..ff0bf870b 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.15', + version='3.0.16', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index dde8128cf..f526b6089 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -72,7 +72,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.16.dev" +__version__ = "3.0.16" # ---------------------------------------------------------------------------- # Errors From 19faa51998c7cb9dc9831e1f6a96b58a5e45f8c1 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Fri, 23 May 2014 09:17:57 -0700 Subject: [PATCH 030/389] Bump version to 3.0.17.dev --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index f526b6089..3bf5d1fec 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -72,7 +72,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.16" +__version__ = "3.0.17.dev" # ---------------------------------------------------------------------------- # Errors From 81307deb67f4f774b79426a1a92279ce6059d57e Mon Sep 17 00:00:00 2001 From: kbehrman Date: Fri, 23 May 2014 08:49:54 -0700 Subject: [PATCH 031/389] For #24681 allow creating PageHit from api --- shotgun_api3/shotgun.py | 17 +++++++++++++++++ tests/test_api.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 3bf5d1fec..a78e8c720 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1435,6 +1435,23 @@ def authenticate_human_user(self, user_login, user_password): raise + def update_project_last_accessed(self, project, user=None): + """ + Update projects last_accessed_by_current_user field. + """ + # Find a page from the project + page = self.find_one('Page', [['project','is',project]]) + if not page: + raise RuntimeError("Unable to find page for project %s" % str(project)) + + if not user: + # Try to use login if present + if self.config.user_login: + user = self.find_one('HumanUser', [['login', 'is', self.config.user_login]]) + if not user: + raise RuntimeError("No user supplied and unable to determine user from login") + + self.create( 'PageHit', { 'page': page, 'user': user } ) def _get_session_token(self): diff --git a/tests/test_api.py b/tests/test_api.py index 11c92b8a7..4ee9c2670 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1558,6 +1558,43 @@ def test_humanuser_upload_thumbnail_for_version(self): self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) +class TestProjectLastAccessedByCurrentUser(base.LiveTestBase): + # Ticket #24681 + def test_logged_in_user(self): + sg = shotgun_api3.Shotgun(self.config.server_url, + login=self.config.human_login, + password=self.config.human_password, + http_proxy=self.config.http_proxy) + + initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + + sg.update_project_last_accessed(self.project) + + current = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + self.assertNotEqual( initial, current ) + # it's possible initial is None + if initial: + assert(initial['last_accessed_by_current_user'] < current['last_accessed_by_current_user']) + + + def test_pass_in_user(self): + sg = shotgun_api3.Shotgun(self.config.server_url, + login=self.config.human_login, + password=self.config.human_password, + http_proxy=self.config.http_proxy) + + initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + + # this instance of the api is not logged in as a user + self.sg.update_project_last_accessed(self.project, user=self.human_user) + + current = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + self.assertNotEqual( initial, current ) + # it's possible initial is None + if initial: + assert(initial['last_accessed_by_current_user'] < current['last_accessed_by_current_user']) + + def _has_unicode(data): for k, v in data.items(): if (isinstance(k, unicode)): From d0fe33d149cd724ed860fb670b96c01e8f5c076c Mon Sep 17 00:00:00 2001 From: kbehrman Date: Fri, 23 May 2014 11:50:01 -0700 Subject: [PATCH 032/389] For #24681 use project_overview page for updateing last accessed by current user --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a78e8c720..9c23f3793 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1440,7 +1440,7 @@ def update_project_last_accessed(self, project, user=None): Update projects last_accessed_by_current_user field. """ # Find a page from the project - page = self.find_one('Page', [['project','is',project]]) + page = self.find_one('Page', [['project','is',project], ['ui_category','is','project_overview']]) if not page: raise RuntimeError("Unable to find page for project %s" % str(project)) From 2639417c0263580e1c0df46738ebe51ddae2180b Mon Sep 17 00:00:00 2001 From: kbehrman Date: Tue, 27 May 2014 11:43:08 -0700 Subject: [PATCH 033/389] For #24681 fall back to another project page if project overview unavailable --- shotgun_api3/shotgun.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 9c23f3793..b8f9592d1 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1441,6 +1441,11 @@ def update_project_last_accessed(self, project, user=None): """ # Find a page from the project page = self.find_one('Page', [['project','is',project], ['ui_category','is','project_overview']]) + if not page: + # There should be a project overview page page for a live project, but if there is not, + # another page from the project will work. + page = self.find_one('Page', [['project','is',project]]) + if not page: raise RuntimeError("Unable to find page for project %s" % str(project)) From b03316b7691d82e08e0d4e63c1160426ba078434 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Tue, 27 May 2014 12:01:18 -0700 Subject: [PATCH 034/389] For #24681 check server version --- shotgun_api3/shotgun.py | 4 ++++ tests/test_api.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index b8f9592d1..0f4f18f26 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1439,6 +1439,10 @@ def update_project_last_accessed(self, project, user=None): """ Update projects last_accessed_by_current_user field. """ + if self.server_caps.version and self.server_caps.version < (5, 3, 17): + raise ShotgunError("update_project_last_accessed requires server version 5.3.17 or "\ + "higher, server is %s" % (self.server_caps.version,)) + # Find a page from the project page = self.find_one('Page', [['project','is',project], ['ui_category','is','project_overview']]) if not page: diff --git a/tests/test_api.py b/tests/test_api.py index 4ee9c2670..4fc819df2 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1561,6 +1561,9 @@ def test_humanuser_upload_thumbnail_for_version(self): class TestProjectLastAccessedByCurrentUser(base.LiveTestBase): # Ticket #24681 def test_logged_in_user(self): + if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 17): + return + sg = shotgun_api3.Shotgun(self.config.server_url, login=self.config.human_login, password=self.config.human_password, @@ -1578,6 +1581,9 @@ def test_logged_in_user(self): def test_pass_in_user(self): + if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 17): + return + sg = shotgun_api3.Shotgun(self.config.server_url, login=self.config.human_login, password=self.config.human_password, From d30b894e7fa658a5fcc54de40baa1f1a38df959d Mon Sep 17 00:00:00 2001 From: kbehrman Date: Wed, 28 May 2014 09:26:56 -0700 Subject: [PATCH 035/389] For #24681 update to work with sudo_as --- shotgun_api3/shotgun.py | 9 ++++++++- tests/test_api.py | 27 +++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 0f4f18f26..46d232f20 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1438,6 +1438,10 @@ def authenticate_human_user(self, user_login, user_password): def update_project_last_accessed(self, project, user=None): """ Update projects last_accessed_by_current_user field. + + :param project - a project entity hash + :param user - A human user entity hash. Optional if either login or sudo_as are used. + """ if self.server_caps.version and self.server_caps.version < (5, 3, 17): raise ShotgunError("update_project_last_accessed requires server version 5.3.17 or "\ @@ -1454,11 +1458,14 @@ def update_project_last_accessed(self, project, user=None): raise RuntimeError("Unable to find page for project %s" % str(project)) if not user: + # Try to use sudo as user if present + if self.config.sudo_as_login: + user = self.find_one('HumanUser', [['login', 'is', self.config.sudo_as_login]]) # Try to use login if present if self.config.user_login: user = self.find_one('HumanUser', [['login', 'is', self.config.user_login]]) if not user: - raise RuntimeError("No user supplied and unable to determine user from login") + raise RuntimeError("No user supplied and unable to determine user from login or sudo_as") self.create( 'PageHit', { 'page': page, 'user': user } ) diff --git a/tests/test_api.py b/tests/test_api.py index 4fc819df2..5a4180475 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1584,10 +1584,10 @@ def test_pass_in_user(self): if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 17): return - sg = shotgun_api3.Shotgun(self.config.server_url, - login=self.config.human_login, - password=self.config.human_password, - http_proxy=self.config.http_proxy) + sg = shotgun_api3.Shotgun( self.config.server_url, + login=self.config.human_login, + password=self.config.human_password, + http_proxy=self.config.http_proxy ) initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) @@ -1600,6 +1600,25 @@ def test_pass_in_user(self): if initial: assert(initial['last_accessed_by_current_user'] < current['last_accessed_by_current_user']) + def test_sudo_as_user(self): + if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 17): + return + + sg = shotgun_api3.Shotgun( self.config.server_url, + self.config.script_name, + self.config.api_key, + http_proxy=self.config.http_proxy, + sudo_as_login=self.config.human_login ) + + initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + + sg.update_project_last_accessed(self.project) + + current = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + self.assertNotEqual( initial, current ) + # it's possible initial is None + if initial: + assert(initial['last_accessed_by_current_user'] < current['last_accessed_by_current_user']) def _has_unicode(data): for k, v in data.items(): From d4416c0f6277f2b05853a615d24429e029b6df58 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Wed, 28 May 2014 09:54:40 -0700 Subject: [PATCH 036/389] For #24681 try to fix time based test --- tests/test_api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index 5a4180475..8f5457a4c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -8,6 +8,7 @@ import os import re from mock import patch, Mock, MagicMock +import time import unittest import urlparse @@ -1611,6 +1612,7 @@ def test_sudo_as_user(self): sudo_as_login=self.config.human_login ) initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + time.sleep(1) sg.update_project_last_accessed(self.project) From 88a5ab9f18f931275391c4e5cee2e0a79ccf0907 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Fri, 30 May 2014 15:13:42 -0700 Subject: [PATCH 037/389] For #24681 try to fix time based test --- tests/test_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_api.py b/tests/test_api.py index 8f5457a4c..dfecd7f6d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1591,6 +1591,7 @@ def test_pass_in_user(self): http_proxy=self.config.http_proxy ) initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) + time.sleep(1) # this instance of the api is not logged in as a user self.sg.update_project_last_accessed(self.project, user=self.human_user) From 363990b89f76e362add2322068f35b216c9057e1 Mon Sep 17 00:00:00 2001 From: Isaac Reuben Date: Sun, 1 Jun 2014 17:18:15 -0700 Subject: [PATCH 038/389] Fix formatting in changelog --- README.mdown | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.mdown b/README.mdown index 95ff7c93b..b0e194cf3 100644 --- a/README.mdown +++ b/README.mdown @@ -57,11 +57,13 @@ Integration and unit tests are provided. ## Changelog **v3.0.16 - 2014 May 23** - + Add flag to ignore entities from archived projects. - + Add support for differentiating between zero and None for number fields. - + Add ability to act as a different user. -**v3.0.15 - 2014 March 6** + + Add flag to ignore entities from archived projects. + + Add support for differentiating between zero and None for number fields. + + Add ability to act as a different user. + +**v3.0.15 - 2014 Mar 6** + + Fixed bug which allowed a value of None for password parameter in authenticate_human_user + Add follow, unfollow and followers methods + Added ability to login as human user From 2dcb1b863d8016ffb87b39e48499af44fb83bb9a Mon Sep 17 00:00:00 2001 From: Isaac Reuben Date: Wed, 11 Jun 2014 10:19:28 -0700 Subject: [PATCH 039/389] Delete README --- README | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 README diff --git a/README b/README deleted file mode 100644 index 46f643cab..000000000 --- a/README +++ /dev/null @@ -1,26 +0,0 @@ -# --------------------------------------------------------------------------------------------- -# Shotgun provides a simple Python-based API for accessing Shotgun and integrating with other tools. -# -# Maintained by: Shotgun Software (support@shotgunsoftware.com) -# --------------------------------------------------------------------------------------------- - -Documentation on the current supported API is available on the Shotgun Support website at -https://support.shotgunsoftware.com/forums/48807-developer-api-info - -Some useful direct links within this section are below: - -Introduction and Video Tour -https://support.shotgunsoftware.com/entries/38181-api-introduction-video-tour - -Method Reference -https://support.shotgunsoftware.com/entries/21668-reference-methods - -Data Type Reference -https://support.shotgunsoftware.com/entries/38362-reference-data-types - -Filter Syntax Reference -https://support.shotgunsoftware.com/entries/38359-reference-filter-syntax - - - - From 628badc31dafd849ba1dd5a88be195da52ef4aa6 Mon Sep 17 00:00:00 2001 From: Isaac Reuben Date: Wed, 11 Jun 2014 10:22:17 -0700 Subject: [PATCH 040/389] Update README.mdown --- README.mdown | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.mdown b/README.mdown index b0e194cf3..186216a37 100644 --- a/README.mdown +++ b/README.mdown @@ -2,14 +2,12 @@ Shotgun provides a simple Python-based API for accessing Shotgun and integrating with other tools. This is the official API that is maintained by Shotgun Software (support@shotgunsoftware.com) -## New Home - -[GitHub is the new official location](http://github.com/shotgunsoftware/python-api) for the latest Shotgun Python API. We will no longer be including it in our code tree that is deployed to your servers or posting it for download from our support site. So update your bookmarks! +The latest version can always be found at http://github.com/shotgunsoftware/python-api ## Minimum Requirements * Shotgun server v2.4.12 or higher. (Earlier builds of 2.4 will work, but have buggy support for float field types) -* Python v2.4 - v2.7. (We do have plans to eventually support Python 3) +* Python v2.4 - v2.7. ## High Performance Requirements @@ -34,7 +32,6 @@ To install a specific version of the package with `pip` (recommended), run the f If you're using pip with `requirements.txt`, add the following line: `git+git://github.com/shotgunsoftware/python-api.git` - ## Documentation Tutorials and detailed documentation about the Python API are available on the [Python API Wiki](https://github.com/shotgunsoftware/python-api/wiki). There is also some additional related documentation on the [Shotgun Support Website](https://support.shotgunsoftware.com/forums/48807-developer-api-info). Some useful direct links in each are below: From 5484c8ecf17b278021788a9f65a239bdde0a1d8b Mon Sep 17 00:00:00 2001 From: kbehrman Date: Tue, 3 Jun 2014 12:19:03 -0700 Subject: [PATCH 041/389] For #25579 fallback to newer version of mimetypes when needed --- shotgun_api3/lib/mimetypes.py | 588 ++++++++++++++++++++++++++++++++++ shotgun_api3/sg_24.py | 1 + shotgun_api3/sg_25.py | 1 + shotgun_api3/sg_26.py | 27 ++ shotgun_api3/shotgun.py | 12 +- 5 files changed, 627 insertions(+), 2 deletions(-) create mode 100644 shotgun_api3/lib/mimetypes.py create mode 100644 shotgun_api3/sg_26.py diff --git a/shotgun_api3/lib/mimetypes.py b/shotgun_api3/lib/mimetypes.py new file mode 100644 index 000000000..7f28b8965 --- /dev/null +++ b/shotgun_api3/lib/mimetypes.py @@ -0,0 +1,588 @@ +"""Guess the MIME type of a file. + +This module defines two useful functions: + +guess_type(url, strict=1) -- guess the MIME type and encoding of a URL. + +guess_extension(type, strict=1) -- guess the extension for a given MIME type. + +It also contains the following, for tuning the behavior: + +Data: + +knownfiles -- list of files to parse +inited -- flag set when init() has been called +suffix_map -- dictionary mapping suffixes to suffixes +encodings_map -- dictionary mapping suffixes to encodings +types_map -- dictionary mapping suffixes to types + +Functions: + +init([files]) -- parse a list of files, default knownfiles (on Windows, the + default values are taken from the registry) +read_mime_types(file) -- parse one file, return a dictionary or None +""" + +import os +import sys +import posixpath +import urllib +try: + import _winreg +except ImportError: + _winreg = None + +__all__ = [ + "guess_type","guess_extension","guess_all_extensions", + "add_type","read_mime_types","init" +] + +knownfiles = [ + "/etc/mime.types", + "/etc/httpd/mime.types", # Mac OS X + "/etc/httpd/conf/mime.types", # Apache + "/etc/apache/mime.types", # Apache 1 + "/etc/apache2/mime.types", # Apache 2 + "/usr/local/etc/httpd/conf/mime.types", + "/usr/local/lib/netscape/mime.types", + "/usr/local/etc/httpd/conf/mime.types", # Apache 1.2 + "/usr/local/etc/mime.types", # Apache 1.3 + ] + +inited = False +_db = None + + +class MimeTypes: + """MIME-types datastore. + + This datastore can handle information from mime.types-style files + and supports basic determination of MIME type from a filename or + URL, and can guess a reasonable extension given a MIME type. + """ + + def __init__(self, filenames=(), strict=True): + if not inited: + init() + self.encodings_map = encodings_map.copy() + self.suffix_map = suffix_map.copy() + self.types_map = ({}, {}) # dict for (non-strict, strict) + self.types_map_inv = ({}, {}) + for (ext, type) in types_map.items(): + self.add_type(type, ext, True) + for (ext, type) in common_types.items(): + self.add_type(type, ext, False) + for name in filenames: + self.read(name, strict) + + def add_type(self, type, ext, strict=True): + """Add a mapping between a type and an extension. + + When the extension is already known, the new + type will replace the old one. When the type + is already known the extension will be added + to the list of known extensions. + + If strict is true, information will be added to + list of standard types, else to the list of non-standard + types. + """ + self.types_map[strict][ext] = type + exts = self.types_map_inv[strict].setdefault(type, []) + if ext not in exts: + exts.append(ext) + + def guess_type(self, url, strict=True): + """Guess the type of a file based on its URL. + + Return value is a tuple (type, encoding) where type is None if + the type can't be guessed (no or unknown suffix) or a string + of the form type/subtype, usable for a MIME Content-type + header; and encoding is None for no encoding or the name of + the program used to encode (e.g. compress or gzip). The + mappings are table driven. Encoding suffixes are case + sensitive; type suffixes are first tried case sensitive, then + case insensitive. + + The suffixes .tgz, .taz and .tz (case sensitive!) are all + mapped to '.tar.gz'. (This is table-driven too, using the + dictionary suffix_map.) + + Optional `strict' argument when False adds a bunch of commonly found, + but non-standard types. + """ + scheme, url = urllib.splittype(url) + if scheme == 'data': + # syntax of data URLs: + # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data + # mediatype := [ type "/" subtype ] *( ";" parameter ) + # data := *urlchar + # parameter := attribute "=" value + # type/subtype defaults to "text/plain" + comma = url.find(',') + if comma < 0: + # bad data URL + return None, None + semi = url.find(';', 0, comma) + if semi >= 0: + type = url[:semi] + else: + type = url[:comma] + if '=' in type or '/' not in type: + type = 'text/plain' + return type, None # never compressed, so encoding is None + base, ext = posixpath.splitext(url) + while ext in self.suffix_map: + base, ext = posixpath.splitext(base + self.suffix_map[ext]) + if ext in self.encodings_map: + encoding = self.encodings_map[ext] + base, ext = posixpath.splitext(base) + else: + encoding = None + types_map = self.types_map[True] + if ext in types_map: + return types_map[ext], encoding + elif ext.lower() in types_map: + return types_map[ext.lower()], encoding + elif strict: + return None, encoding + types_map = self.types_map[False] + if ext in types_map: + return types_map[ext], encoding + elif ext.lower() in types_map: + return types_map[ext.lower()], encoding + else: + return None, encoding + + def guess_all_extensions(self, type, strict=True): + """Guess the extensions for a file based on its MIME type. + + Return value is a list of strings giving the possible filename + extensions, including the leading dot ('.'). The extension is not + guaranteed to have been associated with any particular data stream, + but would be mapped to the MIME type `type' by guess_type(). + + Optional `strict' argument when false adds a bunch of commonly found, + but non-standard types. + """ + type = type.lower() + extensions = self.types_map_inv[True].get(type, []) + if not strict: + for ext in self.types_map_inv[False].get(type, []): + if ext not in extensions: + extensions.append(ext) + return extensions + + def guess_extension(self, type, strict=True): + """Guess the extension for a file based on its MIME type. + + Return value is a string giving a filename extension, + including the leading dot ('.'). The extension is not + guaranteed to have been associated with any particular data + stream, but would be mapped to the MIME type `type' by + guess_type(). If no extension can be guessed for `type', None + is returned. + + Optional `strict' argument when false adds a bunch of commonly found, + but non-standard types. + """ + extensions = self.guess_all_extensions(type, strict) + if not extensions: + return None + return extensions[0] + + def read(self, filename, strict=True): + """ + Read a single mime.types-format file, specified by pathname. + + If strict is true, information will be added to + list of standard types, else to the list of non-standard + types. + """ + with open(filename) as fp: + self.readfp(fp, strict) + + def readfp(self, fp, strict=True): + """ + Read a single mime.types-format file. + + If strict is true, information will be added to + list of standard types, else to the list of non-standard + types. + """ + while 1: + line = fp.readline() + if not line: + break + words = line.split() + for i in range(len(words)): + if words[i][0] == '#': + del words[i:] + break + if not words: + continue + type, suffixes = words[0], words[1:] + for suff in suffixes: + self.add_type(type, '.' + suff, strict) + + def read_windows_registry(self, strict=True): + """ + Load the MIME types database from Windows registry. + + If strict is true, information will be added to + list of standard types, else to the list of non-standard + types. + """ + + # Windows only + if not _winreg: + return + + def enum_types(mimedb): + i = 0 + while True: + try: + yield _winreg.EnumKey(mimedb, i) + except EnvironmentError: + break + i += 1 + + with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr: + for subkeyname in enum_types(hkcr): + # Only check file extensions, not all possible classes + if not subkeyname.startswith("."): + continue + + with _winreg.OpenKey(hkcr, subkeyname) as subkey: + # If there is no "Content Type" value, or if it is not + # a simple string, simply skip + try: + mimetype, datatype = _winreg.QueryValueEx( + subkey, 'Content Type') + except EnvironmentError: + continue + if datatype != _winreg.REG_SZ: + continue + self.add_type(mimetype, subkeyname, strict) + +def guess_type(url, strict=True): + """Guess the type of a file based on its URL. + + Return value is a tuple (type, encoding) where type is None if the + type can't be guessed (no or unknown suffix) or a string of the + form type/subtype, usable for a MIME Content-type header; and + encoding is None for no encoding or the name of the program used + to encode (e.g. compress or gzip). The mappings are table + driven. Encoding suffixes are case sensitive; type suffixes are + first tried case sensitive, then case insensitive. + + The suffixes .tgz, .taz and .tz (case sensitive!) are all mapped + to ".tar.gz". (This is table-driven too, using the dictionary + suffix_map). + + Optional `strict' argument when false adds a bunch of commonly found, but + non-standard types. + """ + if _db is None: + init() + return _db.guess_type(url, strict) + + +def guess_all_extensions(type, strict=True): + """Guess the extensions for a file based on its MIME type. + + Return value is a list of strings giving the possible filename + extensions, including the leading dot ('.'). The extension is not + guaranteed to have been associated with any particular data + stream, but would be mapped to the MIME type `type' by + guess_type(). If no extension can be guessed for `type', None + is returned. + + Optional `strict' argument when false adds a bunch of commonly found, + but non-standard types. + """ + if _db is None: + init() + return _db.guess_all_extensions(type, strict) + +def guess_extension(type, strict=True): + """Guess the extension for a file based on its MIME type. + + Return value is a string giving a filename extension, including the + leading dot ('.'). The extension is not guaranteed to have been + associated with any particular data stream, but would be mapped to the + MIME type `type' by guess_type(). If no extension can be guessed for + `type', None is returned. + + Optional `strict' argument when false adds a bunch of commonly found, + but non-standard types. + """ + if _db is None: + init() + return _db.guess_extension(type, strict) + +def add_type(type, ext, strict=True): + """Add a mapping between a type and an extension. + + When the extension is already known, the new + type will replace the old one. When the type + is already known the extension will be added + to the list of known extensions. + + If strict is true, information will be added to + list of standard types, else to the list of non-standard + types. + """ + if _db is None: + init() + return _db.add_type(type, ext, strict) + + +def init(files=None): + global suffix_map, types_map, encodings_map, common_types + global inited, _db + inited = True # so that MimeTypes.__init__() doesn't call us again + db = MimeTypes() + if files is None: + if _winreg: + db.read_windows_registry() + files = knownfiles + for file in files: + if os.path.isfile(file): + db.read(file) + encodings_map = db.encodings_map + suffix_map = db.suffix_map + types_map = db.types_map[True] + common_types = db.types_map[False] + # Make the DB a global variable now that it is fully initialized + _db = db + + +def read_mime_types(file): + try: + f = open(file) + except IOError: + return None + with f: + db = MimeTypes() + db.readfp(f, True) + return db.types_map[True] + + +def _default_mime_types(): + global suffix_map + global encodings_map + global types_map + global common_types + + suffix_map = { + '.tgz': '.tar.gz', + '.taz': '.tar.gz', + '.tz': '.tar.gz', + '.tbz2': '.tar.bz2', + '.txz': '.tar.xz', + } + + encodings_map = { + '.gz': 'gzip', + '.Z': 'compress', + '.bz2': 'bzip2', + '.xz': 'xz', + } + + # Before adding new types, make sure they are either registered with IANA, + # at http://www.isi.edu/in-notes/iana/assignments/media-types + # or extensions, i.e. using the x- prefix + + # If you add to these, please keep them sorted! + types_map = { + '.a' : 'application/octet-stream', + '.ai' : 'application/postscript', + '.aif' : 'audio/x-aiff', + '.aifc' : 'audio/x-aiff', + '.aiff' : 'audio/x-aiff', + '.au' : 'audio/basic', + '.avi' : 'video/x-msvideo', + '.bat' : 'text/plain', + '.bcpio' : 'application/x-bcpio', + '.bin' : 'application/octet-stream', + '.bmp' : 'image/x-ms-bmp', + '.c' : 'text/plain', + # Duplicates :( + '.cdf' : 'application/x-cdf', + '.cdf' : 'application/x-netcdf', + '.cpio' : 'application/x-cpio', + '.csh' : 'application/x-csh', + '.css' : 'text/css', + '.dll' : 'application/octet-stream', + '.doc' : 'application/msword', + '.dot' : 'application/msword', + '.dvi' : 'application/x-dvi', + '.eml' : 'message/rfc822', + '.eps' : 'application/postscript', + '.etx' : 'text/x-setext', + '.exe' : 'application/octet-stream', + '.gif' : 'image/gif', + '.gtar' : 'application/x-gtar', + '.h' : 'text/plain', + '.hdf' : 'application/x-hdf', + '.htm' : 'text/html', + '.html' : 'text/html', + '.ico' : 'image/vnd.microsoft.icon', + '.ief' : 'image/ief', + '.jpe' : 'image/jpeg', + '.jpeg' : 'image/jpeg', + '.jpg' : 'image/jpeg', + '.js' : 'application/javascript', + '.ksh' : 'text/plain', + '.latex' : 'application/x-latex', + '.m1v' : 'video/mpeg', + '.man' : 'application/x-troff-man', + '.me' : 'application/x-troff-me', + '.mht' : 'message/rfc822', + '.mhtml' : 'message/rfc822', + '.mif' : 'application/x-mif', + '.mov' : 'video/quicktime', + '.movie' : 'video/x-sgi-movie', + '.mp2' : 'audio/mpeg', + '.mp3' : 'audio/mpeg', + '.mp4' : 'video/mp4', + '.mpa' : 'video/mpeg', + '.mpe' : 'video/mpeg', + '.mpeg' : 'video/mpeg', + '.mpg' : 'video/mpeg', + '.ms' : 'application/x-troff-ms', + '.nc' : 'application/x-netcdf', + '.nws' : 'message/rfc822', + '.o' : 'application/octet-stream', + '.obj' : 'application/octet-stream', + '.oda' : 'application/oda', + '.p12' : 'application/x-pkcs12', + '.p7c' : 'application/pkcs7-mime', + '.pbm' : 'image/x-portable-bitmap', + '.pdf' : 'application/pdf', + '.pfx' : 'application/x-pkcs12', + '.pgm' : 'image/x-portable-graymap', + '.pl' : 'text/plain', + '.png' : 'image/png', + '.pnm' : 'image/x-portable-anymap', + '.pot' : 'application/vnd.ms-powerpoint', + '.ppa' : 'application/vnd.ms-powerpoint', + '.ppm' : 'image/x-portable-pixmap', + '.pps' : 'application/vnd.ms-powerpoint', + '.ppt' : 'application/vnd.ms-powerpoint', + '.ps' : 'application/postscript', + '.pwz' : 'application/vnd.ms-powerpoint', + '.py' : 'text/x-python', + '.pyc' : 'application/x-python-code', + '.pyo' : 'application/x-python-code', + '.qt' : 'video/quicktime', + '.ra' : 'audio/x-pn-realaudio', + '.ram' : 'application/x-pn-realaudio', + '.ras' : 'image/x-cmu-raster', + '.rdf' : 'application/xml', + '.rgb' : 'image/x-rgb', + '.roff' : 'application/x-troff', + '.rtx' : 'text/richtext', + '.sgm' : 'text/x-sgml', + '.sgml' : 'text/x-sgml', + '.sh' : 'application/x-sh', + '.shar' : 'application/x-shar', + '.snd' : 'audio/basic', + '.so' : 'application/octet-stream', + '.src' : 'application/x-wais-source', + '.sv4cpio': 'application/x-sv4cpio', + '.sv4crc' : 'application/x-sv4crc', + '.swf' : 'application/x-shockwave-flash', + '.t' : 'application/x-troff', + '.tar' : 'application/x-tar', + '.tcl' : 'application/x-tcl', + '.tex' : 'application/x-tex', + '.texi' : 'application/x-texinfo', + '.texinfo': 'application/x-texinfo', + '.tif' : 'image/tiff', + '.tiff' : 'image/tiff', + '.tr' : 'application/x-troff', + '.tsv' : 'text/tab-separated-values', + '.txt' : 'text/plain', + '.ustar' : 'application/x-ustar', + '.vcf' : 'text/x-vcard', + '.wav' : 'audio/x-wav', + '.wiz' : 'application/msword', + '.wsdl' : 'application/xml', + '.xbm' : 'image/x-xbitmap', + '.xlb' : 'application/vnd.ms-excel', + # Duplicates :( + '.xls' : 'application/excel', + '.xls' : 'application/vnd.ms-excel', + '.xml' : 'text/xml', + '.xpdl' : 'application/xml', + '.xpm' : 'image/x-xpixmap', + '.xsl' : 'application/xml', + '.xwd' : 'image/x-xwindowdump', + '.zip' : 'application/zip', + } + + # These are non-standard types, commonly found in the wild. They will + # only match if strict=0 flag is given to the API methods. + + # Please sort these too + common_types = { + '.jpg' : 'image/jpg', + '.mid' : 'audio/midi', + '.midi': 'audio/midi', + '.pct' : 'image/pict', + '.pic' : 'image/pict', + '.pict': 'image/pict', + '.rtf' : 'application/rtf', + '.xul' : 'text/xul' + } + + +_default_mime_types() + + +if __name__ == '__main__': + import getopt + + USAGE = """\ +Usage: mimetypes.py [options] type + +Options: + --help / -h -- print this message and exit + --lenient / -l -- additionally search of some common, but non-standard + types. + --extension / -e -- guess extension instead of type + +More than one type argument may be given. +""" + + def usage(code, msg=''): + print USAGE + if msg: print msg + sys.exit(code) + + try: + opts, args = getopt.getopt(sys.argv[1:], 'hle', + ['help', 'lenient', 'extension']) + except getopt.error, msg: + usage(1, msg) + + strict = 1 + extension = 0 + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt in ('-l', '--lenient'): + strict = 0 + elif opt in ('-e', '--extension'): + extension = 1 + for gtype in args: + if extension: + guess = guess_extension(gtype, strict) + if not guess: print "I don't know anything about type", gtype + else: print guess + else: + guess, encoding = guess_type(gtype, strict) + if not guess: print "I don't know anything about type", gtype + else: print 'type:', guess, 'encoding:', encoding diff --git a/shotgun_api3/sg_24.py b/shotgun_api3/sg_24.py index fcfd3ff60..1abeebbea 100644 --- a/shotgun_api3/sg_24.py +++ b/shotgun_api3/sg_24.py @@ -5,6 +5,7 @@ from shotgun_api3.lib.httplib2 import Http, ProxyInfo, socks from shotgun_api3.lib.sgtimezone import SgTimezone from shotgun_api3.lib.xmlrpclib import Error, ProtocolError, ResponseError +import mimetypes as sg_mimetypes LOG = logging.getLogger("shotgun_api3") diff --git a/shotgun_api3/sg_25.py b/shotgun_api3/sg_25.py index 45f39f85c..bf8fe50a5 100644 --- a/shotgun_api3/sg_25.py +++ b/shotgun_api3/sg_25.py @@ -5,6 +5,7 @@ from .lib.httplib2 import Http, ProxyInfo, socks from .lib.sgtimezone import SgTimezone from .lib.xmlrpclib import Error, ProtocolError, ResponseError +import mimetypes as sg_mimetypes LOG = logging.getLogger("shotgun_api3") LOG.setLevel(logging.WARN) diff --git a/shotgun_api3/sg_26.py b/shotgun_api3/sg_26.py new file mode 100644 index 000000000..368bb1f13 --- /dev/null +++ b/shotgun_api3/sg_26.py @@ -0,0 +1,27 @@ +import sys +import os +import logging + +from .lib.httplib2 import Http, ProxyInfo, socks +from .lib.sgtimezone import SgTimezone +from .lib.xmlrpclib import Error, ProtocolError, ResponseError +from .lib import mimetypes as sg_mimetypes + + +LOG = logging.getLogger("shotgun_api3") +LOG.setLevel(logging.WARN) + +try: + import simplejson as json +except ImportError: + LOG.debug("simplejson not found, dropping back to json") + try: + import json as json + except ImportError: + LOG.debug("json not found, dropping back to embedded simplejson") + # We need to munge the path so that the absolute imports in simplejson will work. + dir_path = os.path.dirname(__file__) + lib_path = os.path.join(dir_path, 'lib') + sys.path.append(lib_path) + from .lib import simplejson as json + sys.path.pop() diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 46d232f20..bead6252c 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -52,7 +52,9 @@ import shutil # used for attachment download # use relative import for versions >=2.5 and package import for python versions <2.5 -if (sys.version_info[0] > 2) or (sys.version_info[0] == 2 and sys.version_info[1] >= 5): +if (sys.version_info[0] > 2) or (sys.version_info[0] == 2 and sys.version_info[1] >= 6): + from sg_26 import * +elif (sys.version_info[0] > 2) or (sys.version_info[0] == 2 and sys.version_info[1] >= 5): from sg_25 import * else: from sg_24 import * @@ -2024,7 +2026,13 @@ def encode(self, params, files, boundary=None, buffer=None): buffer.write('\r\n\r\n%s\r\n' % value) for (key, fd) in files: filename = fd.name.split('/')[-1] - content_type = mimetypes.guess_type(filename)[0] + try: + content_type = mimetypes.guess_type(filename)[0] + except UnicodeDecodeError: + # Ticket #25579 python bug on windows with unicode + # Use patched version of mimetypes + content_type = sg_mimetypes.guess_type(filename)[0] + content_type = content_type or 'application/octet-stream' file_size = os.fstat(fd.fileno())[stat.ST_SIZE] buffer.write('--%s\r\n' % boundary) From 41677dc83db9e3ca16a9bc3f9f38b168cb503d47 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Wed, 11 Jun 2014 12:05:19 -0700 Subject: [PATCH 042/389] For #25579 check for unicode error during import of mimetypes module --- shotgun_api3/sg_24.py | 2 +- shotgun_api3/sg_25.py | 2 +- shotgun_api3/sg_26.py | 10 +++++++++- shotgun_api3/shotgun.py | 15 +++++---------- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/shotgun_api3/sg_24.py b/shotgun_api3/sg_24.py index 1abeebbea..ea584ec79 100644 --- a/shotgun_api3/sg_24.py +++ b/shotgun_api3/sg_24.py @@ -5,7 +5,7 @@ from shotgun_api3.lib.httplib2 import Http, ProxyInfo, socks from shotgun_api3.lib.sgtimezone import SgTimezone from shotgun_api3.lib.xmlrpclib import Error, ProtocolError, ResponseError -import mimetypes as sg_mimetypes +import mimetypes # used for attachment upload LOG = logging.getLogger("shotgun_api3") diff --git a/shotgun_api3/sg_25.py b/shotgun_api3/sg_25.py index bf8fe50a5..3cd4a0d5b 100644 --- a/shotgun_api3/sg_25.py +++ b/shotgun_api3/sg_25.py @@ -5,7 +5,7 @@ from .lib.httplib2 import Http, ProxyInfo, socks from .lib.sgtimezone import SgTimezone from .lib.xmlrpclib import Error, ProtocolError, ResponseError -import mimetypes as sg_mimetypes +import mimetypes # used for attachment upload LOG = logging.getLogger("shotgun_api3") LOG.setLevel(logging.WARN) diff --git a/shotgun_api3/sg_26.py b/shotgun_api3/sg_26.py index 368bb1f13..9a6b0e1a9 100644 --- a/shotgun_api3/sg_26.py +++ b/shotgun_api3/sg_26.py @@ -5,7 +5,6 @@ from .lib.httplib2 import Http, ProxyInfo, socks from .lib.sgtimezone import SgTimezone from .lib.xmlrpclib import Error, ProtocolError, ResponseError -from .lib import mimetypes as sg_mimetypes LOG = logging.getLogger("shotgun_api3") @@ -25,3 +24,12 @@ sys.path.append(lib_path) from .lib import simplejson as json sys.path.pop() + + +import mimetypes # used for attachment upload +try: + mimetypes.add_type('video/webm','.webm') # try adding to test for unicode error +except UnicodeDecodeError: + # Ticket #25579 python bug on windows with unicode + # Use patched version of mimetypes + from .lib import mimetypes as mimetypes diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index bead6252c..2a7b89606 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -36,9 +36,6 @@ import datetime import logging import mimetools # used for attachment upload -import mimetypes # used for attachment upload -mimetypes.add_type('video/webm','.webm') # webm and mp4 seem to be missing -mimetypes.add_type('video/mp4', '.mp4') # from some OS/distros import os import re import copy @@ -59,6 +56,10 @@ else: from sg_24 import * +# mimetypes imported in version specific imports +mimetypes.add_type('video/webm','.webm') # webm and mp4 seem to be missing +mimetypes.add_type('video/mp4', '.mp4') # from some OS/distros + LOG = logging.getLogger("shotgun_api3") LOG.setLevel(logging.WARN) @@ -2026,13 +2027,7 @@ def encode(self, params, files, boundary=None, buffer=None): buffer.write('\r\n\r\n%s\r\n' % value) for (key, fd) in files: filename = fd.name.split('/')[-1] - try: - content_type = mimetypes.guess_type(filename)[0] - except UnicodeDecodeError: - # Ticket #25579 python bug on windows with unicode - # Use patched version of mimetypes - content_type = sg_mimetypes.guess_type(filename)[0] - + content_type = mimetypes.guess_type(filename)[0] content_type = content_type or 'application/octet-stream' file_size = os.fstat(fd.fileno())[stat.ST_SIZE] buffer.write('--%s\r\n' % boundary) From 0bd7e9391463acca6d64f72034aa38c29e30013d Mon Sep 17 00:00:00 2001 From: Brandon Ashworth Date: Thu, 12 Jun 2014 11:24:25 -0700 Subject: [PATCH 043/389] Renamed README.mdown to README --- README.mdown => README | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README.mdown => README (100%) diff --git a/README.mdown b/README similarity index 100% rename from README.mdown rename to README From 3b55e3b9ca0e53fc160bdff380f749fc9d10c0f9 Mon Sep 17 00:00:00 2001 From: Brandon Ashworth Date: Thu, 12 Jun 2014 11:25:39 -0700 Subject: [PATCH 044/389] Renamed README to README.md --- README => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README => README.md (100%) diff --git a/README b/README.md similarity index 100% rename from README rename to README.md From 8252cc96395e1f401a091ecb536cea117159f424 Mon Sep 17 00:00:00 2001 From: Brandon Ashworth Date: Thu, 12 Jun 2014 11:26:42 -0700 Subject: [PATCH 045/389] Fixed loading of README.md --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ff0bf870b..eaca7020c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ import sys from setuptools import setup, find_packages -f = open('README') +f = open('README.md') readme = f.read().strip() f = open('LICENSE') From 8d6dd3784c01453e4ba0d4b7bbc3dbf450fae3c7 Mon Sep 17 00:00:00 2001 From: kbehrman Date: Mon, 16 Jun 2014 09:22:20 -0500 Subject: [PATCH 046/389] For #25648 pull out work now done server-side --- shotgun_api3/shotgun.py | 23 ++++++++--------------- tests/test_api.py | 6 +++--- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 46d232f20..6b7a64c90 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1443,20 +1443,10 @@ def update_project_last_accessed(self, project, user=None): :param user - A human user entity hash. Optional if either login or sudo_as are used. """ - if self.server_caps.version and self.server_caps.version < (5, 3, 17): - raise ShotgunError("update_project_last_accessed requires server version 5.3.17 or "\ + if self.server_caps.version and self.server_caps.version < (5, 3, 20): + raise ShotgunError("update_project_last_accessed requires server version 5.3.20 or "\ "higher, server is %s" % (self.server_caps.version,)) - # Find a page from the project - page = self.find_one('Page', [['project','is',project], ['ui_category','is','project_overview']]) - if not page: - # There should be a project overview page page for a live project, but if there is not, - # another page from the project will work. - page = self.find_one('Page', [['project','is',project]]) - - if not page: - raise RuntimeError("Unable to find page for project %s" % str(project)) - if not user: # Try to use sudo as user if present if self.config.sudo_as_login: @@ -1464,10 +1454,13 @@ def update_project_last_accessed(self, project, user=None): # Try to use login if present if self.config.user_login: user = self.find_one('HumanUser', [['login', 'is', self.config.user_login]]) - if not user: - raise RuntimeError("No user supplied and unable to determine user from login or sudo_as") - self.create( 'PageHit', { 'page': page, 'user': user } ) + params = { "project_id": project['id'], } + if user: + params['user_id'] = user['id'] + + record = self._call_rpc("update_project_last_accessed_by_current_user", params) + result = self._parse_records(record)[0] def _get_session_token(self): diff --git a/tests/test_api.py b/tests/test_api.py index dfecd7f6d..a360e2ec9 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1562,7 +1562,7 @@ def test_humanuser_upload_thumbnail_for_version(self): class TestProjectLastAccessedByCurrentUser(base.LiveTestBase): # Ticket #24681 def test_logged_in_user(self): - if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 17): + if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 20): return sg = shotgun_api3.Shotgun(self.config.server_url, @@ -1582,7 +1582,7 @@ def test_logged_in_user(self): def test_pass_in_user(self): - if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 17): + if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 20): return sg = shotgun_api3.Shotgun( self.config.server_url, @@ -1603,7 +1603,7 @@ def test_pass_in_user(self): assert(initial['last_accessed_by_current_user'] < current['last_accessed_by_current_user']) def test_sudo_as_user(self): - if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 17): + if self.sg.server_caps.version and self.sg.server_caps.version < (5, 3, 20): return sg = shotgun_api3.Shotgun( self.config.server_url, From bdab3c3acd791308841aea838e3fb4d372f42e73 Mon Sep 17 00:00:00 2001 From: KP Date: Fri, 27 Jun 2014 00:27:50 -0500 Subject: [PATCH 047/389] for #25762: Add platform and python version info to user-agent --- shotgun_api3/shotgun.py | 16 ++++++++++++---- tests/test_client.py | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 8f19c80d4..a560bab73 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -323,7 +323,6 @@ def __init__(self, self.config.api_path = urlparse.urljoin(urlparse.urljoin( api_base or "/", self.config.api_ver + "/"), "json") - self.reset_user_agent() # if the service contains user information strip it out # copied from the xmlrpclib which turned the user:password into @@ -359,9 +358,12 @@ def __init__(self, self._json_loads = self._json_loads_ascii self.client_caps = ClientCapabilities() + # this relies on self.client_caps being set first + self.reset_user_agent() + self._server_caps = None - #test to ensure the the server supports the json API - #call to server will only be made once and will raise error + # test to ensure the the server supports the json API + # call to server will only be made once and will raise error if connect: self.server_caps @@ -1065,8 +1067,14 @@ def add_user_agent(self, agent): def reset_user_agent(self): """Reset user agent to the default + + Eg. shotgun-json (3.0.17); Python 2.6 (Mac) """ - self._user_agents = ["shotgun-json (%s)" % __version__] + ua_platform = "Unknown" + if self.client_caps.platform is not None: + ua_platform = self.client_caps.platform.capitalize() + self._user_agents = ["shotgun-json (%s)" % __version__, + "Python %s (%s)" % (self.client_caps.py_version, ua_platform)] def set_session_uuid(self, session_uuid): """Sets the browser session_uuid for this API session. diff --git a/tests/test_client.py b/tests/test_client.py index 23bdf97ec..7460b5970 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -157,9 +157,13 @@ def test_user_agent(self): """User-Agent passed to server""" # test default user agent self.sg.info() + client_caps = self.sg.client_caps args, _ = self.sg._http_request.call_args (_, _, _, headers) = args - expected = "shotgun-json (%s)" % api.__version__ + expected = "shotgun-json (%s); Python %s (%s)" % (api.__version__, + client_caps.py_version, + client_caps.platform.capitalize() + ) self.assertEqual(expected, headers.get("user-agent")) # test adding to user agent @@ -167,7 +171,11 @@ def test_user_agent(self): self.sg.info() args, _ = self.sg._http_request.call_args (_, _, _, headers) = args - expected = "shotgun-json (%s); test-agent" % api.__version__ + expected = "shotgun-json (%s); Python %s (%s); test-agent" % ( + api.__version__, + client_caps.py_version, + client_caps.platform.capitalize() + ) self.assertEqual(expected, headers.get("user-agent")) # test resetting user agent @@ -175,7 +183,10 @@ def test_user_agent(self): self.sg.info() args, _ = self.sg._http_request.call_args (_, _, _, headers) = args - expected = "shotgun-json (%s)" % api.__version__ + expected = "shotgun-json (%s); Python %s (%s)" % (api.__version__, + client_caps.py_version, + client_caps.platform.capitalize(), + ) self.assertEqual(expected, headers.get("user-agent")) def test_connect_close(self): From cf72c73fcf10f9a1c7b26fcb7364826bae1c4262 Mon Sep 17 00:00:00 2001 From: KP Date: Wed, 9 Jul 2014 23:01:57 -0500 Subject: [PATCH 048/389] packaging for v3.0.17 release --- README.md | 8 +++++++- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 186216a37..50b97f64e 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,12 @@ Integration and unit tests are provided. ## Changelog +**v3.0.17 - 2014 Jul 10** + + + Add ability to update last_accessed_by_current_user on Project. + + Add workaround for bug in Python 2.7 mimetypes library on Windows (http://bugs.python.org/issue9291) + + Add platform and Python version to user-agent (eg. "shotgun-json (3.0.17); Python 2.7 (Mac)") + **v3.0.16 - 2014 May 23** + Add flag to ignore entities from archived projects. @@ -66,7 +72,7 @@ Integration and unit tests are provided. + Added ability to login as human user + Ensure that webm/mp4 mime types are always available + Updated link to video tour in README - + Fixes and update to various tests + + Fixes and updates to various tests **v3.0.14 - 2013 Jun 26** diff --git a/setup.py b/setup.py index eaca7020c..b4c8b2fc6 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.16', + version='3.0.17', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a560bab73..dbe0c41fb 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -75,7 +75,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.17.dev" +__version__ = "3.0.17" # ---------------------------------------------------------------------------- # Errors From ebb8f0bb6e970043e22b8240df3aee2834cfdda2 Mon Sep 17 00:00:00 2001 From: KP Date: Wed, 9 Jul 2014 23:05:24 -0500 Subject: [PATCH 049/389] bump version to v3.0.18.dev --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index dbe0c41fb..67a10ec60 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -75,7 +75,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.17" +__version__ = "3.0.18.dev" # ---------------------------------------------------------------------------- # Errors From 70c09ef44103d7283161186cfabbb7c3404c9c60 Mon Sep 17 00:00:00 2001 From: Dan Allum Date: Wed, 21 Jan 2015 11:17:45 +0000 Subject: [PATCH 050/389] Update Copyright date Update Copyright date --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 67a10ec60..4af9729d0 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1,7 +1,7 @@ #!/usr/bin/env python ''' ----------------------------------------------------------------------------- - Copyright (c) 2009-2011, Shotgun Software Inc + Copyright (c) 2009-2015, Shotgun Software Inc Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From c60ebd2335d3651166d8fd4946082d842e9861a0 Mon Sep 17 00:00:00 2001 From: colinwithers Date: Wed, 25 Feb 2015 15:10:18 -0500 Subject: [PATCH 051/389] For #27732 Fix for the schema_field_create test. --- tests/test_api_long.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_api_long.py b/tests/test_api_long.py index 8f9ccc872..2938a28a1 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -4,6 +4,7 @@ """ import base +import random class TestShotgunApiLong(base.LiveTestBase): @@ -70,10 +71,21 @@ def test_schema(self): self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) self.assertTrue("user" in schema) + + # An explantion is in order here. the field code that is created in shotgun is based on the human display name + # that is provided , so for example "Money Count" would generate the field code 'sg_monkey_count' . The field + # that is created in this test is retired at the end of the test but when this test is run again against + # the same database ( which happens on our Continous Integration server ) trying to create a new field + # called "Monkey Count" will now fail due to the new Delete Field Forever features we have added to shotgun + # since there will a retired field called sg_monkey_count. The old behavior was to go ahead and create a new + # "Monkey Count" field with a field code with an incremented number of the end like sg_monkey_count_1. The new + # behavior is to raise an error in hopes the user will go into the UI and delete the old retired field forever. + + # make a the name of the field somewhat unique + human_field_name = "Monkey " + str(random.getrandbits(24)) properties = { "description" : "How many monkeys were needed" } - new_field_name = self.sg.schema_field_create("Version", "number", - "Monkey Count", + new_field_name = self.sg.schema_field_create("Version", "number", human_field_name, properties=properties) properties = {"description" : "How many monkeys turned up"} From a1b0562d63c32d27f70c984db80ab80aca06855a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Tue, 27 Jan 2015 18:33:35 -0500 Subject: [PATCH 052/389] For #27860, update the python API to support project customization - updated schema_.*read methods for project argument - add new unit tests to validate querying per project - updated README - updated date in changelog --- README.md | 4 +++ setup.py | 2 +- shotgun_api3/shotgun.py | 30 +++++++++++++---- tests/test_api_long.py | 72 ++++++++++++++++++++++++++++------------- 4 files changed, 79 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 50b97f64e..2ef250b45 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.18 - 2015 Mar 11 + + + Add ability to query the per-project visibility status for entities, fields and statuses. (requires Shotgun server >= v5.4.4) + **v3.0.17 - 2014 Jul 10** + Add ability to update last_accessed_by_current_user on Project. diff --git a/setup.py b/setup.py index b4c8b2fc6..3871c16bf 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.17', + version='3.0.18', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 4af9729d0..1ae72d751 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -945,23 +945,39 @@ def followers(self, entity): return self._call_rpc('followers', params) - def schema_entity_read(self): + def schema_entity_read(self, project_entity=None): """Gets all active entities defined in the schema. :returns: dict of Entity Type to dict containing the display name. """ - return self._call_rpc("schema_entity_read", None) + params = {} + + if project_entity: + params["project"] = project_entity + + if params: + return self._call_rpc("schema_entity_read", params) + else: + return self._call_rpc("schema_entity_read", None) - def schema_read(self): + def schema_read(self, project_entity=None): """Gets the schema for all fields in all entities. :returns: nested dicts """ - return self._call_rpc("schema_read", None) + params = {} - def schema_field_read(self, entity_type, field_name=None): + if project_entity: + params["project"] = project_entity + + if params: + return self._call_rpc("schema_read", params) + else: + return self._call_rpc("schema_read", None) + + def schema_field_read(self, entity_type, field_name=None, project_entity=None): """Gets all schema for fields in the specified entity_type or one field. @@ -976,10 +992,12 @@ def schema_field_read(self, entity_type, field_name=None): """ params = { - "type" : entity_type, + "type": entity_type, } if field_name: params["field_name"] = field_name + if project_entity: + params["project"] = project_entity return self._call_rpc("schema_field_read", params) diff --git a/tests/test_api_long.py b/tests/test_api_long.py index 2938a28a1..731bc5af6 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -6,8 +6,9 @@ import base import random + class TestShotgunApiLong(base.LiveTestBase): - + def test_automated_find(self): """Called find for each entity type and read all fields""" all_entities = self.sg.schema_entity_read().keys() @@ -25,36 +26,35 @@ def test_automated_find(self): if not fields: print "No fields for %s skipping" % (entity_type,) continue - - #trying to use some different code paths to the other find test - #TODO for our test project, we haven't populated these entities.... + + # trying to use some different code paths to the other find test + # TODO for our test project, we haven't populated these entities.... order = [{'field_name': fields.keys()[0], 'direction': direction}] if "project" in fields: filters = [['project', 'is', self.project]] else: filters = [] - records = self.sg.find(entity_type, filters, fields=fields.keys(), + records = self.sg.find(entity_type, filters, fields=fields.keys(), order=order, filter_operator=filter_operator, limit=limit, page=page) - + self.assertTrue(isinstance(records, list)) - + if filter_operator == "all": filter_operator = "any" - else: + else: filter_operator = "all" if direction == "desc": direction = "asc" - else: + else: direction = "desc" limit = (limit % 5) + 1 page = (page % 3) + 1 - def test_schema(self): """Called schema functions""" - + schema = self.sg.schema_entity_read() self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) @@ -62,20 +62,20 @@ def test_schema(self): schema = self.sg.schema_read() self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) - + schema = self.sg.schema_field_read("Version") self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) - + schema = self.sg.schema_field_read("Version", field_name="user") self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) self.assertTrue("user" in schema) - # An explantion is in order here. the field code that is created in shotgun is based on the human display name + # An explanation is in order here. the field code that is created in shotgun is based on the human display name # that is provided , so for example "Money Count" would generate the field code 'sg_monkey_count' . The field # that is created in this test is retired at the end of the test but when this test is run again against - # the same database ( which happens on our Continous Integration server ) trying to create a new field + # the same database ( which happens on our Continuous Integration server ) trying to create a new field # called "Monkey Count" will now fail due to the new Delete Field Forever features we have added to shotgun # since there will a retired field called sg_monkey_count. The old behavior was to go ahead and create a new # "Monkey Count" field with a field code with an incremented number of the end like sg_monkey_count_1. The new @@ -87,15 +87,43 @@ def test_schema(self): properties = { "description" : "How many monkeys were needed" } new_field_name = self.sg.schema_field_create("Version", "number", human_field_name, properties=properties) - - properties = {"description" : "How many monkeys turned up"} + + properties = {"description": "How many monkeys turned up"} ret_val = self.sg.schema_field_update("Version", - new_field_name, - properties) + new_field_name, + properties) self.assertTrue(ret_val) - + ret_val = self.sg.schema_field_delete("Version", new_field_name) self.assertTrue(ret_val) - -if __name__ == '__main__': + + def test_schema_with_project(self): + """Called schema functions""" + + project_entity = {'type': 'Project', 'id': 0} + schema = self.sg.schema_entity_read(project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('Project' in schema) + self.assertTrue('visible' in schema['Project']) + + schema = self.sg.schema_read(project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('Version' in schema) + + schema = self.sg.schema_field_read('Version', project_entity=project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('user' in schema) + self.assertTrue('visible' in schema['user']) + + schema = self.sg.schema_field_read('Version', 'user', project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('user' in schema) + self.assertTrue('visible' in schema['user']) + + +if __name__ == '__main__': base.unittest.main() From b372e1716aab9ddd3a891fa7e99e9f8fc0044052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Wed, 11 Mar 2015 11:42:45 -0400 Subject: [PATCH 053/389] Added doctring for the project_entity parameter --- shotgun_api3/shotgun.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 1ae72d751..5f68cfa17 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -948,6 +948,10 @@ def followers(self, entity): def schema_entity_read(self, project_entity=None): """Gets all active entities defined in the schema. + :param dict project_entity: Optional, if set, each field's visibility is reported accordingly + to the specified project's current visibility settings. + If None, all fields are reported as visible. + :returns: dict of Entity Type to dict containing the display name. """ @@ -964,6 +968,10 @@ def schema_entity_read(self, project_entity=None): def schema_read(self, project_entity=None): """Gets the schema for all fields in all entities. + :param dict project_entity: Optional, if set, each field's visibility is reported accordingly + to the specified project's current visibility settings. + If None, all fields are reported as visible. + :returns: nested dicts """ @@ -988,6 +996,10 @@ def schema_field_read(self, entity_type, field_name=None, project_entity=None): definition for. If not supplied all fields for the entity type are returned. + :param dict project_entity: Optional, if set, each field's visibility is reported accordingly + to the specified project's current visibility settings. + If None, all fields are reported as visible. + :returns: dict of field name to nested dicts which describe the field """ From 0dfb672600c21363c30ea5839e8bc398af2db191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Wed, 11 Mar 2015 11:46:26 -0400 Subject: [PATCH 054/389] Fixed indenting --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 5f68cfa17..11898fab3 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -958,7 +958,7 @@ def schema_entity_read(self, project_entity=None): params = {} if project_entity: - params["project"] = project_entity + params["project"] = project_entity if params: return self._call_rpc("schema_entity_read", params) From b4615c53f631fd47ee5e23c4dd7f11d7aa25f183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Wed, 11 Mar 2015 13:48:24 -0400 Subject: [PATCH 055/389] Test that visible is not in the reported keys --- tests/test_api_long.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_api_long.py b/tests/test_api_long.py index 731bc5af6..bab94af67 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -111,6 +111,7 @@ def test_schema_with_project(self): self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) self.assertTrue('Version' in schema) + self.assertFalse('visible' in schema.keys()) schema = self.sg.schema_field_read('Version', project_entity=project_entity) self.assertTrue(schema, dict) From 3a06ab70d4cd041548edfff8ccd58a7a2166c972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Fri, 13 Mar 2015 11:29:14 -0400 Subject: [PATCH 056/389] Adjusted release date, bumped version. --- README.md | 2 +- shotgun_api3/shotgun.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2ef250b45..9f4741877 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Integration and unit tests are provided. ## Changelog -**v3.0.18 - 2015 Mar 11 +**v3.0.18 - 2015 Mar 13** + Add ability to query the per-project visibility status for entities, fields and statuses. (requires Shotgun server >= v5.4.4) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 11898fab3..a540a67cb 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -75,7 +75,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.18.dev" +__version__ = "3.0.18" # ---------------------------------------------------------------------------- # Errors From 7c5625bddaf63b927b0a278c0fde67be2427f25d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Fri, 13 Mar 2015 14:25:04 -0400 Subject: [PATCH 057/389] Bump to 3.0.19.dev --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a540a67cb..cbcc7feb8 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -75,7 +75,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.18" +__version__ = "3.0.19.dev" # ---------------------------------------------------------------------------- # Errors From e5387f38cf14ec3c0253b8422d0db33fc235ba69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Wed, 18 Mar 2015 17:49:22 +0000 Subject: [PATCH 058/389] For #28019, support for session based execution and some minor tweaks. A collection of security related changes, mostly from #77. Here's a summary of the changes: - Ability to create a sg api from a session token. This allows a user to instantiate a shotgun API given a session token produced by the sg.get_session_token() method. - Added a sg.get_session_token() method to generate session tokens. - Added a new AuthenticationFault exception type (deriving from Fault and backwards compatible) to indicate when a connection fails due to authentication. - In the interest of API symmetry, added sg.config.raw_http_proxy which contains the same raw proxy string that is passed into the API constructor. This is handy if you need to create an sg API instance based on an existing instance, and want to make sure that the same proxy settings are used. - To make it easy to set up your own httplib2 based connection to Shotgun (sometimes useful), added an sg.config.proxy_handler which represents the proxy handler that is used by Shotgun when it connects via httplib2. Closes #81. --- shotgun_api3/__init__.py | 2 +- shotgun_api3/shotgun.py | 104 ++++++++++++++++++++++++++++----------- tests/base.py | 22 +++++++++ tests/test_api.py | 71 ++++++++++++++++++++++++-- 4 files changed, 165 insertions(+), 34 deletions(-) diff --git a/shotgun_api3/__init__.py b/shotgun_api3/__init__.py index ef9d6b6b2..dc912311e 100644 --- a/shotgun_api3/__init__.py +++ b/shotgun_api3/__init__.py @@ -1,4 +1,4 @@ from shotgun import (Shotgun, ShotgunError, ShotgunFileDownloadError, Fault, - ProtocolError, ResponseError, Error, __version__) + AuthenticationFault, ProtocolError, ResponseError, Error, __version__) from shotgun import SG_TIMEZONE as sg_timezone diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index cbcc7feb8..3b6052cd9 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -63,6 +63,7 @@ LOG = logging.getLogger("shotgun_api3") LOG.setLevel(logging.WARN) + SG_TIMEZONE = SgTimezone() @@ -92,6 +93,10 @@ class Fault(ShotgunError): """Exception when server side exception detected.""" pass +class AuthenticationFault(Fault): + """Exception when the server side reports an error related to authentication""" + pass + # ---------------------------------------------------------------------------- # API @@ -209,6 +214,15 @@ def __init__(self): self.scheme = None self.server = None self.api_path = None + # The raw_http_proxy reflects the exact string passed in + # to the Shotgun constructor. This can be useful if you + # need to construct a Shotgun API instance based on + # another Shotgun API instance. + self.raw_http_proxy = None + # if a proxy server is being used, the proxy_handler + # below will contain a urllib2.ProxyHandler instance + # which can be used whenever a request needs to be made. + self.proxy_handler = None self.proxy_server = None self.proxy_port = 8080 self.proxy_user = None @@ -217,6 +231,7 @@ def __init__(self): self.authorization = None self.no_ssl_validation = False + class Shotgun(object): """Shotgun Client Connection""" @@ -237,10 +252,11 @@ def __init__(self, http_proxy=None, ensure_ascii=True, connect=True, - ca_certs=None, + ca_certs=None, login=None, password=None, - sudo_as_login=None): + sudo_as_login=None, + session_token=None): """Initialises a new instance of the Shotgun client. :param base_url: http or https url to the shotgun server. @@ -263,9 +279,9 @@ def __init__(self, form [username:pass@]proxy.com[:8080] :param connect: If True, connect to the server. Only used for testing. - - :param ca_certs: The path to the SSL certificate file. Useful for users - who would like to package their application into an executable. + + :param ca_certs: The path to the SSL certificate file. Useful for users + who would like to package their application into an executable. :param login: The login to use to authenticate to the server. If login is provided, then password must be as well and neither script_name nor @@ -279,9 +295,21 @@ def __init__(self, be applied to all actions and who will be logged as the user performing all actions. Note that logged events will have an additional extra meta-data parameter 'sudo_actual_user' indicating the script or user that actually authenticated. + + :param session_token: The session token to use to authenticate to the server. This + can be used as an alternative to authenticating with a script user or regular user. + You retrieve the session token by running the get_session_token() method. """ # verify authentication arguments + if session_token is not None: + if script_name is not None or api_key is not None: + raise ValueError("cannot provide both session_token " + "and script_name/api_key") + if login is not None or password is not None: + raise ValueError("cannot provide both session_token " + "and login/password") + if login is not None or password is not None: if script_name is not None or api_key is not None: raise ValueError("cannot provide both login/password " @@ -298,19 +326,20 @@ def __init__(self, raise ValueError("script_name provided without api_key") # Can't use 'all' with python 2.4 - if len([x for x in [script_name, api_key, login, password] if x]) == 0: + if len([x for x in [session_token, script_name, api_key, login, password] if x]) == 0: if connect: - raise ValueError("must provide either login/password " - "or script_name/api_key") + raise ValueError("must provide login/password, session_token or script_name/api_key") self.config = _Config() self.config.api_key = api_key self.config.script_name = script_name self.config.user_login = login self.config.user_password = password + self.config.session_token = session_token self.config.sudo_as_login = sudo_as_login self.config.convert_datetimes_to_utc = convert_datetimes_to_utc self.config.no_ssl_validation = NO_SSL_VALIDATION + self.config.raw_http_proxy = http_proxy self._connection = None self.__ca_certs = ca_certs @@ -353,6 +382,15 @@ def __init__(self, ". If no port is specified, a default of %d will be "\ "used." % (http_proxy, self.config.proxy_port)) + # now populate self.config.proxy_handler + if self.config.proxy_user and self.config.proxy_pass: + auth_string = "%s:%s@" % (self.config.proxy_user, self.config.proxy_pass) + else: + auth_string = "" + proxy_addr = "http://%s%s:%d" % (auth_string, self.config.proxy_server, self.config.proxy_port) + self.config.proxy_handler = urllib2.ProxyHandler({self.config.scheme : proxy_addr}) + + if ensure_ascii: self._json_loads = self._json_loads_ascii @@ -1389,7 +1427,7 @@ def set_up_auth_cookie(self): """Sets up urllib2 with a cookie for authentication on the Shotgun instance. """ - sid = self._get_session_token() + sid = self.get_session_token() cj = cookielib.LWPCookieJar() c = cookielib.Cookie('0', '_session_id', sid, None, False, self.config.server, False, False, "/", True, False, None, True, @@ -1503,10 +1541,13 @@ def update_project_last_accessed(self, project, user=None): record = self._call_rpc("update_project_last_accessed_by_current_user", params) result = self._parse_records(record)[0] - - def _get_session_token(self): - """Hack to authenticate in order to download protected content - like Attachments + def get_session_token(self): + """ + Get the session token associated with the current session. + If a session token has already been established, this is returned, + otherwise a new one is generated on the server and returned. + + :returns: String containing a session token """ if self.config.session_token: return self.config.session_token @@ -1515,22 +1556,13 @@ def _get_session_token(self): session_token = (rv or {}).get("session_id") if not session_token: raise RuntimeError("Could not extract session_id from %s", rv) - - self.config.session_token = session_token - return self.config.session_token + self.config.session_token = session_token + return session_token def _build_opener(self, handler): """Build urllib2 opener with appropriate proxy handler.""" - if self.config.proxy_server: - # handle proxy auth - if self.config.proxy_user and self.config.proxy_pass: - auth_string = "%s:%s@" % (self.config.proxy_user, self.config.proxy_pass) - else: - auth_string = "" - proxy_addr = "http://%s%s:%d" % (auth_string, self.config.proxy_server, self.config.proxy_port) - proxy_support = urllib2.ProxyHandler({self.config.scheme : proxy_addr}) - - opener = urllib2.build_opener(proxy_support, handler) + if self.config.proxy_handler: + opener = urllib2.build_opener(self.config.proxy_handler, handler) else: opener = urllib2.build_opener(handler) return opener @@ -1589,6 +1621,7 @@ def _call_rpc(self, method, params, include_auth_params=True, first=False): def _auth_params(self): """ return a dictionary of the authentication parameters being used. """ + # Used to authenticate HumanUser credentials if self.config.user_login and self.config.user_password: auth_params = { @@ -1603,6 +1636,14 @@ def _auth_params(self): "script_key" : str(self.config.api_key), } + # Authenticate using session_id + elif self.config.session_token: + auth_params = { + "session_token" : str(self.config.session_token), + # Request server side to raise exception for expired sessions + "reject_if_expired": True + } + else: raise ValueError("invalid auth params") @@ -1780,10 +1821,17 @@ def _response_errors(self, sg_response): :raises ShotgunError: If the server response contains an exception. """ + + ERR_AUTH = 102 # error code for authentication related problems if isinstance(sg_response, dict) and sg_response.get("exception"): - raise Fault(sg_response.get("message", - "Unknown Error")) + + if sg_response.get("error_code") == ERR_AUTH: + raise AuthenticationFault(sg_response.get("message", "Unknown Authentication Error")) + + else: + # raise general Fault + raise Fault(sg_response.get("message", "Unknown Error")) return def _visit_data(self, data, visitor): diff --git a/tests/base.py b/tests/base.py index 21cfc171b..201844b4f 100644 --- a/tests/base.py +++ b/tests/base.py @@ -30,6 +30,7 @@ def __init__(self, *args, **kws): self.human_password = None self.server_url = None self.server_address = None + self.session_token = None self.connect = False @@ -56,6 +57,19 @@ def setUp(self, auth_mode='ApiUser'): password=self.human_password, http_proxy=self.config.http_proxy, connect=self.connect ) + elif auth_mode == 'SessionToken': + # first make an instance based on script key/name so + # we can generate a session token + sg = api.Shotgun(self.config.server_url, + self.config.script_name, + self.config.api_key, + http_proxy=self.config.http_proxy ) + self.session_token = sg.get_session_token() + # now log in using session token + self.sg = api.Shotgun(self.config.server_url, + session_token=self.session_token, + http_proxy=self.config.http_proxy, + connect=self.connect ) else: raise ValueError("Unknown value for auth_mode: %s" % auth_mode) @@ -259,6 +273,14 @@ class HumanUserAuthLiveTestBase(LiveTestBase): def setUp(self): super(HumanUserAuthLiveTestBase, self).setUp('HumanUser') +class SessionTokenAuthLiveTestBase(LiveTestBase): + ''' + Test base for relying on a Shotgun connection authenticate through the + configured session_token parameter. + ''' + def setUp(self): + super(SessionTokenAuthLiveTestBase, self).setUp('SessionToken') + class SgTestConfig(object): '''Reads test config and holds values''' diff --git a/tests/test_api.py b/tests/test_api.py index a360e2ec9..935e67ffc 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -127,7 +127,7 @@ def test_last_accessed(self): def test_get_session_token(self): """Got session UUID""" #TODO test results - rv = self.sg._get_session_token() + rv = self.sg.get_session_token() self.assertTrue(rv) def test_upload_download(self): @@ -165,7 +165,7 @@ def test_upload_download(self): file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sg_logo_download.jpg") result = self.sg.download_attachment(attach_id, file_path=file_path) self.assertEqual(result, file_path) - # On windows read may not read to end of file unless opened 'rb' + # On windows read may not read to end of file unless opened 'rb' fp = open(file_path, 'rb') attach_file = fp.read() fp.close() @@ -1420,15 +1420,15 @@ def test_bad_auth(self): # Test failed authentications sg = shotgun_api3.Shotgun(server_url, script_name, api_key) - self.assertRaises(shotgun_api3.Fault, sg.find_one, 'Shot',[]) + self.assertRaises(shotgun_api3.AuthenticationFault, sg.find_one, 'Shot',[]) script_name = self.config.script_name api_key = 'notrealapikey' sg = shotgun_api3.Shotgun(server_url, script_name, api_key) - self.assertRaises(shotgun_api3.Fault, sg.find_one, 'Shot',[]) + self.assertRaises(shotgun_api3.AuthenticationFault, sg.find_one, 'Shot',[]) sg = shotgun_api3.Shotgun(server_url, login=login, password='not a real password') - self.assertRaises(shotgun_api3.Fault, sg.find_one, 'Shot',[]) + self.assertRaises(shotgun_api3.AuthenticationFault, sg.find_one, 'Shot',[]) @patch('shotgun_api3.shotgun.Http.request') def test_status_not_200(self, mock_request): @@ -1507,6 +1507,10 @@ def test_human_user_sudo_auth_fails(self): class TestHumanUserAuth(base.HumanUserAuthLiveTestBase): + """ + Testing the username/password authentication method + """ + def test_humanuser_find(self): """Called find, find_one for known entities as human user""" filters = [] @@ -1559,6 +1563,63 @@ def test_humanuser_upload_thumbnail_for_version(self): self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) +class TestSessionTokenAuth(base.SessionTokenAuthLiveTestBase): + """ + Testing the session token based authentication method + """ + + def test_humanuser_find(self): + """Called find, find_one for known entities as session token based user""" + filters = [] + filters.append(['project', 'is', self.project]) + filters.append(['id', 'is', self.version['id']]) + + fields = ['id'] + + versions = self.sg.find("Version", filters, fields=fields) + + self.assertTrue(isinstance(versions, list)) + version = versions[0] + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version['id'], version["id"]) + + version = self.sg.find_one("Version", filters, fields=fields) + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version['id'], version["id"]) + + def test_humanuser_upload_thumbnail_for_version(self): + """simple upload thumbnail for version test as session based token user.""" + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.expanduser( + os.path.join(this_dir,"sg_logo.jpg"))) + size = os.stat(path).st_size + + # upload thumbnail + thumb_id = self.sg.upload_thumbnail("Version", + self.version['id'], path) + self.assertTrue(isinstance(thumb_id, int)) + + # check result on version + version_with_thumbnail = self.sg.find_one('Version', + [['id', 'is', self.version['id']]], + fields=['image']) + + self.assertEqual(version_with_thumbnail.get('type'), 'Version') + self.assertEqual(version_with_thumbnail.get('id'), self.version['id']) + + + h = Http(".cache") + thumb_resp, content = h.request(version_with_thumbnail.get('image'), "GET") + self.assertEqual(thumb_resp['status'], '200') + self.assertEqual(thumb_resp['content-type'], 'image/jpeg') + + # clear thumbnail + response_clear_thumbnail = self.sg.update("Version", + self.version['id'], {'image':None}) + expected_clear_thumbnail = {'id': self.version['id'], 'image': None, 'type': 'Version'} + self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) + + class TestProjectLastAccessedByCurrentUser(base.LiveTestBase): # Ticket #24681 def test_logged_in_user(self): From 79fa3dfe85766413eb2f1bca9d4dd0daff60427f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Wed, 18 Mar 2015 21:02:53 +0000 Subject: [PATCH 059/389] For #28109, added server version checks. --- shotgun_api3/shotgun.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 3b6052cd9..f99ab93ba 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1638,11 +1638,16 @@ def _auth_params(self): # Authenticate using session_id elif self.config.session_token: - auth_params = { - "session_token" : str(self.config.session_token), - # Request server side to raise exception for expired sessions - "reject_if_expired": True - } + if self.server_caps.version and self.server_caps.version < (5, 3, 0): + raise ShotgunError("Session token based authentication requires server version 5.3.0 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + auth_params = {"session_token" : str(self.config.session_token)} + + # Request server side to raise exception for expired sessions. + # This was added in as part of Shotgun 5.4.4 + if self.server_caps.version and self.server_caps.version > (5, 4, 3): + auth_params["reject_if_expired"] = True else: raise ValueError("invalid auth params") From f632d0092a8fc1626cc1d2c4778909e575ae8606 Mon Sep 17 00:00:00 2001 From: KP Date: Wed, 18 Mar 2015 17:06:45 -0500 Subject: [PATCH 060/389] #28697 Add environment variable for specifying location of certs file Adds a check for the `SHOTGUN_API_CACERTS` environment variable for the location of the certificates file to use when validating SSL connections. Allows studios to use their own certificate store automatically without having to instantiate the Shotgun API instance with this parameter explicitly. This is especially useful when using distributed applications like SG Toolkit with a server that has an internal or corporate CA signed certificate. Also updated certificates to the latest list published by Mozilla. --- shotgun_api3/lib/httplib2/cacerts.txt | 5462 ++++++++++++++++++++++--- shotgun_api3/shotgun.py | 16 +- 2 files changed, 4927 insertions(+), 551 deletions(-) diff --git a/shotgun_api3/lib/httplib2/cacerts.txt b/shotgun_api3/lib/httplib2/cacerts.txt index b3beae031..871b331eb 100644 --- a/shotgun_api3/lib/httplib2/cacerts.txt +++ b/shotgun_api3/lib/httplib2/cacerts.txt @@ -1,135 +1,37 @@ -# Certifcate Authority certificates for validating SSL connections. -# -# This file contains PEM format certificates generated from -# http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt -# -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape security libraries. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1994-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -Verisign/RSA Secure Server CA -============================= - ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 -MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV -BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy -dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ -ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII -0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI -uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI -hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 -YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc -1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- - -Thawte Personal Basic CA -======================== - ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj -IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X -DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw -EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE -ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy -dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD -QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 -dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK -wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 -G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF -AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P -9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- - -Thawte Personal Premium CA -========================== - ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p -dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv -bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa -QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY -BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u -IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl -bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu -Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs -Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI -Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD -ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh -KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ ------END CERTIFICATE----- - -Thawte Personal Freemail CA -=========================== - ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei -gQ== ------END CERTIFICATE----- - -Thawte Server CA -================ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD @@ -150,9 +52,13 @@ QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ qdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- -Thawte Premium Server CA -======================== - +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD @@ -173,9 +79,13 @@ hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- -Equifax Secure CA -================= - +# Issuer: O=Equifax OU=Equifax Secure Certificate Authority +# Subject: O=Equifax OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure CA" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy @@ -196,46 +106,13 @@ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- -Verisign Class 1 Public Primary Certification Authority -======================================================= - ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 -NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD -VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N -H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR -4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN -BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo -EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 -FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx -lA== ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority -======================================================= - ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= - +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 -----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz @@ -251,55 +128,13 @@ lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k -----END CERTIFICATE----- -Verisign Class 1 Public Primary Certification Authority - G2 -============================================================ - ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 -DzFc6PLZ ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G2 -============================================================ - ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn -jBJ7xUS0rg== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ - +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh @@ -320,88 +155,150 @@ F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY oJ2daZH9 -----END CERTIFICATE----- -Verisign Class 4 Public Primary Certification Authority - G2 -============================================================ +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e -----BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP -T8qAkbYp +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- -Verisign Class 1 Public Primary Certification Authority - G3 -============================================================ +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b -----BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G3 -============================================================ - ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl @@ -427,9 +324,13 @@ F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ - +# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 4 Public Primary Certification Authority - G3" +# Serial: 314531972711909413743075096039378935511 +# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df +# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d +# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06 -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl @@ -455,9 +356,111 @@ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- -Equifax Secure Global eBusiness CA -================================== +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 -----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT @@ -475,9 +478,13 @@ Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- -Equifax Secure eBusiness CA 1 -============================= - +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 -----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT @@ -495,274 +502,4633 @@ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- -Equifax Secure eBusiness CA 2 -============================= +# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Low-Value Services Root" +# Serial: 1 +# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc +# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d +# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 -----BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- -Thawte Time Stamping CA -======================= +# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Public Services Root" +# Serial: 1 +# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f +# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 +# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Qualified Certificates Root" +# Serial: 1 +# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb +# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf +# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 -----BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd -BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN -MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g -Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG -A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l -c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT -6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa -Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL -8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC -9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ -pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ -CayJSdM= +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= -----END CERTIFICATE----- -thawte Primary Root CA -====================== +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3 +# Subject: O=RSA Security Inc OU=RSA Security 2048 V3 +# Label: "RSA Security 2048 v3" +# Serial: 13297492616345471454730593562152402946 +# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e +# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42 +# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c -----BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= -----END CERTIFICATE----- -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Global CA 2" +# Serial: 1 +# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 +# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d +# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 -----BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== -----END CERTIFICATE----- -Entrust.net Secure Server Certification Authority -================================================= +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b -----BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -Go Daddy Class 2 Certification Authority Root Certificate -========================================================= +# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Label: "America Online Root Certification Authority 1" +# Serial: 1 +# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e +# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a +# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Label: "America Online Root Certification Authority 2" +# Serial: 1 +# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf +# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 +# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd -----BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= -----END CERTIFICATE----- -========================================================= -Certs below are required for Shotgun hosted servers as -they are the root CA for the GoDaddy.com certificates -========================================================= +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- -ValiCert Class 2 Policy Validation Authority -========================================================= +# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. +# Subject: CN=Certum CA O=Unizeto Sp. z o.o. +# Label: "Certum Root CA" +# Serial: 65568 +# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 +# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 +# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- -http://www.valicert.com -========================================================= - ------BEGIN CERTIFICATE----- -MIIEQTCCA6qgAwIBAgICAQQwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh -bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe -BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDExNDIxMDUyMVoX -DTI0MDEwOTIxMDUyMVowgewxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25h -MRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5v -bG9naWVzLCBJbmMuMTAwLgYDVQQLEydodHRwOi8vd3d3LnN0YXJmaWVsZHRlY2gu -Y29tL3JlcG9zaXRvcnkxMTAvBgNVBAMTKFN0YXJmaWVsZCBTZWN1cmUgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxKjAoBgkqhkiG9w0BCQEWG3ByYWN0aWNlc0BzdGFy -ZmllbGR0ZWNoLmNvbTCBnTANBgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEA2xFDa9zR -aXhZSehudBQIdBFsfrcqqCLYQjx6z59QskaupmcaIyK+D7M0+6yskKpbKMJw9raK -gCrgm5xS4JGocqAW4cROfREJs5651POyUMRtSAi9vCqXDG2jimo8ms9KNNwe3upa -JsChooKpSvuGIhKQOrKC1JKRn6lFn8Ok2/sCAQOjggEhMIIBHTAMBgNVHRMEBTAD -AQH/MAsGA1UdDwQEAwIBBjBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY2VydGlm -aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvcm9vdC5jcmwwTwYD -VR0gBEgwRjBEBgtghkgBhvhFAQcXAzA1MDMGCCsGAQUFBwIBFidodHRwOi8vd3d3 -LnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkwOQYIKwYBBQUHAQEELTArMCkG -CCsGAQUFBzABhh1odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbTAdBgNVHQ4E -FgQUrFXet+oT6/yYaOJTYB7xJT6M7ucwCQYDVR0jBAIwADANBgkqhkiG9w0BAQUF -AAOBgQB+HJi+rQONJYXufJCIIiv+J/RCsux/tfxyaAWkfZHvKNF9IDk7eQg3aBhS -1Y8D0olPHhHR6aV0S/xfZ2WEcYR4WbfWydfXkzXmE6uUPI6TQImMwNfy5wdS0XCP -mIzroG3RNlOQoI8WMB7ew79/RqWVKvnI3jvbd/TyMrEzYaIwNQ== ------END CERTIFICATE----- - -ValiCert Class 2 Policy Validation Authority - Issuing -========================================================= - ------BEGIN CERTIFICATE----- -MIIEQTCCA6qgAwIBAgICAQQwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh -bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe -BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDExNDIxMDUyMVoX -DTI0MDEwOTIxMDUyMVowgewxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25h -MRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5v -bG9naWVzLCBJbmMuMTAwLgYDVQQLEydodHRwOi8vd3d3LnN0YXJmaWVsZHRlY2gu -Y29tL3JlcG9zaXRvcnkxMTAvBgNVBAMTKFN0YXJmaWVsZCBTZWN1cmUgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxKjAoBgkqhkiG9w0BCQEWG3ByYWN0aWNlc0BzdGFy -ZmllbGR0ZWNoLmNvbTCBnTANBgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEA2xFDa9zR -aXhZSehudBQIdBFsfrcqqCLYQjx6z59QskaupmcaIyK+D7M0+6yskKpbKMJw9raK -gCrgm5xS4JGocqAW4cROfREJs5651POyUMRtSAi9vCqXDG2jimo8ms9KNNwe3upa -JsChooKpSvuGIhKQOrKC1JKRn6lFn8Ok2/sCAQOjggEhMIIBHTAMBgNVHRMEBTAD -AQH/MAsGA1UdDwQEAwIBBjBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY2VydGlm -aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvcm9vdC5jcmwwTwYD -VR0gBEgwRjBEBgtghkgBhvhFAQcXAzA1MDMGCCsGAQUFBwIBFidodHRwOi8vd3d3 -LnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkwOQYIKwYBBQUHAQEELTArMCkG -CCsGAQUFBzABhh1odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbTAdBgNVHQ4E -FgQUrFXet+oT6/yYaOJTYB7xJT6M7ucwCQYDVR0jBAIwADANBgkqhkiG9w0BAQUF -AAOBgQB+HJi+rQONJYXufJCIIiv+J/RCsux/tfxyaAWkfZHvKNF9IDk7eQg3aBhS -1Y8D0olPHhHR6aV0S/xfZ2WEcYR4WbfWydfXkzXmE6uUPI6TQImMwNfy5wdS0XCP -mIzroG3RNlOQoI8WMB7ew79/RqWVKvnI3jvbd/TyMrEzYaIwNQ== ------END CERTIFICATE----- - -ValiCert Class 2 Policy Validation Authority - Root -========================================================= +# Issuer: CN=Secure Certificate Services O=Comodo CA Limited +# Subject: CN=Secure Certificate Services O=Comodo CA Limited +# Label: "Comodo Secure Services root" +# Serial: 1 +# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd +# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 +# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited +# Subject: CN=Trusted Certificate Services O=Comodo CA Limited +# Label: "Comodo Trusted Services root" +# Serial: 1 +# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 +# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd +# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA" +# Serial: 10000010 +# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0 +# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04 +# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3 +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +# Issuer: O=TDC Internet OU=TDC Internet Root CA +# Subject: O=TDC Internet OU=TDC Internet Root CA +# Label: "TDC Internet Root CA" +# Serial: 986490188 +# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e +# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a +# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7 +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN DATACorp SGC Root CA" +# Serial: 91374294542884689855167577680241077609 +# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06 +# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4 +# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48 +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN USERFirst Hardware Root CA" +# Serial: 91374294542884704022267039221184531197 +# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 +# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 +# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Chambers of Commerce Root" +# Serial: 0 +# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 +# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 +# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Global Chambersign Root" +# Serial: 0 +# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 +# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 +# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Notary (Class A) Root" +# Serial: 259 +# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7 +# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6 +# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67 +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Business (Class B) Root" +# Serial: 105 +# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 +# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af +# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Express (Class C) Root" +# Serial: 104 +# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 +# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b +# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services +# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services +# Label: "Swisscom Root CA 1" +# Serial: 122348795730808398873664200247279986742 +# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9 +# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51 +# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Label: "DST ACES CA X6" +# Serial: 17771143917277623872238992636097467865 +# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 +# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d +# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Label: "TURKTRUST Certificate Services Provider Root 1" +# Serial: 1 +# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5 +# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9 +# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0 +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 +# Label: "TURKTRUST Certificate Services Provider Root 2" +# Serial: 1 +# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00 +# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7 +# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6 +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA +# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA +# Label: "WellsSecure Public Root Certificate Authority" +# Serial: 1 +# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36 +# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee +# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI +# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI +# Label: "IGC/A" +# Serial: 245102874772 +# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37 +# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c +# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32 +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Label: "Security Communication EV RootCA1" +# Serial: 0 +# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 +# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d +# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA +# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA +# Label: "Microsec e-Szigno Root CA" +# Serial: 272122594155480254301341951808045322001 +# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5 +# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d +# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0 +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw +cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy +b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z +ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 +NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN +TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p +Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u +uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ +LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA +vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 +Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx +62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB +AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw +LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP +BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB +AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov +MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 +ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT +AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh +ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo +AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa +AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln +bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p +Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP +PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv +Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB +EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu +w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj +cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV +HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI +VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS +BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS +b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS +8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds +ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl +7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR +hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ +MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. +# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. +# Label: "AC Ra\xC3\xADz Certic\xC3\xA1mara S.A." +# Serial: 38908203973182606954752843738508300 +# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6 +# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36 +# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Label: "TC TrustCenter Class 2 CA II" +# Serial: 941389028203453866782103406992443 +# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 +# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e +# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Label: "TC TrustCenter Class 3 CA II" +# Serial: 1506523511417715638772220530020799 +# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e +# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 +# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Label: "TC TrustCenter Universal CA I" +# Serial: 601024842042189035295619584734726 +# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c +# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 +# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=ComSign Secured CA O=ComSign +# Subject: CN=ComSign Secured CA O=ComSign +# Label: "ComSign Secured CA" +# Serial: 264725503855295744117309814499492384489 +# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5 +# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a +# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2 +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw +PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu +MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx +GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL +MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf +HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh +gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW +v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue +Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr +9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt +6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 +MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl +Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 +ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq +hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p +iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC +dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL +kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL +hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi +# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi +# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" +# Serial: 17 +# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 +# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 +# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 +# Label: "Buypass Class 2 CA 1" +# Serial: 1 +# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23 +# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc +# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 +# Label: "Buypass Class 3 CA 1" +# Serial: 2 +# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b +# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71 +# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. +# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. +# Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1" +# Serial: 5525761995591021570 +# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37 +# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58 +# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2 +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=CNNIC ROOT O=CNNIC +# Subject: CN=CNNIC ROOT O=CNNIC +# Label: "CNNIC ROOT" +# Serial: 1228079105 +# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19 +# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f +# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7 +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +-----END CERTIFICATE----- + +# Issuer: O=Japanese Government OU=ApplicationCA +# Subject: O=Japanese Government OU=ApplicationCA +# Label: "ApplicationCA - Japanese Government" +# Serial: 49 +# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6 +# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74 +# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19 +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Label: "NetLock Arany (Class Gold) Főtanúsítvány" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig O=Disig a.s. +# Subject: CN=CA Disig O=Disig a.s. +# Label: "CA Disig" +# Serial: 1 +# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6 +# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41 +# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus +# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus +# Label: "Juur-SK" +# Serial: 999181308 +# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55 +# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89 +# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39 +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI +# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI +# Label: "ACEDICOM Root" +# Serial: 7029493972724711941 +# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 +# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 +# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. +# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. +# Label: "E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi" +# Serial: 91184789765598910059173000485363494069 +# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b +# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34 +# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98 +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp +Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp +a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx +MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg +R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU +MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT +L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H +5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC +90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 +c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE +VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP +qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S +/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj +/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X +KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Autorité Racine" +# Serial: 1 +# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a +# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 +# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA +# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA +# Label: "Root CA Generalitat Valenciana" +# Serial: 994436456 +# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2 +# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46 +# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF +UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ +R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN +MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw +JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ +WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj +SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl +u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy +A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk +Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 +MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr +aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC +IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A +cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA +YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA +bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA +bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA +aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA +ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA +YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA +ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA +LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 +Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y +eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw +CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G +A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu +Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn +lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt +b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg +9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF +ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC +IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 +# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 +# Label: "A-Trust-nQual-03" +# Serial: 93214 +# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53 +# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2 +# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R +dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw +MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy +dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 +ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM +EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj +lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ +znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH +2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 +k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs +2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD +VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG +KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ +8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R +FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE +DNuxUCAKGkq6ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 +# Label: "TURKTRUST Certificate Services Provider Root 2007" +# Serial: 1 +# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 +# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 +# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica +# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT +# Label: "PSCProcert" +# Serial: 11 +# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec +# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 +# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center +# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center +# Label: "China Internet Network Information Center EV Certificates Root" +# Serial: 1218379777 +# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15 +# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e +# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7 +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC +Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g +Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 +aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa +Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg +SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo +aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp +ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z +7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// +DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx +zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 +hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs +4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u +gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY +NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 +j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG +52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB +echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI +zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy +wy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services +# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services +# Label: "Swisscom Root CA 2" +# Serial: 40698052477090394928831521023204026294 +# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19 +# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec +# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41 +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr +jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r +0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f +2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP +ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF +y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA +tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL +6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 +uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL +acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh +k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q +VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh +b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R +fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv +/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI +REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx +srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv +aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT +woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n +Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W +t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N +8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 +9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 +wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services +# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services +# Label: "Swisscom Root EV CA 2" +# Serial: 322973295377129385374608406479535262296 +# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec +# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b +# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw +ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp +dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 +IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD +VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy +dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg +MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx +UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD +1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH +oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR +HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ +5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv +idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL +OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC +NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f +46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB +UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth +7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G +A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB +bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x +XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T +PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 +Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 +WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL +Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm +7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S +nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN +vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB +WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI +fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb +I+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R1 O=Disig a.s. +# Subject: CN=CA Disig Root R1 O=Disig a.s. +# Label: "CA Disig Root R1" +# Serial: 14052245610670616104 +# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a +# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 +# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- \ No newline at end of file diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index f99ab93ba..4f2c7295c 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -280,8 +280,15 @@ def __init__(self, :param connect: If True, connect to the server. Only used for testing. - :param ca_certs: The path to the SSL certificate file. Useful for users - who would like to package their application into an executable. + :param ca_certs: Optional path to an external SSL certificates file. By + default, the Shotgun API will use its own built-in certificates file + which stores root certificates for the most common Certificate + Authorities (CAs). If you are using a corporate or internal CA, or are + packaging an application into an executeable, it may be necessary to + point to your own certificates file. You can do this by passing in the + full path to the file via this parameter or by setting the environment + variable `SHOTGUN_API_CACERTS`. In the case both are set, this + parameter will take precedence. :param login: The login to use to authenticate to the server. If login is provided, then password must be as well and neither script_name nor @@ -341,7 +348,10 @@ def __init__(self, self.config.no_ssl_validation = NO_SSL_VALIDATION self.config.raw_http_proxy = http_proxy self._connection = None - self.__ca_certs = ca_certs + if ca_certs is not None: + self.__ca_certs = ca_certs + else: + self.__ca_certs = os.environ.get('SHOTGUN_API_CACERTS') self.base_url = (base_url or "").lower() self.config.scheme, self.config.server, api_base, _, _ = \ From c7a3ae797f5d950d792ff2dc1cea491719c4710e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 24 Mar 2015 18:17:45 +0000 Subject: [PATCH 061/389] For #27860, added server version checks. --- shotgun_api3/shotgun.py | 23 +++++++++++++---- tests/test_api_long.py | 56 +++++++++++++++++++++++------------------ 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 4f2c7295c..38515c222 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1006,7 +1006,11 @@ def schema_entity_read(self, project_entity=None): params = {} if project_entity: - params["project"] = project_entity + if not self.server_caps.version or self.server_caps.version < (5, 4, 4): + raise ShotgunError("Per project schema operations require server "\ + "version 5.4.4 or higher, server is %s" % (self.server_caps.version,)) + else: + params["project"] = project_entity if params: return self._call_rpc("schema_entity_read", params) @@ -1026,8 +1030,12 @@ def schema_read(self, project_entity=None): params = {} if project_entity: - params["project"] = project_entity - + if not self.server_caps.version or self.server_caps.version < (5, 4, 4): + raise ShotgunError("Per project schema operations require server "\ + "version 5.4.4 or higher, server is %s" % (self.server_caps.version,)) + else: + params["project"] = project_entity + if params: return self._call_rpc("schema_read", params) else: @@ -1056,8 +1064,13 @@ def schema_field_read(self, entity_type, field_name=None, project_entity=None): } if field_name: params["field_name"] = field_name - if project_entity: - params["project"] = project_entity + + if project_entity: + if not self.server_caps.version or self.server_caps.version < (5, 4, 4): + raise ShotgunError("Per project schema operations require server "\ + "version 5.4.4 or higher, server is %s" % (self.server_caps.version,)) + else: + params["project"] = project_entity return self._call_rpc("schema_field_read", params) diff --git a/tests/test_api_long.py b/tests/test_api_long.py index bab94af67..53813cbe4 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -100,30 +100,38 @@ def test_schema(self): def test_schema_with_project(self): """Called schema functions""" - project_entity = {'type': 'Project', 'id': 0} - schema = self.sg.schema_entity_read(project_entity) - self.assertTrue(schema, dict) - self.assertTrue(len(schema) > 0) - self.assertTrue('Project' in schema) - self.assertTrue('visible' in schema['Project']) - - schema = self.sg.schema_read(project_entity) - self.assertTrue(schema, dict) - self.assertTrue(len(schema) > 0) - self.assertTrue('Version' in schema) - self.assertFalse('visible' in schema.keys()) - - schema = self.sg.schema_field_read('Version', project_entity=project_entity) - self.assertTrue(schema, dict) - self.assertTrue(len(schema) > 0) - self.assertTrue('user' in schema) - self.assertTrue('visible' in schema['user']) - - schema = self.sg.schema_field_read('Version', 'user', project_entity) - self.assertTrue(schema, dict) - self.assertTrue(len(schema) > 0) - self.assertTrue('user' in schema) - self.assertTrue('visible' in schema['user']) + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 4, 4): + # server does not support this! + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_entity_read, {'type': 'Project', 'id': 0}) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_read, {'type': 'Project', 'id': 0}) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_field_read, 'Version', None, {'type': 'Project', 'id': 0}) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_field_read, 'Version', 'user', {'type': 'Project', 'id': 0}) + + else: + project_entity = {'type': 'Project', 'id': 0} + schema = self.sg.schema_entity_read(project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('Project' in schema) + self.assertTrue('visible' in schema['Project']) + + schema = self.sg.schema_read(project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('Version' in schema) + self.assertFalse('visible' in schema.keys()) + + schema = self.sg.schema_field_read('Version', project_entity=project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('user' in schema) + self.assertTrue('visible' in schema['user']) + + schema = self.sg.schema_field_read('Version', 'user', project_entity) + self.assertTrue(schema, dict) + self.assertTrue(len(schema) > 0) + self.assertTrue('user' in schema) + self.assertTrue('visible' in schema['user']) if __name__ == '__main__': From d6d3943c59c3d92e8750e10240f3ed35aec9b643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 24 Mar 2015 18:24:26 +0000 Subject: [PATCH 062/389] [minor] Fixes broken unit tests. --- tests/test_api_long.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api_long.py b/tests/test_api_long.py index 53813cbe4..c2f166a27 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -5,7 +5,7 @@ import base import random - +import shotgun_api3 class TestShotgunApiLong(base.LiveTestBase): From a64c55ba2fc3613ad8b062c2a81635df23028744 Mon Sep 17 00:00:00 2001 From: KP Date: Wed, 25 Mar 2015 11:52:14 -0500 Subject: [PATCH 063/389] #28822 ensure we don't try and sort by pivot_column fields by accident pivot_column fields aren't sortable so in the case where we're sorting by an arbitrary field, ensure it's not a pivot_column. Iterate though the field list until we reach one that works. --- tests/test_api_long.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_api_long.py b/tests/test_api_long.py index c2f166a27..a437c3174 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -28,8 +28,15 @@ def test_automated_find(self): continue # trying to use some different code paths to the other find test + # pivot_column fields aren't valid for sorting so ensure we're + # not using one. + order_field = None + for field_name, field in fields.iteritems(): + if field['data_type']["value"] != 'pivot_column': + order_field = field_name + break # TODO for our test project, we haven't populated these entities.... - order = [{'field_name': fields.keys()[0], 'direction': direction}] + order = [{'field_name': order_field, 'direction': direction}] if "project" in fields: filters = [['project', 'is', self.project]] else: From e406d33eac1fbda91b5a97306132981f06dbb539 Mon Sep 17 00:00:00 2001 From: Philip Blyth Date: Thu, 12 Mar 2015 17:04:17 -0400 Subject: [PATCH 064/389] For #28441: refactored support checks to handle future additions --- shotgun_api3/shotgun.py | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 38515c222..a70bd66c9 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -137,23 +137,35 @@ def __init__(self, host, meta): self._ensure_json_supported() - def _ensure_json_supported(self): - """Checks the server version supports the JSON api, raises an + def _ensure_support(self, feature): + """Checks the server version supports a given feature, raises an exception if it does not. - :raises ShotgunError: The current server version does not support json + :param feature: dict supported version and human label { 'version': (int, int, int), 'label': str } + + :raises ShotgunError: The current server version does not [feature] """ - if not self.version or self.version < (2, 4, 0): - raise ShotgunError("JSON API requires server version 2.4 or "\ - "higher, server is %s" % (self.version,)) + + if not self.version or self.version < feature['version']: + raise ShotgunError( + "%s requires server version %s or higher, "\ + "server is %s" % (feature['label'], _version_str(feature['version']), _version_str(self.version)) + ) + + + def _ensure_json_supported(self): + """Wrapper for ensure_support""" + self._ensure_support({ + 'version': (2, 4, 0), + 'label': 'JSON API' + }) def ensure_include_archived_projects(self): - """Checks the server version support include_archived_projects parameter - to find. - """ - if not self.version or self.version < (5, 3, 14): - raise ShotgunError("The include_archived_projects flag requires server version 5.3.14 or "\ - "higher, server is %s" % (self.version,)) + """Wrapper for ensure_support""" + self._ensure_support({ + 'version': (5, 3, 14), + 'label': 'include_archived_projects parameter' + }) def __str__(self): @@ -2208,4 +2220,6 @@ def _translate_filters_simple(sg_filter): return condition - +def _version_str(version): + """Converts a tuple of int's to a '.' separated str""" + return '.'.join(map(str, version)) From 5f590f671895b20a721fcc2c149621900c1cdc55 Mon Sep 17 00:00:00 2001 From: Philip Blyth Date: Thu, 19 Mar 2015 12:19:48 -0400 Subject: [PATCH 065/389] For #28441: added `raise_hell` to `_ensure_support()` --- shotgun_api3/shotgun.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a70bd66c9..3f8fbbba6 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -137,7 +137,7 @@ def __init__(self, host, meta): self._ensure_json_supported() - def _ensure_support(self, feature): + def _ensure_support(self, feature, raise_hell=True): """Checks the server version supports a given feature, raises an exception if it does not. @@ -147,10 +147,14 @@ def _ensure_support(self, feature): """ if not self.version or self.version < feature['version']: - raise ShotgunError( - "%s requires server version %s or higher, "\ - "server is %s" % (feature['label'], _version_str(feature['version']), _version_str(self.version)) - ) + if raise_hell: + raise ShotgunError( + "%s requires server version %s or higher, "\ + "server is %s" % (feature['label'], _version_str(feature['version']), _version_str(self.version)) + ) + return False + else: + return True def _ensure_json_supported(self): From 7963a06652178cd10b1d25f4f2616ae70f61a181 Mon Sep 17 00:00:00 2001 From: Philip Blyth Date: Tue, 24 Mar 2015 19:07:31 -0400 Subject: [PATCH 066/389] For #28817: FIXED failing tests in older sites due to new features --- shotgun_api3/shotgun.py | 42 +++++++++++----------- tests/test_api.py | 78 ++++++++++++++++++++++------------------- tests/test_api_long.py | 23 ++++++------ 3 files changed, 77 insertions(+), 66 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 3f8fbbba6..0be6cd3e0 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -171,6 +171,13 @@ def ensure_include_archived_projects(self): 'label': 'include_archived_projects parameter' }) + def ensure_per_project_customization(self): + """Wrapper for ensure_support""" + return self._ensure_support({ + 'version': (5, 4, 4), + 'label': 'project parameter' + }, True) + def __str__(self): return "ServerCapabilities: host %s, version %s, is_dev %s"\ @@ -643,6 +650,15 @@ def _construct_read_parameters(self, params['sorts'] = sort_list return params + + def _add_project_param(self, params, project_entity): + + if project_entity and self.server_caps.ensure_per_project_customization(): + params["project"] = project_entity + + return params + + def summarize(self, entity_type, filters, @@ -1021,12 +1037,7 @@ def schema_entity_read(self, project_entity=None): params = {} - if project_entity: - if not self.server_caps.version or self.server_caps.version < (5, 4, 4): - raise ShotgunError("Per project schema operations require server "\ - "version 5.4.4 or higher, server is %s" % (self.server_caps.version,)) - else: - params["project"] = project_entity + params = self._add_project_param(params, project_entity) if params: return self._call_rpc("schema_entity_read", params) @@ -1045,13 +1056,8 @@ def schema_read(self, project_entity=None): params = {} - if project_entity: - if not self.server_caps.version or self.server_caps.version < (5, 4, 4): - raise ShotgunError("Per project schema operations require server "\ - "version 5.4.4 or higher, server is %s" % (self.server_caps.version,)) - else: - params["project"] = project_entity - + params = self._add_project_param(params, project_entity) + if params: return self._call_rpc("schema_read", params) else: @@ -1078,15 +1084,11 @@ def schema_field_read(self, entity_type, field_name=None, project_entity=None): params = { "type": entity_type, } + if field_name: params["field_name"] = field_name - - if project_entity: - if not self.server_caps.version or self.server_caps.version < (5, 4, 4): - raise ShotgunError("Per project schema operations require server "\ - "version 5.4.4 or higher, server is %s" % (self.server_caps.version,)) - else: - params["project"] = project_entity + + params = self._add_project_param(params, project_entity) return self._call_rpc("schema_field_read", params) diff --git a/tests/test_api.py b/tests/test_api.py index 935e67ffc..f4a004c59 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1567,57 +1567,63 @@ class TestSessionTokenAuth(base.SessionTokenAuthLiveTestBase): """ Testing the session token based authentication method """ - + def test_humanuser_find(self): """Called find, find_one for known entities as session token based user""" - filters = [] - filters.append(['project', 'is', self.project]) - filters.append(['id', 'is', self.version['id']]) - fields = ['id'] + if self.sg.server_caps.version >= (5, 4, 1): - versions = self.sg.find("Version", filters, fields=fields) + filters = [] + filters.append(['project', 'is', self.project]) + filters.append(['id', 'is', self.version['id']]) - self.assertTrue(isinstance(versions, list)) - version = versions[0] - self.assertEqual("Version", version["type"]) - self.assertEqual(self.version['id'], version["id"]) + fields = ['id'] - version = self.sg.find_one("Version", filters, fields=fields) - self.assertEqual("Version", version["type"]) - self.assertEqual(self.version['id'], version["id"]) + versions = self.sg.find("Version", filters, fields=fields) + + self.assertTrue(isinstance(versions, list)) + version = versions[0] + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version['id'], version["id"]) + + version = self.sg.find_one("Version", filters, fields=fields) + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version['id'], version["id"]) def test_humanuser_upload_thumbnail_for_version(self): """simple upload thumbnail for version test as session based token user.""" - this_dir, _ = os.path.split(__file__) - path = os.path.abspath(os.path.expanduser( - os.path.join(this_dir,"sg_logo.jpg"))) - size = os.stat(path).st_size - # upload thumbnail - thumb_id = self.sg.upload_thumbnail("Version", - self.version['id'], path) - self.assertTrue(isinstance(thumb_id, int)) + if self.sg.server_caps.version >= (5, 4, 1): - # check result on version - version_with_thumbnail = self.sg.find_one('Version', - [['id', 'is', self.version['id']]], - fields=['image']) + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.expanduser( + os.path.join(this_dir,"sg_logo.jpg"))) + size = os.stat(path).st_size - self.assertEqual(version_with_thumbnail.get('type'), 'Version') - self.assertEqual(version_with_thumbnail.get('id'), self.version['id']) + # upload thumbnail + thumb_id = self.sg.upload_thumbnail("Version", + self.version['id'], path) + self.assertTrue(isinstance(thumb_id, int)) + # check result on version + version_with_thumbnail = self.sg.find_one('Version', + [['id', 'is', self.version['id']]], + fields=['image']) - h = Http(".cache") - thumb_resp, content = h.request(version_with_thumbnail.get('image'), "GET") - self.assertEqual(thumb_resp['status'], '200') - self.assertEqual(thumb_resp['content-type'], 'image/jpeg') + self.assertEqual(version_with_thumbnail.get('type'), 'Version') + self.assertEqual(version_with_thumbnail.get('id'), self.version['id']) - # clear thumbnail - response_clear_thumbnail = self.sg.update("Version", - self.version['id'], {'image':None}) - expected_clear_thumbnail = {'id': self.version['id'], 'image': None, 'type': 'Version'} - self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) + + h = Http(".cache") + thumb_resp, content = h.request(version_with_thumbnail.get('image'), "GET") + self.assertEqual(thumb_resp['status'], '200') + self.assertEqual(thumb_resp['content-type'], 'image/jpeg') + + # clear thumbnail + response_clear_thumbnail = self.sg.update("Version", + self.version['id'], {'image':None}) + expected_clear_thumbnail = {'id': self.version['id'], 'image': None, 'type': 'Version'} + self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) class TestProjectLastAccessedByCurrentUser(base.LiveTestBase): diff --git a/tests/test_api_long.py b/tests/test_api_long.py index a437c3174..a5fb21f85 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -105,35 +105,38 @@ def test_schema(self): self.assertTrue(ret_val) def test_schema_with_project(self): - """Called schema functions""" + """Called schema functions with project""" + + project_entity = {'type': 'Project', 'id': 0} if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 4, 4): + # server does not support this! - self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_entity_read, {'type': 'Project', 'id': 0}) - self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_read, {'type': 'Project', 'id': 0}) - self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_field_read, 'Version', None, {'type': 'Project', 'id': 0}) - self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_field_read, 'Version', 'user', {'type': 'Project', 'id': 0}) - + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_entity_read, project_entity) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_read, project_entity) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_field_read, 'Version', None, project_entity) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.schema_field_read, 'Version', 'user', project_entity) + else: - project_entity = {'type': 'Project', 'id': 0} + schema = self.sg.schema_entity_read(project_entity) self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) self.assertTrue('Project' in schema) self.assertTrue('visible' in schema['Project']) - + schema = self.sg.schema_read(project_entity) self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) self.assertTrue('Version' in schema) self.assertFalse('visible' in schema.keys()) - + schema = self.sg.schema_field_read('Version', project_entity=project_entity) self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) self.assertTrue('user' in schema) self.assertTrue('visible' in schema['user']) - + schema = self.sg.schema_field_read('Version', 'user', project_entity) self.assertTrue(schema, dict) self.assertTrue(len(schema) > 0) From a2ca1268ae5826268c5f1a494df6f26c899512e6 Mon Sep 17 00:00:00 2001 From: KP Date: Wed, 25 Mar 2015 15:58:10 -0500 Subject: [PATCH 067/389] Packaging for the v3.0.19 release --- README.md | 10 +++++++++- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9f4741877..fb5f63450 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,14 @@ Integration and unit tests are provided. ## Changelog +**v3.0.19 - 2015 Mar 25** + + + Add ability to authenticate with Shotgun using `session_token`. + + Add `get_session_token()` method for obtaining token to authenticate with. + + Add new `AuthenticationFault` exception type to indicate when server communication has failed due to authentication reasons. + + Add support for `SHOTGUN_API_CACERTS` environment variable to provide location of external SSL certificates file. + + Fixes and updates to various tests + **v3.0.18 - 2015 Mar 13** + Add ability to query the per-project visibility status for entities, fields and statuses. (requires Shotgun server >= v5.4.4) @@ -73,7 +81,7 @@ Integration and unit tests are provided. + Fixed bug which allowed a value of None for password parameter in authenticate_human_user + Add follow, unfollow and followers methods - + Added ability to login as human user + + Add ability to login as human user + Ensure that webm/mp4 mime types are always available + Updated link to video tour in README + Fixes and updates to various tests diff --git a/setup.py b/setup.py index 3871c16bf..b19dc3a5a 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.18', + version='3.0.19', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 38515c222..f7f8344e2 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.19.dev" +__version__ = "3.0.19" # ---------------------------------------------------------------------------- # Errors From c305fc2d4d781959dc5d03103c745fcb0e53d9f9 Mon Sep 17 00:00:00 2001 From: KP Date: Wed, 25 Mar 2015 16:29:25 -0500 Subject: [PATCH 068/389] bump version to v3.0.20.dev --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 33e3b1628..fbe6c6c0e 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.19" +__version__ = "3.0.20.dev" # ---------------------------------------------------------------------------- # Errors From 96e6bacc0016034aa01074ed91eefeab7936e122 Mon Sep 17 00:00:00 2001 From: Rob Blau Date: Sat, 23 May 2015 16:19:06 -0700 Subject: [PATCH 069/389] For ticket #29625 - Re-order the cacerts file so the root cert used for hosted shotgun sites comes last. Due to a bug with older OpenSSL and Python implementations the order of the certs in the file can matter and this ordering keeps those python versions working. --- shotgun_api3/lib/httplib2/cacerts.txt | 64 +++++++++++++-------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/shotgun_api3/lib/httplib2/cacerts.txt b/shotgun_api3/lib/httplib2/cacerts.txt index 871b331eb..8603efdec 100644 --- a/shotgun_api3/lib/httplib2/cacerts.txt +++ b/shotgun_api3/lib/httplib2/cacerts.txt @@ -1601,38 +1601,6 @@ i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - # Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Label: "Starfield Class 2 CA" @@ -5131,4 +5099,36 @@ DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- \ No newline at end of file From acd37803159b484386815d7d6a05ad161e84562f Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 28 May 2015 14:08:53 -0500 Subject: [PATCH 070/389] #29803 Add support for 2 factor authentication (2FA) Adding support for 2FA the API so it is ready when Shotgun supports this. The `auth_token` parameter added to the authentication process defaults to `None` and can be ignored by all clients until 2FA is made available. Closes #85 --- README.md | 4 +++ shotgun_api3/__init__.py | 3 +- shotgun_api3/shotgun.py | 67 +++++++++++++++++++++++++++++++++------- tests/test_api.py | 7 +++++ 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index fb5f63450..f0baa00b0 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.20 - TBD** + + + Add authentication support for Shotgun servers with two-factor authentication turned on. + **v3.0.19 - 2015 Mar 25** + Add ability to authenticate with Shotgun using `session_token`. diff --git a/shotgun_api3/__init__.py b/shotgun_api3/__init__.py index dc912311e..3aa996e24 100644 --- a/shotgun_api3/__init__.py +++ b/shotgun_api3/__init__.py @@ -1,4 +1,5 @@ from shotgun import (Shotgun, ShotgunError, ShotgunFileDownloadError, Fault, - AuthenticationFault, ProtocolError, ResponseError, Error, __version__) + AuthenticationFault, MissingTwoFactorAuthenticationFault, + ProtocolError, ResponseError, Error, __version__) from shotgun import SG_TIMEZONE as sg_timezone diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index fbe6c6c0e..0fe99a87b 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -97,6 +97,12 @@ class AuthenticationFault(Fault): """Exception when the server side reports an error related to authentication""" pass +class MissingTwoFactorAuthenticationFault(Fault): + """Exception when the server side reports an error related to missing + two factor authentication credentials + """ + pass + # ---------------------------------------------------------------------------- # API @@ -231,6 +237,7 @@ def __init__(self): self.script_name = None self.user_login = None self.user_password = None + self.auth_token = None self.sudo_as_login = None # uuid as a string self.session_uuid = None @@ -279,7 +286,8 @@ def __init__(self, login=None, password=None, sudo_as_login=None, - session_token=None): + session_token=None, + auth_token=None): """Initialises a new instance of the Shotgun client. :param base_url: http or https url to the shotgun server. @@ -329,6 +337,13 @@ def __init__(self, :param session_token: The session token to use to authenticate to the server. This can be used as an alternative to authenticating with a script user or regular user. You retrieve the session token by running the get_session_token() method. + + :param auth_token: The authentication token required to authenticate to + a server with two factor authentication turned on. If auth_token is provided, + then login and password must be as well and neither script_name nor api_key + can be provided. Note that these tokens can be short lived so a session is + established right away if an auth_token is provided. A + MissingTwoFactorAuthenticationFault will be raised if the auth_token is invalid. """ # verify authentication arguments @@ -355,6 +370,13 @@ def __init__(self, if api_key is None: raise ValueError("script_name provided without api_key") + if auth_token is not None: + if login is None or password is None: + raise ValueError("must provide a user login and password with an auth_token") + + if script_name is not None or api_key is not None: + raise ValueError("cannot provide an auth_code with script_name/api_key") + # Can't use 'all' with python 2.4 if len([x for x in [session_token, script_name, api_key, login, password] if x]) == 0: if connect: @@ -365,6 +387,7 @@ def __init__(self, self.config.script_name = script_name self.config.user_login = login self.config.user_password = password + self.config.auth_token = auth_token self.config.session_token = session_token self.config.sudo_as_login = sudo_as_login self.config.convert_datetimes_to_utc = convert_datetimes_to_utc @@ -423,8 +446,6 @@ def __init__(self, proxy_addr = "http://%s%s:%d" % (auth_string, self.config.proxy_server, self.config.proxy_port) self.config.proxy_handler = urllib2.ProxyHandler({self.config.scheme : proxy_addr}) - - if ensure_ascii: self._json_loads = self._json_loads_ascii @@ -438,6 +459,15 @@ def __init__(self, if connect: self.server_caps + # When using auth_token in a 2FA scenario we need to switch to session-based + # authentication because the auth token will no longer be valid after a first use. + if self.config.auth_token != None: + self.config.session_token = self.get_session_token() + self.config.user_login = None + self.config.user_password = None + self.config.auth_token = None + + # ======================================================================== # API Functions @@ -1519,11 +1549,17 @@ def get_attachment_download_url(self, attachment): None, None, None)) return url - def authenticate_human_user(self, user_login, user_password): + def authenticate_human_user(self, user_login, user_password, auth_token=None): '''Authenticate Shotgun HumanUser. HumanUser must be an active account. - @param user_login: Login name of Shotgun HumanUser - @param user_password: Password for Shotgun HumanUser - @return: Dictionary of HumanUser including ID if authenticated, None is unauthorized. + :param user_login: Login name of Shotgun HumanUser + + :param user_password: Password for Shotgun HumanUser + + :param auth_token: One-time token required to authenticate Shotgun HumanUser + when two factor authentication is turned on. + + :return: Dictionary of HumanUser including ID if authenticated, None if unauthorized. + """ ''' if not user_login: raise ValueError('Please supply a username to authenticate.') @@ -1534,24 +1570,29 @@ def authenticate_human_user(self, user_login, user_password): # Override permissions on Config obj original_login = self.config.user_login original_password = self.config.user_password + original_auth_token = self.config.auth_token self.config.user_login = user_login self.config.user_password = user_password + self.config.auth_token = auth_token try: data = self.find_one('HumanUser', [['sg_status_list', 'is', 'act'], ['login', 'is', user_login]], ['id', 'login'], '', 'all') # Set back to default - There finally and except cannot be used together in python2.4 self.config.user_login = original_login self.config.user_password = original_password + self.config.auth_token = original_auth_token return data except Fault: # Set back to default - There finally and except cannot be used together in python2.4 self.config.user_login = original_login self.config.user_password = original_password + self.config.auth_token = original_auth_token except: # Set back to default - There finally and except cannot be used together in python2.4 self.config.user_login = original_login self.config.user_password = original_password + self.config.auth_token = original_auth_token raise @@ -1597,7 +1638,8 @@ def get_session_token(self): session_token = (rv or {}).get("session_id") if not session_token: raise RuntimeError("Could not extract session_id from %s", rv) - self.config.session_token = session_token + self.config.session_token = session_token + return session_token def _build_opener(self, handler): @@ -1669,6 +1711,8 @@ def _auth_params(self): "user_login" : str(self.config.user_login), "user_password" : str(self.config.user_password), } + if self.config.auth_token: + auth_params["auth_token"] = str(self.config.auth_token) # Use script name instead elif self.config.script_name and self.config.api_key: @@ -1867,14 +1911,15 @@ def _response_errors(self, sg_response): :raises ShotgunError: If the server response contains an exception. """ - + ERR_AUTH = 102 # error code for authentication related problems + ERR_2FA = 106 # error code when 2FA authentication is required but no 23FA token provided. if isinstance(sg_response, dict) and sg_response.get("exception"): - if sg_response.get("error_code") == ERR_AUTH: raise AuthenticationFault(sg_response.get("message", "Unknown Authentication Error")) - + elif sg_response.get("error_code") == ERR_2FA: + raise MissingTwoFactorAuthenticationFault(sg_response.get("message", "Unknown 2FA Authentication Error")) else: # raise general Fault raise Fault(sg_response.get("message", "Unknown Error")) diff --git a/tests/test_api.py b/tests/test_api.py index f4a004c59..32e0558a1 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1408,6 +1408,7 @@ def test_bad_auth(self): api_key = self.config.api_key login = self.config.human_login password = self.config.human_password + auth_token = "111111" # Test various combinations of illegal arguments self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url) @@ -1417,6 +1418,12 @@ def test_bad_auth(self): self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, login=login) self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, password=password) self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, login=login, password=password) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, login=login, auth_token=auth_token) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, password=password, auth_token=auth_token) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, script_name, login=login, + password=password, auth_token=auth_token) + self.assertRaises(ValueError, shotgun_api3.Shotgun, server_url, api_key=api_key, login=login, + password=password, auth_token=auth_token) # Test failed authentications sg = shotgun_api3.Shotgun(server_url, script_name, api_key) From 9284c73708db60e7aa410904f5033a1d0f5a6cab Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 28 May 2015 14:10:48 -0500 Subject: [PATCH 071/389] minor pythonic updates to use is/is not when comparing to None --- shotgun_api3/shotgun.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 0fe99a87b..775bf5b7a 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -461,7 +461,7 @@ def __init__(self, # When using auth_token in a 2FA scenario we need to switch to session-based # authentication because the auth token will no longer be valid after a first use. - if self.config.auth_token != None: + if self.config.auth_token is not None: self.config.session_token = self.get_session_token() self.config.user_login = None self.config.user_password = None @@ -701,7 +701,7 @@ def summarize(self, based on the given filters. """ - if not isinstance(grouping, list) and grouping != None: + if not isinstance(grouping, list) and grouping is not None: msg = "summarize() 'grouping' parameter must be a list or None" raise ValueError(msg) @@ -721,7 +721,7 @@ def summarize(self, # Defaults to True on the server, so only pass it if it's False params["include_archived_projects"] = False - if grouping != None: + if grouping is not None: params['grouping'] = grouping records = self._call_rpc('summarize', params) @@ -1913,7 +1913,7 @@ def _response_errors(self, sg_response): """ ERR_AUTH = 102 # error code for authentication related problems - ERR_2FA = 106 # error code when 2FA authentication is required but no 23FA token provided. + ERR_2FA = 106 # error code when 2FA authentication is required but no 2FA token provided. if isinstance(sg_response, dict) and sg_response.get("exception"): if sg_response.get("error_code") == ERR_AUTH: @@ -1956,7 +1956,7 @@ def _transform_outbound(self, data): if self.config.convert_datetimes_to_utc: def _change_tz(value): - if value.tzinfo == None: + if value.tzinfo is None: value = value.replace(tzinfo=SG_TIMEZONE.local) return value.astimezone(SG_TIMEZONE.utc) else: From f6e5b288f28ba25929b3f5fbcc53304af40b0ca9 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 28 May 2015 14:57:57 -0500 Subject: [PATCH 072/389] untagged version bump to v3.0.20.RC1 for testing --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 775bf5b7a..dd6d15f53 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.20.dev" +__version__ = "3.0.20.RC1" # ---------------------------------------------------------------------------- # Errors From 6af7b62331468c9ba0023b3757a085053fc5d0f4 Mon Sep 17 00:00:00 2001 From: KP Date: Wed, 10 Jun 2015 20:37:04 -0500 Subject: [PATCH 073/389] packaging for the v3.0.20 release --- README.md | 2 +- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f0baa00b0..27e2c5ba3 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Integration and unit tests are provided. ## Changelog -**v3.0.20 - TBD** +**v3.0.20 - 2015 Jun 10** + Add authentication support for Shotgun servers with two-factor authentication turned on. diff --git a/setup.py b/setup.py index b19dc3a5a..74eef4b53 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.19', + version='3.0.20', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index dd6d15f53..5437f734d 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.20.RC1" +__version__ = "3.0.20" # ---------------------------------------------------------------------------- # Errors From e92bece311641cc0236d475bc5ddc585ee40bb27 Mon Sep 17 00:00:00 2001 From: KP Date: Fri, 12 Jun 2015 11:26:53 -0500 Subject: [PATCH 074/389] bump version to v3.0.21.dev --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 5437f734d..a6fb7ed4f 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.20" +__version__ = "3.0.21.dev" # ---------------------------------------------------------------------------- # Errors From ac36810f8d6f31ab5b4ea68b755b5794dab053df Mon Sep 17 00:00:00 2001 From: KP Date: Fri, 10 Jul 2015 17:14:33 -0500 Subject: [PATCH 075/389] #30199 Update httplib2 to latest version v0.9.1 This fixes an issue where a CertificateHostnameMismatch exception would be thrown incorrectly when creating a secure connection via the API. The bug was not properly iterating through the entire list of valid hostnames to match the request against. Instead, it was only checking the first host in the list. Updated the API to specifically set proxy_info=None when no proxy information is set in the config. Previously httplib2 defaulted to using None if this parameter wasn't provided but this changed and it now assigns a ProxyInfo instance by default. Setting this to None ensures no proxy is attempted for the connection. Other various bug fixes specific to the library are also included. See https://github.com/jcgregorio/httplib2/blob/master/CHANGELOG for the full list. --- shotgun_api3/lib/httplib2/__init__.py | 657 ++++++++++++++++---------- shotgun_api3/lib/httplib2/iri2uri.py | 58 +-- shotgun_api3/lib/httplib2/socks.py | 33 +- shotgun_api3/shotgun.py | 2 +- 4 files changed, 465 insertions(+), 285 deletions(-) diff --git a/shotgun_api3/lib/httplib2/__init__.py b/shotgun_api3/lib/httplib2/__init__.py index cbf36bcc5..19e7cff11 100644 --- a/shotgun_api3/lib/httplib2/__init__.py +++ b/shotgun_api3/lib/httplib2/__init__.py @@ -15,14 +15,14 @@ __author__ = "Joe Gregorio (joe@bitworking.org)" __copyright__ = "Copyright 2006, Joe Gregorio" __contributors__ = ["Thomas Broyer (t.broyer@ltgt.net)", - "James Antill", - "Xavier Verges Farrero", - "Jonathan Feinberg", - "Blair Zajac", - "Sam Ruby", - "Louis Nyffenegger"] + "James Antill", + "Xavier Verges Farrero", + "Jonathan Feinberg", + "Blair Zajac", + "Sam Ruby", + "Louis Nyffenegger"] __license__ = "MIT" -__version__ = "0.7.0" +__version__ = "0.9.1" import re import sys @@ -35,6 +35,7 @@ import zlib import httplib import urlparse +import urllib import base64 import os import copy @@ -42,10 +43,10 @@ import time import random import errno -# remove depracated warning in python2.6 try: from hashlib import sha1 as _sha, md5 as _md5 except ImportError: + # prior to Python 2.5, these were separate modules import sha import md5 _sha = sha.new @@ -55,10 +56,12 @@ import socket try: - #from httplib2 import socks - import socks + from httplib2 import socks except ImportError: - socks = None + try: + import socks + except (ImportError, AttributeError): + socks = None # Build the appropriate socket wrapper for ssl try: @@ -99,15 +102,19 @@ def has_timeout(timeout): # python 2.6 return (timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT) return (timeout is not None) -__all__ = ['Http', 'Response', 'ProxyInfo', 'HttpLib2Error', - 'RedirectMissingLocation', 'RedirectLimit', 'FailedToDecompressContent', - 'UnimplementedDigestAuthOptionError', 'UnimplementedHmacDigestAuthOptionError', - 'debuglevel', 'ProxiesUnavailableError'] +__all__ = [ + 'Http', 'Response', 'ProxyInfo', 'HttpLib2Error', 'RedirectMissingLocation', + 'RedirectLimit', 'FailedToDecompressContent', + 'UnimplementedDigestAuthOptionError', + 'UnimplementedHmacDigestAuthOptionError', + 'debuglevel', 'ProxiesUnavailableError'] # The httplib debug level, set to a non-zero value to get debug output debuglevel = 0 +# A request will be tried 'RETRIES' times if it fails at the socket/connection level. +RETRIES = 2 # Python 2.3 support if sys.version_info < (2,4): @@ -148,11 +155,12 @@ class ServerNotFoundError(HttpLib2Error): pass class ProxiesUnavailableError(HttpLib2Error): pass class CertificateValidationUnsupported(HttpLib2Error): pass class SSLHandshakeError(HttpLib2Error): pass +class NotSupportedOnThisPlatform(HttpLib2Error): pass class CertificateHostnameMismatch(SSLHandshakeError): - def __init__(self, desc, host, cert): - HttpLib2Error.__init__(self, desc) - self.host = host - self.cert = cert + def __init__(self, desc, host, cert): + HttpLib2Error.__init__(self, desc) + self.host = host + self.cert = cert # Open Items: # ----------- @@ -176,8 +184,14 @@ def __init__(self, desc, host, cert): # requesting that URI again. DEFAULT_MAX_REDIRECTS = 5 -# Default CA certificates file bundled with httplib2. -CA_CERTS = os.path.join( +try: + # Users can optionally provide a module that tells us where the CA_CERTS + # are located. + import ca_certs_locater + CA_CERTS = ca_certs_locater.get() +except ImportError: + # Default CA certificates file bundled with httplib2. + CA_CERTS = os.path.join( os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt") # Which headers are hop-by-hop headers by default @@ -278,27 +292,29 @@ def _parse_www_authenticate(headers, headername='www-authenticate'): retval = {} if headers.has_key(headername): try: - authenticate = headers[headername].strip() - www_auth = USE_WWW_AUTH_STRICT_PARSING and WWW_AUTH_STRICT or WWW_AUTH_RELAXED - while authenticate: - # Break off the scheme at the beginning of the line - if headername == 'authentication-info': - (auth_scheme, the_rest) = ('digest', authenticate) - else: - (auth_scheme, the_rest) = authenticate.split(" ", 1) - # Now loop over all the key value pairs that come after the scheme, - # being careful not to roll into the next scheme - match = www_auth.search(the_rest) - auth_params = {} - while match: - if match and len(match.groups()) == 3: - (key, value, the_rest) = match.groups() - auth_params[key.lower()] = UNQUOTE_PAIRS.sub(r'\1', value) # '\\'.join([x.replace('\\', '') for x in value.split('\\\\')]) - match = www_auth.search(the_rest) - retval[auth_scheme.lower()] = auth_params - authenticate = the_rest.strip() + + authenticate = headers[headername].strip() + www_auth = USE_WWW_AUTH_STRICT_PARSING and WWW_AUTH_STRICT or WWW_AUTH_RELAXED + while authenticate: + # Break off the scheme at the beginning of the line + if headername == 'authentication-info': + (auth_scheme, the_rest) = ('digest', authenticate) + else: + (auth_scheme, the_rest) = authenticate.split(" ", 1) + # Now loop over all the key value pairs that come after the scheme, + # being careful not to roll into the next scheme + match = www_auth.search(the_rest) + auth_params = {} + while match: + if match and len(match.groups()) == 3: + (key, value, the_rest) = match.groups() + auth_params[key.lower()] = UNQUOTE_PAIRS.sub(r'\1', value) # '\\'.join([x.replace('\\', '') for x in value.split('\\\\')]) + match = www_auth.search(the_rest) + retval[auth_scheme.lower()] = auth_params + authenticate = the_rest.strip() + except ValueError: - raise MalformedHeader("WWW-Authenticate") + raise MalformedHeader("WWW-Authenticate") return retval @@ -466,7 +482,7 @@ def inscope(self, host, request_uri): def request(self, method, request_uri, headers, content): """Modify the request headers to add the appropriate - Authorization header. Over-rise this in sub-classes.""" + Authorization header. Over-ride this in sub-classes.""" pass def response(self, response, content): @@ -514,11 +530,11 @@ def request(self, method, request_uri, headers, content, cnonce = None): KD = lambda s, d: H("%s:%s" % (s, d)) A2 = "".join([method, ":", request_uri]) self.challenge['cnonce'] = cnonce or _cnonce() - request_digest = '"%s"' % KD(H(self.A1), "%s:%s:%s:%s:%s" % (self.challenge['nonce'], - '%08x' % self.challenge['nc'], - self.challenge['cnonce'], - self.challenge['qop'], H(A2) - )) + request_digest = '"%s"' % KD(H(self.A1), "%s:%s:%s:%s:%s" % ( + self.challenge['nonce'], + '%08x' % self.challenge['nc'], + self.challenge['cnonce'], + self.challenge['qop'], H(A2))) headers['authorization'] = 'Digest username="%s", realm="%s", nonce="%s", uri="%s", algorithm=%s, response=%s, qop=%s, nc=%08x, cnonce="%s"' % ( self.credentials[0], self.challenge['realm'], @@ -528,8 +544,9 @@ def request(self, method, request_uri, headers, content, cnonce = None): request_digest, self.challenge['qop'], self.challenge['nc'], - self.challenge['cnonce'], - ) + self.challenge['cnonce']) + if self.challenge.get('opaque'): + headers['authorization'] += ', opaque="%s"' % self.challenge['opaque'] self.challenge['nc'] += 1 def response(self, response, content): @@ -578,9 +595,8 @@ def __init__(self, credentials, host, request_uri, headers, response, content, h else: self.pwhashmod = _sha self.key = "".join([self.credentials[0], ":", - self.pwhashmod.new("".join([self.credentials[1], self.challenge['salt']])).hexdigest().lower(), - ":", self.challenge['realm'] - ]) + self.pwhashmod.new("".join([self.credentials[1], self.challenge['salt']])).hexdigest().lower(), + ":", self.challenge['realm']]) self.key = self.pwhashmod.new(self.key).hexdigest().lower() def request(self, method, request_uri, headers, content): @@ -600,8 +616,7 @@ def request(self, method, request_uri, headers, content): request_uri, created, request_digest, - keylist, - ) + keylist) def response(self, response, content): challenge = _parse_www_authenticate(response, 'www-authenticate').get('hmacdigest', {}) @@ -726,23 +741,124 @@ class KeyCerts(Credentials): name/password are mapped to key/cert.""" pass +class AllHosts(object): + pass class ProxyInfo(object): - """Collect information required to use a proxy.""" - def __init__(self, proxy_type, proxy_host, proxy_port, proxy_rdns=None, proxy_user=None, proxy_pass=None): - """The parameter proxy_type must be set to one of socks.PROXY_TYPE_XXX - constants. For example: + """Collect information required to use a proxy.""" + bypass_hosts = () -p = ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, proxy_host='localhost', proxy_port=8000) - """ - self.proxy_type, self.proxy_host, self.proxy_port, self.proxy_rdns, self.proxy_user, self.proxy_pass = proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass + def __init__(self, proxy_type, proxy_host, proxy_port, + proxy_rdns=True, proxy_user=None, proxy_pass=None): + """ + Args: + proxy_type: The type of proxy server. This must be set to one of + socks.PROXY_TYPE_XXX constants. For example: + + p = ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, + proxy_host='localhost', proxy_port=8000) + + proxy_host: The hostname or IP address of the proxy server. + + proxy_port: The port that the proxy server is running on. + + proxy_rdns: If True (default), DNS queries will not be performed + locally, and instead, handed to the proxy to resolve. This is useful + if the network does not allow resolution of non-local names. In + httplib2 0.9 and earlier, this defaulted to False. - def astuple(self): - return (self.proxy_type, self.proxy_host, self.proxy_port, self.proxy_rdns, - self.proxy_user, self.proxy_pass) + proxy_user: The username used to authenticate with the proxy server. - def isgood(self): - return (self.proxy_host != None) and (self.proxy_port != None) + proxy_pass: The password used to authenticate with the proxy server. + """ + self.proxy_type = proxy_type + self.proxy_host = proxy_host + self.proxy_port = proxy_port + self.proxy_rdns = proxy_rdns + self.proxy_user = proxy_user + self.proxy_pass = proxy_pass + + def astuple(self): + return (self.proxy_type, self.proxy_host, self.proxy_port, + self.proxy_rdns, self.proxy_user, self.proxy_pass) + + def isgood(self): + return (self.proxy_host != None) and (self.proxy_port != None) + + def applies_to(self, hostname): + return not self.bypass_host(hostname) + + def bypass_host(self, hostname): + """Has this host been excluded from the proxy config""" + if self.bypass_hosts is AllHosts: + return True + + bypass = False + for domain in self.bypass_hosts: + if hostname.endswith(domain): + bypass = True + + return bypass + + +def proxy_info_from_environment(method='http'): + """ + Read proxy info from the environment variables. + """ + if method not in ['http', 'https']: + return + + env_var = method + '_proxy' + url = os.environ.get(env_var, os.environ.get(env_var.upper())) + if not url: + return + pi = proxy_info_from_url(url, method) + + no_proxy = os.environ.get('no_proxy', os.environ.get('NO_PROXY', '')) + bypass_hosts = [] + if no_proxy: + bypass_hosts = no_proxy.split(',') + # special case, no_proxy=* means all hosts bypassed + if no_proxy == '*': + bypass_hosts = AllHosts + + pi.bypass_hosts = bypass_hosts + return pi + +def proxy_info_from_url(url, method='http'): + """ + Construct a ProxyInfo from a URL (such as http_proxy env var) + """ + url = urlparse.urlparse(url) + username = None + password = None + port = None + if '@' in url[1]: + ident, host_port = url[1].split('@', 1) + if ':' in ident: + username, password = ident.split(':', 1) + else: + password = ident + else: + host_port = url[1] + if ':' in host_port: + host, port = host_port.split(':', 1) + else: + host = host_port + + if port: + port = int(port) + else: + port = dict(https=443, http=80)[method] + + proxy_type = 3 # socks.PROXY_TYPE_HTTP + return ProxyInfo( + proxy_type = proxy_type, + proxy_host = host, + proxy_port = port, + proxy_user = username or None, + proxy_pass = password or None, + ) class HTTPConnectionWithTimeout(httplib.HTTPConnection): @@ -767,15 +883,24 @@ def connect(self): raise ProxiesUnavailableError( 'Proxy support missing but proxy use was requested!') msg = "getaddrinfo returns an empty list" - for res in socket.getaddrinfo(self.host, self.port, 0, - socket.SOCK_STREAM): + if self.proxy_info and self.proxy_info.isgood(): + use_proxy = True + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple() + + host = proxy_host + port = proxy_port + else: + use_proxy = False + + host = self.host + port = self.port + + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: - if self.proxy_info and self.proxy_info.isgood(): + if use_proxy: self.sock = socks.socksocket(af, socktype, proto) - # HACK: amorton enabled TCP_NODELAY on socket - self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - self.sock.setproxy(*self.proxy_info.astuple()) + self.sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass) else: self.sock = socket.socket(af, socktype, proto) self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) @@ -784,12 +909,16 @@ def connect(self): self.sock.settimeout(self.timeout) # End of difference from httplib. if self.debuglevel > 0: - print "connect: (%s, %s)" % (self.host, self.port) + print "connect: (%s, %s) ************" % (self.host, self.port) + if use_proxy: + print "proxy: %s ************" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) - self.sock.connect(sa) + self.sock.connect((self.host, self.port) + sa[2:]) except socket.error, msg: if self.debuglevel > 0: - print 'connect fail:', (self.host, self.port) + print "connect fail: (%s, %s)" % (self.host, self.port) + if use_proxy: + print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) if self.sock: self.sock.close() self.sock = None @@ -810,12 +939,13 @@ class HTTPSConnectionWithTimeout(httplib.HTTPSConnection): def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None, timeout=None, proxy_info=None, ca_certs=None, disable_ssl_certificate_validation=False): - httplib.HTTPSConnection.__init__(self, host, port=port, key_file=key_file, - cert_file=cert_file, strict=strict) + httplib.HTTPSConnection.__init__(self, host, port=port, + key_file=key_file, + cert_file=cert_file, strict=strict) self.timeout = timeout self.proxy_info = proxy_info if ca_certs is None: - ca_certs = CA_CERTS + ca_certs = CA_CERTS self.ca_certs = ca_certs self.disable_ssl_certificate_validation = \ disable_ssl_certificate_validation @@ -869,20 +999,31 @@ def _ValidateCertificateHostname(self, cert, hostname): host_re = host.replace('.', '\.').replace('*', '[^.]*') if re.search('^%s$' % (host_re,), hostname, re.I): return True - return False + return False def connect(self): "Connect to a host on a given (SSL) port." msg = "getaddrinfo returns an empty list" - for family, socktype, proto, canonname, sockaddr in socket.getaddrinfo( - self.host, self.port, 0, socket.SOCK_STREAM): + if self.proxy_info and self.proxy_info.isgood(): + use_proxy = True + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple() + + host = proxy_host + port = proxy_port + else: + use_proxy = False + + host = self.host + port = self.port + + address_info = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) + for family, socktype, proto, canonname, sockaddr in address_info: try: - if self.proxy_info and self.proxy_info.isgood(): + if use_proxy: sock = socks.socksocket(family, socktype, proto) - # HACK: amorton enabled TCP_NODELAY on socket - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - sock.setproxy(*self.proxy_info.astuple()) + + sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass) else: sock = socket.socket(family, socktype, proto) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) @@ -895,6 +1036,8 @@ def connect(self): self.disable_ssl_certificate_validation, self.ca_certs) if self.debuglevel > 0: print "connect: (%s, %s)" % (self.host, self.port) + if use_proxy: + print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) if not self.disable_ssl_certificate_validation: cert = self.sock.getpeercert() hostname = self.host.split(':', 0)[0] @@ -917,129 +1060,103 @@ def connect(self): else: raise except (socket.timeout, socket.gaierror): - raise + raise except socket.error, msg: - if self.debuglevel > 0: - print 'connect fail:', (self.host, self.port) - if self.sock: - self.sock.close() - self.sock = None - continue + if self.debuglevel > 0: + print "connect fail: (%s, %s)" % (self.host, self.port) + if use_proxy: + print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) + if self.sock: + self.sock.close() + self.sock = None + continue break if not self.sock: - raise socket.error, msg + raise socket.error, msg SCHEME_TO_CONNECTION = { 'http': HTTPConnectionWithTimeout, 'https': HTTPSConnectionWithTimeout - } +} # Use a different connection object for Google App Engine try: - from google.appengine.api.urlfetch import fetch - from google.appengine.api.urlfetch import InvalidURLError - from google.appengine.api.urlfetch import DownloadError - from google.appengine.api.urlfetch import ResponseTooLargeError - from google.appengine.api.urlfetch import SSLCertificateError - - - class ResponseDict(dict): - """Is a dictionary that also has a read() method, so - that it can pass itself off as an httlib.HTTPResponse().""" - def read(self): - pass - - - class AppEngineHttpConnection(object): - """Emulates an httplib.HTTPConnection object, but actually uses the Google - App Engine urlfetch library. This allows the timeout to be properly used on - Google App Engine, and avoids using httplib, which on Google App Engine is - just another wrapper around urlfetch. - """ - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=None, proxy_info=None, ca_certs=None, - disable_certificate_validation=False): - self.host = host - self.port = port - self.timeout = timeout - if key_file or cert_file or proxy_info or ca_certs: - raise NotSupportedOnThisPlatform() - self.response = None - self.scheme = 'http' - self.validate_certificate = not disable_certificate_validation - self.sock = True - - def request(self, method, url, body, headers): - # Calculate the absolute URI, which fetch requires - netloc = self.host - if self.port: - netloc = '%s:%s' % (self.host, self.port) - absolute_uri = '%s://%s%s' % (self.scheme, netloc, url) - try: - response = fetch(absolute_uri, payload=body, method=method, - headers=headers, allow_truncated=False, follow_redirects=False, - deadline=self.timeout, - validate_certificate=self.validate_certificate) - self.response = ResponseDict(response.headers) - self.response['status'] = response.status_code - setattr(self.response, 'read', lambda : response.content) - - # Make sure the exceptions raised match the exceptions expected. - except InvalidURLError: - raise socket.gaierror('') - except (DownloadError, ResponseTooLargeError, SSLCertificateError): - raise httplib.HTTPException() - - def getresponse(self): - return self.response - - def set_debuglevel(self, level): - pass - - def connect(self): - pass - - def close(self): - pass - - - class AppEngineHttpsConnection(AppEngineHttpConnection): - """Same as AppEngineHttpConnection, but for HTTPS URIs.""" - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=None, proxy_info=None): - AppEngineHttpConnection.__init__(self, host, port, key_file, cert_file, - strict, timeout, proxy_info) - self.scheme = 'https' - - # Update the connection classes to use the Googel App Engine specific ones. - SCHEME_TO_CONNECTION = { - 'http': AppEngineHttpConnection, - 'https': AppEngineHttpsConnection - } - -except ImportError: - pass + try: + from google.appengine.api import apiproxy_stub_map + if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None: + raise ImportError # Bail out; we're not actually running on App Engine. + from google.appengine.api.urlfetch import fetch + from google.appengine.api.urlfetch import InvalidURLError + except (ImportError, AttributeError): + from google3.apphosting.api import apiproxy_stub_map + if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None: + raise ImportError # Bail out; we're not actually running on App Engine. + from google3.apphosting.api.urlfetch import fetch + from google3.apphosting.api.urlfetch import InvalidURLError + + def _new_fixed_fetch(validate_certificate): + def fixed_fetch(url, payload=None, method="GET", headers={}, + allow_truncated=False, follow_redirects=True, + deadline=None): + if deadline is None: + deadline = socket.getdefaulttimeout() or 5 + return fetch(url, payload=payload, method=method, headers=headers, + allow_truncated=allow_truncated, + follow_redirects=follow_redirects, deadline=deadline, + validate_certificate=validate_certificate) + return fixed_fetch + + class AppEngineHttpConnection(httplib.HTTPConnection): + """Use httplib on App Engine, but compensate for its weirdness. + + The parameters key_file, cert_file, proxy_info, ca_certs, and + disable_ssl_certificate_validation are all dropped on the ground. + """ + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=None, proxy_info=None, ca_certs=None, + disable_ssl_certificate_validation=False): + httplib.HTTPConnection.__init__(self, host, port=port, + strict=strict, timeout=timeout) + + class AppEngineHttpsConnection(httplib.HTTPSConnection): + """Same as AppEngineHttpConnection, but for HTTPS URIs.""" + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=None, proxy_info=None, ca_certs=None, + disable_ssl_certificate_validation=False): + httplib.HTTPSConnection.__init__(self, host, port=port, + key_file=key_file, + cert_file=cert_file, strict=strict, + timeout=timeout) + self._fetch = _new_fixed_fetch( + not disable_ssl_certificate_validation) + + # Update the connection classes to use the Googel App Engine specific ones. + SCHEME_TO_CONNECTION = { + 'http': AppEngineHttpConnection, + 'https': AppEngineHttpsConnection + } +except (ImportError, AttributeError): + pass class Http(object): """An HTTP client that handles: -- all methods -- caching -- ETags -- compression, -- HTTPS -- Basic -- Digest -- WSSE - -and more. + + - all methods + - caching + - ETags + - compression, + - HTTPS + - Basic + - Digest + - WSSE + + and more. """ - def __init__(self, cache=None, timeout=None, proxy_info=None, + def __init__(self, cache=None, timeout=None, + proxy_info=proxy_info_from_environment, ca_certs=None, disable_ssl_certificate_validation=False): - """ - The value of proxy_info is a ProxyInfo instance. - - If 'cache' is a string then it is used as a directory name for + """If 'cache' is a string then it is used as a directory name for a disk cache. Otherwise it must be an object that supports the same interface as FileCache. @@ -1048,6 +1165,13 @@ def __init__(self, cache=None, timeout=None, proxy_info=None, for example the docs of socket.setdefaulttimeout(): http://docs.python.org/library/socket.html#socket.setdefaulttimeout + `proxy_info` may be: + - a callable that takes the http scheme ('http' or 'https') and + returns a ProxyInfo instance per request. By default, uses + proxy_nfo_from_environment. + - a ProxyInfo instance (static proxy config). + - None (proxy disabled). + ca_certs is the path of a file containing root CA certificates for SSL server certificate validation. By default, a CA cert file bundled with httplib2 is used. @@ -1095,6 +1219,23 @@ def __init__(self, cache=None, timeout=None, proxy_info=None, self.timeout = timeout + # Keep Authorization: headers on a redirect. + self.forward_authorization_headers = False + + def __getstate__(self): + state_dict = copy.copy(self.__dict__) + # In case request is augmented by some foreign object such as + # credentials which handle auth + if 'request' in state_dict: + del state_dict['request'] + if 'connections' in state_dict: + del state_dict['connections'] + return state_dict + + def __setstate__(self, state): + self.__dict__.update(state) + self.connections = {} + def _auth_from_challenge(self, host, request_uri, headers, response, content): """A generator that creates Authorization objects that can be applied to requests. @@ -1122,10 +1263,13 @@ def clear_credentials(self): self.authorizations = [] def _conn_request(self, conn, request_uri, method, body, headers): - for i in range(2): + i = 0 + seen_bad_status_line = False + while i < RETRIES: + i += 1 try: - if conn.sock is None: - conn.connect() + if hasattr(conn, 'sock') and conn.sock is None: + conn.connect() conn.request(method, request_uri, body, headers) except socket.timeout: raise @@ -1146,32 +1290,45 @@ def _conn_request(self, conn, request_uri, method, body, headers): except httplib.HTTPException: # Just because the server closed the connection doesn't apparently mean # that the server didn't send a response. - if conn.sock is None: - if i == 0: + if hasattr(conn, 'sock') and conn.sock is None: + if i < RETRIES-1: conn.close() conn.connect() continue else: conn.close() raise - if i == 0: + if i < RETRIES-1: conn.close() conn.connect() continue - pass try: response = conn.getresponse() + except httplib.BadStatusLine: + # If we get a BadStatusLine on the first try then that means + # the connection just went stale, so retry regardless of the + # number of RETRIES set. + if not seen_bad_status_line and i == 1: + i = 0 + seen_bad_status_line = True + conn.close() + conn.connect() + continue + else: + conn.close() + raise except (socket.error, httplib.HTTPException): - if i == 0: + if i < RETRIES-1: conn.close() conn.connect() continue else: + conn.close() raise else: content = "" if method == "HEAD": - response.close() + conn.close() else: content = response.read() response = Response(response) @@ -1229,6 +1386,8 @@ def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, del headers['if-none-match'] if headers.has_key('if-modified-since'): del headers['if-modified-since'] + if 'authorization' in headers and not self.forward_authorization_headers: + del headers['authorization'] if response.has_key('location'): location = response['location'] old_response = copy.deepcopy(response) @@ -1238,7 +1397,10 @@ def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, if response.status in [302, 303]: redirect_method = "GET" body = None - (response, content) = self.request(location, redirect_method, body=body, headers = headers, redirections = redirections - 1) + (response, content) = self.request( + location, method=redirect_method, + body=body, headers=headers, + redirections=redirections - 1) response.previous = old_response else: raise RedirectLimit("Redirected more times than rediection_limit allows.", response, content) @@ -1260,24 +1422,25 @@ def _normalize_headers(self, headers): def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAULT_MAX_REDIRECTS, connection_type=None): """ Performs a single HTTP request. -The 'uri' is the URI of the HTTP resource and can begin -with either 'http' or 'https'. The value of 'uri' must be an absolute URI. -The 'method' is the HTTP method to perform, such as GET, POST, DELETE, etc. -There is no restriction on the methods allowed. + The 'uri' is the URI of the HTTP resource and can begin with either + 'http' or 'https'. The value of 'uri' must be an absolute URI. + + The 'method' is the HTTP method to perform, such as GET, POST, DELETE, + etc. There is no restriction on the methods allowed. -The 'body' is the entity body to be sent with the request. It is a string -object. + The 'body' is the entity body to be sent with the request. It is a + string object. -Any extra headers that are to be sent with the request should be provided in the -'headers' dictionary. + Any extra headers that are to be sent with the request should be + provided in the 'headers' dictionary. -The maximum number of redirect to follow before raising an -exception is 'redirections. The default is 5. + The maximum number of redirect to follow before raising an + exception is 'redirections. The default is 5. -The return value is a tuple of (response, content), the first -being and instance of the 'Response' class, the second being -a string that contains the response entity body. + The return value is a tuple of (response, content), the first + being and instance of the 'Response' class, the second being + a string that contains the response entity body. """ try: if headers is None: @@ -1296,33 +1459,35 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU scheme = 'https' authority = domain_port[0] + proxy_info = self._get_proxy_info(scheme, authority) + conn_key = scheme+":"+authority if conn_key in self.connections: conn = self.connections[conn_key] else: if not connection_type: - connection_type = SCHEME_TO_CONNECTION[scheme] + connection_type = SCHEME_TO_CONNECTION[scheme] certs = list(self.certificates.iter(authority)) - if issubclass(connection_type, HTTPSConnectionWithTimeout): + if scheme == 'https': if certs: conn = self.connections[conn_key] = connection_type( authority, key_file=certs[0][0], cert_file=certs[0][1], timeout=self.timeout, - proxy_info=self.proxy_info, + proxy_info=proxy_info, ca_certs=self.ca_certs, disable_ssl_certificate_validation= self.disable_ssl_certificate_validation) else: conn = self.connections[conn_key] = connection_type( authority, timeout=self.timeout, - proxy_info=self.proxy_info, + proxy_info=proxy_info, ca_certs=self.ca_certs, disable_ssl_certificate_validation= self.disable_ssl_certificate_validation) else: conn = self.connections[conn_key] = connection_type( authority, timeout=self.timeout, - proxy_info=self.proxy_info) + proxy_info=proxy_info) conn.set_debuglevel(debuglevel) if 'range' not in headers and 'accept-encoding' not in headers: @@ -1331,7 +1496,7 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU info = email.Message.Message() cached_value = None if self.cache: - cachekey = defrag_uri + cachekey = defrag_uri.encode('utf-8') cached_value = self.cache.get(cachekey) if cached_value: # info = email.message_from_string(cached_value) @@ -1345,7 +1510,7 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU feedparser.feed(info) info = feedparser.close() feedparser._parse = None - except IndexError: + except (IndexError, ValueError): self.cache.delete(cachekey) cachekey = None cached_value = None @@ -1369,15 +1534,17 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU key = '-varied-%s' % header value = info[key] if headers.get(header, None) != value: - cached_value = None - break + cached_value = None + break if cached_value and method in ["GET", "HEAD"] and self.cache and 'range' not in headers: if info.has_key('-x-permanent-redirect-url'): # Should cached permanent redirects be counted in our redirection count? For now, yes. if redirections <= 0: - raise RedirectLimit("Redirected more times than rediection_limit allows.", {}, "") - (response, new_content) = self.request(info['-x-permanent-redirect-url'], "GET", headers = headers, redirections = redirections - 1) + raise RedirectLimit("Redirected more times than rediection_limit allows.", {}, "") + (response, new_content) = self.request( + info['-x-permanent-redirect-url'], method='GET', + headers=headers, redirections=redirections - 1) response.previous = Response(info) response.previous.fromcache = True else: @@ -1448,19 +1615,19 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU response.reason = str(e) elif isinstance(e, socket.timeout): content = "Request Timeout" - response = Response( { - "content-type": "text/plain", - "status": "408", - "content-length": len(content) - }) + response = Response({ + "content-type": "text/plain", + "status": "408", + "content-length": len(content) + }) response.reason = "Request Timeout" else: content = str(e) - response = Response( { - "content-type": "text/plain", - "status": "400", - "content-length": len(content) - }) + response = Response({ + "content-type": "text/plain", + "status": "400", + "content-length": len(content) + }) response.reason = "Bad Request" else: raise @@ -1468,6 +1635,19 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU return (response, content) + def _get_proxy_info(self, scheme, authority): + """Return a ProxyInfo instance (or None) based on the scheme + and authority. + """ + hostname, port = urllib.splitport(authority) + proxy_info = self.proxy_info + if callable(proxy_info): + proxy_info = proxy_info(scheme) + + if (hasattr(proxy_info, 'applies_to') + and not proxy_info.applies_to(hostname)): + proxy_info = None + return proxy_info class Response(dict): @@ -1499,12 +1679,13 @@ def __init__(self, info): self.version = info.version elif isinstance(info, email.Message.Message): for key, value in info.items(): - self[key] = value + self[key.lower()] = value self.status = int(self['status']) else: for key, value in info.iteritems(): - self[key] = value + self[key.lower()] = value self.status = int(self.get('status', self.status)) + self.reason = self.get('reason', self.reason) def __getattr__(self, name): diff --git a/shotgun_api3/lib/httplib2/iri2uri.py b/shotgun_api3/lib/httplib2/iri2uri.py index 70667edf8..d88c91fdf 100644 --- a/shotgun_api3/lib/httplib2/iri2uri.py +++ b/shotgun_api3/lib/httplib2/iri2uri.py @@ -16,7 +16,7 @@ # Convert an IRI to a URI following the rules in RFC 3987 -# +# # The characters we need to enocde and escape are defined in the spec: # # iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD @@ -28,28 +28,28 @@ # / %xD0000-DFFFD / %xE1000-EFFFD escape_range = [ - (0xA0, 0xD7FF ), - (0xE000, 0xF8FF ), - (0xF900, 0xFDCF ), - (0xFDF0, 0xFFEF), - (0x10000, 0x1FFFD ), - (0x20000, 0x2FFFD ), - (0x30000, 0x3FFFD), - (0x40000, 0x4FFFD ), - (0x50000, 0x5FFFD ), - (0x60000, 0x6FFFD), - (0x70000, 0x7FFFD ), - (0x80000, 0x8FFFD ), - (0x90000, 0x9FFFD), - (0xA0000, 0xAFFFD ), - (0xB0000, 0xBFFFD ), - (0xC0000, 0xCFFFD), - (0xD0000, 0xDFFFD ), - (0xE1000, 0xEFFFD), - (0xF0000, 0xFFFFD ), - (0x100000, 0x10FFFD) + (0xA0, 0xD7FF), + (0xE000, 0xF8FF), + (0xF900, 0xFDCF), + (0xFDF0, 0xFFEF), + (0x10000, 0x1FFFD), + (0x20000, 0x2FFFD), + (0x30000, 0x3FFFD), + (0x40000, 0x4FFFD), + (0x50000, 0x5FFFD), + (0x60000, 0x6FFFD), + (0x70000, 0x7FFFD), + (0x80000, 0x8FFFD), + (0x90000, 0x9FFFD), + (0xA0000, 0xAFFFD), + (0xB0000, 0xBFFFD), + (0xC0000, 0xCFFFD), + (0xD0000, 0xDFFFD), + (0xE1000, 0xEFFFD), + (0xF0000, 0xFFFFD), + (0x100000, 0x10FFFD), ] - + def encode(c): retval = c i = ord(c) @@ -63,19 +63,19 @@ def encode(c): def iri2uri(uri): - """Convert an IRI to a URI. Note that IRIs must be + """Convert an IRI to a URI. Note that IRIs must be passed in a unicode strings. That is, do not utf-8 encode - the IRI before passing it into the function.""" + the IRI before passing it into the function.""" if isinstance(uri ,unicode): (scheme, authority, path, query, fragment) = urlparse.urlsplit(uri) authority = authority.encode('idna') # For each character in 'ucschar' or 'iprivate' # 1. encode as utf-8 - # 2. then %-encode each octet of that utf-8 + # 2. then %-encode each octet of that utf-8 uri = urlparse.urlunsplit((scheme, authority, path, query, fragment)) uri = "".join([encode(c) for c in uri]) return uri - + if __name__ == "__main__": import unittest @@ -83,7 +83,7 @@ class Test(unittest.TestCase): def test_uris(self): """Test that URIs are invariant under the transformation.""" - invariant = [ + invariant = [ u"ftp://ftp.is.co.za/rfc/rfc1808.txt", u"http://www.ietf.org/rfc/rfc2396.txt", u"ldap://[2001:db8::7]/c=GB?objectClass?one", @@ -94,7 +94,7 @@ def test_uris(self): u"urn:oasis:names:specification:docbook:dtd:xml:4.1.2" ] for uri in invariant: self.assertEqual(uri, iri2uri(uri)) - + def test_iri(self): """ Test that the right type of escaping is done for each part of the URI.""" self.assertEqual("http://xn--o3h.com/%E2%98%84", iri2uri(u"http://\N{COMET}.com/\N{COMET}")) @@ -107,4 +107,4 @@ def test_iri(self): unittest.main() - + diff --git a/shotgun_api3/lib/httplib2/socks.py b/shotgun_api3/lib/httplib2/socks.py index 2950a3f51..0991f4cf6 100644 --- a/shotgun_api3/lib/httplib2/socks.py +++ b/shotgun_api3/lib/httplib2/socks.py @@ -13,7 +13,7 @@ 3. Neither the name of Dan Haim nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO @@ -40,10 +40,13 @@ """ +import base64 import socket import struct import sys -import base64 + +if getattr(socket, 'socket', None) is None: + raise ImportError('socket.socket missing, proxy support unusable') PROXY_TYPE_SOCKS4 = 1 PROXY_TYPE_SOCKS5 = 2 @@ -125,7 +128,6 @@ def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _soc self.__proxy = (None, None, None, None, None, None) self.__proxysockname = None self.__proxypeername = None - self.__httptunnel = True def __recvall(self, count): @@ -141,17 +143,16 @@ def __recvall(self, count): return data def sendall(self, content, *args): - """ override socket.socket.sendall method to rewrite the header - for non-tunneling proxies if needed + """ override socket.socket.sendall method to rewrite the header + for non-tunneling proxies if needed """ if not self.__httptunnel: content = self.__rewriteproxy(content) - return super(socksocket, self).sendall(content, *args) def __rewriteproxy(self, header): - """ rewrite HTTP request headers to support non-tunneling proxies - (i.e. thos which do not support the CONNECT method). + """ rewrite HTTP request headers to support non-tunneling proxies + (i.e. those which do not support the CONNECT method). This only works for HTTP (not HTTPS) since HTTPS requires tunneling. """ host, endpt = None, None @@ -161,7 +162,7 @@ def __rewriteproxy(self, header): host = hdr elif hdr.lower().startswith("get") or hdr.lower().startswith("post"): endpt = hdr - if host and endpt: + if host and endpt: hdrs.remove(host) hdrs.remove(endpt) host = host.split(" ")[1] @@ -170,7 +171,6 @@ def __rewriteproxy(self, header): hdrs.insert(0, self.__getauthheader()) hdrs.insert(0, "Host: %s" % host) hdrs.insert(0, "%s http://%s%s %s" % (endpt[0], host, endpt[1], endpt[2])) - return "\r\n".join(hdrs) def __getauthheader(self): @@ -364,12 +364,12 @@ def __negotiatehttp(self, destaddr, destport): addr = socket.gethostbyname(destaddr) else: addr = destaddr - headers = "CONNECT " + addr + ":" + str(destport) + " HTTP/1.1\r\n" - headers += "Host: " + destaddr + "\r\n" + headers = ["CONNECT ", addr, ":", str(destport), " HTTP/1.1\r\n"] + headers += ["Host: ", destaddr, "\r\n"] if (self.__proxy[4] != None and self.__proxy[5] != None): - headers += self.__getauthheader() + "\r\n" - headers += "\r\n" - self.sendall(headers.encode()) + headers += [self.__getauthheader(), "\r\n"] + headers.append("\r\n") + self.sendall("".join(headers).encode()) # We read the response until we get the string "\r\n\r\n" resp = self.recv(1) while resp.find("\r\n\r\n".encode()) == -1: @@ -399,7 +399,7 @@ def connect(self, destpair): To select the proxy server use setproxy(). """ # Do a minimal input check first - if (not type(destpair) in (list,tuple)) or (len(destpair) < 2) or (type(destpair[0]) != type('')) or (type(destpair[1]) != int): + if (not type(destpair) in (list,tuple)) or (len(destpair) < 2) or (not isinstance(destpair[0], basestring)) or (type(destpair[1]) != int): raise GeneralProxyError((5, _generalerrors[5])) if self.__proxy[0] == PROXY_TYPE_SOCKS5: if self.__proxy[2] != None: @@ -429,7 +429,6 @@ def connect(self, destpair): portnum = 8080 _orgsocket.connect(self,(self.__proxy[1],portnum)) if destpair[1] == 443: - print "WARN: SSL connections (generally on port 443) require the use of tunneling - failing back to PROXY_TYPE_HTTP" self.__negotiatehttp(destpair[0],destpair[1]) else: self.__httptunnel = False diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a6fb7ed4f..04a56e029 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2039,7 +2039,7 @@ def _get_connection(self): proxy_info=pi, disable_ssl_certificate_validation=self.config.no_ssl_validation) else: self._connection = Http(timeout=self.config.timeout_secs, ca_certs=self.__ca_certs, - disable_ssl_certificate_validation=self.config.no_ssl_validation) + proxy_info=None, disable_ssl_certificate_validation=self.config.no_ssl_validation) return self._connection From e029663c5d7a1647f3beb9cb1862f5b3d17aef16 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 13 Aug 2015 21:17:07 -0500 Subject: [PATCH 076/389] packaging for v3.0.21 release --- README.md | 4 ++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 27e2c5ba3..c91108c44 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.21 - 2015 Aug 13** + + + Update bundled httplib2 module to latest v0.9.1 - fixes some bugs + **v3.0.20 - 2015 Jun 10** + Add authentication support for Shotgun servers with two-factor authentication turned on. diff --git a/setup.py b/setup.py index 74eef4b53..3dad3d6c8 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.20', + version='3.0.21', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 04a56e029..19d40a8db 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.21.dev" +__version__ = "3.0.21" # ---------------------------------------------------------------------------- # Errors From 4607fa4db8f3fb7d062ecfc2890076a32e695f50 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 13 Aug 2015 21:28:35 -0500 Subject: [PATCH 077/389] bump version to v3.0.22.dev --- README.md | 4 ++++ shotgun_api3/shotgun.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c91108c44..dcae79a2d 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.22 - TBD** + + + TBD + **v3.0.21 - 2015 Aug 13** + Update bundled httplib2 module to latest v0.9.1 - fixes some bugs diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 19d40a8db..972136ea2 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.21" +__version__ = "3.0.22.dev" # ---------------------------------------------------------------------------- # Errors From e7b6dbac7cb89192dd6209558d64e455f53a2c9c Mon Sep 17 00:00:00 2001 From: Rob Blau Date: Fri, 28 Aug 2015 10:58:34 -0700 Subject: [PATCH 078/389] Quick update to the error message on a 503 to reflect that they can happen on maintenance or when servers are overloaded. --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 972136ea2..d798bde5c 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1848,7 +1848,7 @@ def _parse_http_status(self, status): if status[0] >= 300: headers = "HTTP error from server" if status[0] == 503: - errmsg = "Shotgun is currently down for maintenance. Please try again later." + errmsg = "Shotgun is currently down for maintenance or too busy to reply. Please try again later." raise ProtocolError(self.config.server, error_code, errmsg, From 3da19bfb1fbf3f32f957d66867ac8c9869f84e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 8 Sep 2015 11:46:18 +0100 Subject: [PATCH 079/389] #30015 Adds new methods for activity stream, search and note threads Adds three new methods: - text_search() gives access to the shotgun global search and auto completer. - activity_stream_read() gives access to the actitivty stream for a given Shotgun entity. - note_thread_read() gives access to a note thread, including replies and attachments, via a single call. Also corrects some minor inconsistencies in doc strings, fixes spelling errors and adds doc strings to some of the public methods that previously didn't have them. Closes #90. --- shotgun_api3/shotgun.py | 401 +++++++++++++++++++++++++++++++++++++--- tests/test_api.py | 320 ++++++++++++++++++++++++++++++++ 2 files changed, 695 insertions(+), 26 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index d798bde5c..dc301db40 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -''' +""" ----------------------------------------------------------------------------- Copyright (c) 2009-2015, Shotgun Software Inc @@ -27,7 +27,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' +""" import base64 @@ -288,7 +288,7 @@ def __init__(self, sudo_as_login=None, session_token=None, auth_token=None): - """Initialises a new instance of the Shotgun client. + """Initializes a new instance of the Shotgun client. :param base_url: http or https url to the shotgun server. @@ -315,7 +315,7 @@ def __init__(self, default, the Shotgun API will use its own built-in certificates file which stores root certificates for the most common Certificate Authorities (CAs). If you are using a corporate or internal CA, or are - packaging an application into an executeable, it may be necessary to + packaging an application into an executable, it may be necessary to point to your own certificates file. You can do this by passing in the full path to the file via this parameter or by setting the environment variable `SHOTGUN_API_CACERTS`. In the case both are set, this @@ -540,6 +540,8 @@ def find_one(self, entity_type, filters, fields=None, order=None, :param retired_only: Optional, flag to return only entities that have been retried. Defaults to False which returns only entities which have not been retired. + + :returns: Dictionary of requested Shotgun fields and values. """ results = self.find(entity_type, filters, fields, order, @@ -696,9 +698,57 @@ def summarize(self, filter_operator=None, grouping=None, include_archived_projects=True): - """ - Return group and summary information for entity_type for summary_fields - based on the given filters. + """Summarize column data returned by a query. + + This provides the same functionality as the summaries in the UI. + You can specify one or more fields to summarize, choose the summary + type for each, and optionally group the results which will return + summary information for each group as well as the total for the query. + + :param entity_type: The entity type to summarize + + :param filters: An array of conditions used to filter the find query. + Uses the same syntax as for example the find() method. + + :param summary_fields: A list of dictionaries with the following keys: + - field: Which field you are summarizing + - type: The type of summary you are performing on the field. + Summary types can be any of [record_count, count, sum, + maximum, minimum, average, earliest, latest, percentage, + status_percentage, status_list, checked, unchecked] + depending on the type of field you're summarizing. + + :param filter_operator: Controls how the filters are matched. + There are only two valid options: all and any. + You cannot currently combine the two options + in the same query. Defaults to "all". + :param grouping: Optional list of dicts with the following keys: + - field: a string indicating the field on entity_type to + group results by. + - type: a string indicating the type of grouping to perform + for each group. Valid types depend on the type of field + you are grouping on and can be one of [exact, tens, hundreds, + thousands, tensofthousands, hundredsofthousands, millions, + day, week, month, quarter, year, clustered_date, oneday, + fivedays, entitytype, firstletter]. + - direction: a string that sets the order to display the + grouped results. Valid direction options are asc (default) + and desc. + + :returns: dict object containing grouping and summaries keys. + - grouping: list of dictionaries containing grouping + information: + - group_name: Display name of the value + that defines the group. + - group_value: Data representation of the value + that defines the group. + - summaries: see summary key + - groups: For nested groups. This structure will be + repeated with the same structure as defined + in the top-level grouping key. + - summaries: Dict of key/value pairs where the key is the + field name and the value is the summary value + requested for that field. """ if not isinstance(grouping, list) and grouping is not None: @@ -1195,7 +1245,7 @@ def schema_field_delete(self, entity_type, field_name): return self._call_rpc("schema_field_delete", params) def add_user_agent(self, agent): - """Add agent to the user-agent header + """Add agent to the user-agent header. Append agent to the string passed in as the user-agent to be logged in events for this API session. @@ -1205,7 +1255,7 @@ def add_user_agent(self, agent): self._user_agents.append(agent) def reset_user_agent(self): - """Reset user agent to the default + """Reset user agent to the default. Eg. shotgun-json (3.0.17); Python 2.6 (Mac) """ @@ -1229,6 +1279,39 @@ def set_session_uuid(self, session_uuid): def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, filmstrip_thumbnail=False, **kwargs): + """Associate a thumbnail with more than one Shotgun entity. + + Share the thumbnail from between entities without requiring + uploading the thumbnail file multiple times. You can use this in + two ways: + + 1) Upload an image to set as the thumbnail on multiple entities. + 2) Update multiple entities to point to an existing entity's thumbnail. + + Please note that when sharing a filmstrip thumbnail, it is required + to have a static thumbnail in place before the filmstrip will + be displayed in the Shotgun web UI. + + :param entities: The entities to update to point to the shared + thumbnail provided in standard hash (dict) format. + Example: [{'type': 'Version', 'id': 123}, + {'type': 'Version', 'id': 456}] + + :param thumbnail_path: Required if source_entity is not provided. + The full path to the local thumbnail file to + upload and share. + + :param source_entity: Required if source_entity is not provided. + The entity whoes thumbnail will be the source + for sharing. Dictionary with type and id. + + :param filmstrip_thumbnail: If True, the filmstrip_thumbnail will be + shared. If False (default), the static + thumbnail will be shared. + + :returns: Id of the Attachment entity that was created for the image + if a thumbnail was uploaded successfully. + """ if not self.server_caps.version or self.server_caps.version < (4, 0, 0): raise ShotgunError("Thumbnail sharing support requires server "\ "version 4.0 or higher, server is %s" % (self.server_caps.version,)) @@ -1312,13 +1395,29 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, return attachment_id def upload_thumbnail(self, entity_type, entity_id, path, **kwargs): - """Convenience function for uploading thumbnails, see upload. + """Convenience function for uploading thumbnails. + + Additional keyword arguments passed to this method will be forwarded + to the upload() method. + + :param entity_type: Entity type of the entity to associate with + :param entity_id: Required, id of the entity to associate with + :param path: Path to file on disk + :returns: Id of the new attachment """ return self.upload(entity_type, entity_id, path, field_name="thumb_image", **kwargs) def upload_filmstrip_thumbnail(self, entity_type, entity_id, path, **kwargs): - """Convenience function for uploading thumbnails, see upload. + """Convenience function for uploading filmstrip thumbnails. + + Additional keyword arguments passed to this method will be forwarded + to the upload() method. + + :param entity_type: Entity type of the entity to associate with + :param entity_id: Required, id of the entity to associate with + :param path: Path to file on disk + :returns: Id of the new attachment """ if not self.server_caps.version or self.server_caps.version < (3, 1, 0): raise ShotgunError("Filmstrip thumbnail support requires server version 3.1 or "\ @@ -1332,11 +1431,11 @@ def upload(self, entity_type, entity_id, path, field_name=None, """Upload a file as an attachment/thumbnail to the specified entity_type and entity_id. - :param entity_type: Required, entity type (string) to revive. + :param entity_type: Entity type of the entity to associate with - :param entity_id: Required, id of the entity to revive. + :param entity_id: Entity id of the entity to associate with - :param path: path to file on disk + :param path: Path to file on disk :param field_name: the field on the entity to upload to (ignored if thumbnail) @@ -1550,7 +1649,10 @@ def get_attachment_download_url(self, attachment): return url def authenticate_human_user(self, user_login, user_password, auth_token=None): - '''Authenticate Shotgun HumanUser. HumanUser must be an active account. + """Authenticate Shotgun HumanUser. + + Note that HumanUser must be an active account. + :param user_login: Login name of Shotgun HumanUser :param user_password: Password for Shotgun HumanUser @@ -1560,7 +1662,6 @@ def authenticate_human_user(self, user_login, user_password, auth_token=None): :return: Dictionary of HumanUser including ID if authenticated, None if unauthorized. """ - ''' if not user_login: raise ValueError('Please supply a username to authenticate.') @@ -1597,12 +1698,10 @@ def authenticate_human_user(self, user_login, user_password, auth_token=None): def update_project_last_accessed(self, project, user=None): - """ - Update projects last_accessed_by_current_user field. + """Update projects last_accessed_by_current_user field. - :param project - a project entity hash - :param user - A human user entity hash. Optional if either login or sudo_as are used. - + :param project: a project entity hash + :param user: A human user entity hash. Optional if either login or sudo_as are used. """ if self.server_caps.version and self.server_caps.version < (5, 3, 20): raise ShotgunError("update_project_last_accessed requires server version 5.3.20 or "\ @@ -1621,11 +1720,260 @@ def update_project_last_accessed(self, project, user=None): params['user_id'] = user['id'] record = self._call_rpc("update_project_last_accessed_by_current_user", params) + self._parse_records(record)[0] + + + + def note_thread_read(self, note_id, entity_fields=None): + """Returns the full conversation for a given note, including + replies and attachments. + + Returns a complex data structure on the following form: + + [{'content': 'Please add more awesomeness to the color grading.', + 'created_at': '2015-07-14 21:33:28 UTC', + 'created_by': {'id': 38, + 'name': 'John Pink', + 'status': 'act', + 'type': 'HumanUser', + 'valid': 'valid'}, + 'id': 6013, + 'type': 'Note'}, + {'created_at': '2015-07-14 21:33:32 UTC', + 'created_by': {'id': 38, + 'name': 'John Pink', + 'status': 'act', + 'type': 'HumanUser', + 'valid': 'valid'}, + 'id': 159, + 'type': 'Attachment'}, + {'content': 'More awesomeness added', + 'created_at': '2015-07-14 21:54:51 UTC', + 'id': 5, + 'type': 'Reply', + 'user': {'id': 38, + 'name': 'David Blue', + 'status': 'act', + 'type': 'HumanUser', + 'valid': 'valid'}}] + + The list is returned in descending chronological order. + + If you wish to include additional fields beyond the ones that are + returned by default, you can specify these in an entity_fields + dictionary. This dictonary should be keyed by entity type and each + key should contain a list of fields to retrieve, for example: + + { "Note": ["created_by.HumanUser.image", + "addressings_to", + "playlist", + "user" ], + "Reply": ["content"], + "Attachment": ["filmstrip_image", + "local_storage", + "this_file", + "image"] + } + + :param note_id: The id for the note to be retrieved + :param entity_fields: Additional fields to retrieve as part + of the request. See above for details. + + :returns: A list of dictionaries. See above for example. + """ + + if self.server_caps.version and self.server_caps.version < (6, 2, 0): + raise ShotgunError("note_thread requires server version 6.2.0 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + entity_fields = entity_fields or {} + + if not isinstance(entity_fields, dict): + raise ValueError("entity_fields parameter must be a dictionary") + + params = { "note_id": note_id, "entity_fields": entity_fields } + + record = self._call_rpc("note_thread_contents", params) + result = self._parse_records(record) + return result + + + def text_search(self, text, entity_types, project_ids=None, limit=None): + """Searches across the specified entity types for the given text. + + This method can be used to implement auto completion or a Shotgun + global search. The method requires a text input phrase that is at least + three characters long, or an exception will be raised. + + Several ways to limit the results of the query are available: + + - Using the project_ids parameter, you can provide a list + of project ids to search across. Leaving this at its default + value of None will search across all Shotgun data. + + - You need to define which subset of entity types to search using the + entity_types parameter. Each of these entity types can be associated + with a filter query to further reduce the list of matches. The filter + list is using the standard filter syntax used by for example the + find() method. For example: + + Constrain the search to all shots but character assets only: + { "Asset": [["sg_asset_type", "is", "character"]], + "Shot": [] + } + + A dictionary with keys 'terms' and 'matches' will be returned: + + {'matches': [{'id': 734, + 'type': 'Asset', + 'name': 'Bunny', + 'project_id': 65, + 'image': 'https://...', + 'links': ['', ''], + 'status': 'fin'}, + + {'id': 558, + 'type': 'Task' + 'name': 'FX', + 'project_id': 65, + 'image': 'https://...', + 'links': ['Shot', 'bunny_010_0010'], + 'status': 'fin'}], + 'terms': ['bunny']} + + The links field will contain information about any linked entity. + This is useful when for example presenting tasks and you want to + display what shot or asset the task is associated with. + + :param text: Text to search for. This must be at least three + characters long, or an exception will be raised. + :param entity_types: Dictionary to specify which entity types to search + across. See above for usage examples. + :param project_ids: List of projects to search. By default, all + projects will be searched. + :param limit: Specify the maximum number of matches to return. + + :returns: A complex dictonary structure, see above for example. + """ + if self.server_caps.version and self.server_caps.version < (6, 2, 0): + raise ShotgunError("auto_complete requires server version 6.2.0 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + # convert entity_types structure into the form + # that the API endpoint expects + if not isinstance(entity_types, dict): + raise ValueError("entity_types parameter must be a dictionary") + + api_entity_types = {} + for (entity_type, filter_list) in entity_types.iteritems(): + + + if isinstance(filter_list, (list, tuple)): + resolved_filters = _translate_filters(filter_list, filter_operator=None) + api_entity_types[entity_type] = resolved_filters + else: + raise ValueError("value of entity_types['%s'] must " + "be a list or tuple." % entity_type) + + project_ids = project_ids or [] + + params = { "text": text, + "entity_types": api_entity_types, + "project_ids": project_ids, + "max_results": limit } + + record = self._call_rpc("query_display_name_cache", params) result = self._parse_records(record)[0] + return result - def get_session_token(self): + + def activity_stream_read(self, entity_type, entity_id, entity_fields=None, + min_id=None, max_id=None, limit=None): + """Retrieves activity stream data from Shotgun. + + This data corresponds to the data that is displayed in the + Activity tab for an entity in the Shotgun Web UI. + + A complex data structure on the following form will be + returned from Shotgun: + + {'earliest_update_id': 50, + 'entity_id': 65, + 'entity_type': 'Project', + 'latest_update_id': 79, + 'updates': [{'created_at': '2015-07-15 11:06:55 UTC', + 'created_by': {'id': 38, + 'image': '6641', + 'name': 'John Smith', + 'status': 'act', + 'type': 'HumanUser'}, + 'id': 79, + 'meta': {'entity_id': 6004, + 'entity_type': 'Version', + 'type': 'new_entity'}, + 'primary_entity': {'id': 6004, + 'name': 'Review_turntable_v2', + 'status': 'rev', + 'type': 'Version'}, + 'read': False, + 'update_type': 'create'}, + ]} + + The main payload of the return data can be found inside the 'updates' + key, containing a list of dictionaries. This list is always returned + in descending date order. Each item may contain different fields + depending on their update type. The primary_entity key represents the + main Shotgun entity that is associated with the update. By default, + this entity is returned with a set of standard fields. By using the + entity_fields parameter, you can extend the returned data to include + additional fields. If for example you wanted to return the asset type + for all assets and the linked sequence for all Shots, pass the + following entity_fields: + + {"Shot": ["sg_sequence"], "Asset": ["sg_asset_type"]} + + Deep queries can be used in this syntax if you want to + traverse into connected data. + + :param entity_type: Entity type to retrieve activity stream for + :param entity_id: Entity id to retrieve activity stream for + :param entity_fields: List of additional fields to include. + See above for details + :param max_id: Do not retrieve ids greater than this id. + This is useful when implementing paging. + :param min_id: Do not retrieve ids lesser than this id. + This is useful when implementing caching of + the event stream data and you want to + "top up" an existing cache. + :param limit: Limit the number of returned records. If not specified, + the system default will be used. + + :returns: A complex activity stream data structure. See above for details """ - Get the session token associated with the current session. + if self.server_caps.version and self.server_caps.version < (6, 2, 0): + raise ShotgunError("activity_stream requires server version 6.2.0 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + # set up parameters to send to server. + entity_fields = entity_fields or {} + + if not isinstance(entity_fields, dict): + raise ValueError("entity_fields parameter must be a dictionary") + + params = { "type": entity_type, + "id": entity_id, + "max_id": max_id, + "min_id": min_id, + "limit": limit, + "entity_fields": entity_fields } + + record = self._call_rpc("activity_stream", params) + result = self._parse_records(record)[0] + return result + + + def get_session_token(self): + """Get the session token associated with the current session. If a session token has already been established, this is returned, otherwise a new one is generated on the server and returned. @@ -1881,7 +2229,7 @@ def _json_loads(self, body): return json.loads(body) def _json_loads_ascii(self, body): - '''See http://stackoverflow.com/questions/956867''' + """"See http://stackoverflow.com/questions/956867""" def _decode_list(lst): newlist = [] for i in lst: @@ -2217,8 +2565,8 @@ def https_request(self, request): def _translate_filters(filters, filter_operator): - '''_translate_filters translates filters params into data structure - expected by rpc call.''' + """_translate_filters translates filters params into data structure + expected by rpc call.""" wrapped_filters = { "filter_operator": filter_operator or "all", "filters": filters @@ -2274,3 +2622,4 @@ def _translate_filters_simple(sg_filter): def _version_str(version): """Converts a tuple of int's to a '.' separated str""" return '.'.join(map(str, version)) + diff --git a/tests/test_api.py b/tests/test_api.py index 32e0558a1..e54c3086c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -9,6 +9,7 @@ import re from mock import patch, Mock, MagicMock import time +import uuid import unittest import urlparse @@ -1697,6 +1698,325 @@ def test_sudo_as_user(self): if initial: assert(initial['last_accessed_by_current_user'] < current['last_accessed_by_current_user']) + +class TestActivityStream(base.LiveTestBase): + """ + Unit tests for the activity_stream_read() method + """ + + def setUp(self): + super(TestActivityStream, self).setUp() + self._prefix = uuid.uuid4().hex + + self._shot = self.sg.create("Shot", {"code": "%s activity stream test" % self._prefix, + "project": self.project}) + + self._note = self.sg.create("Note", {"content": "Test!", + "project": self.project, + "note_links": [self._shot]}) + + def test_simple(self): + """ + Test activity stream + """ + + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + result = self.sg.activity_stream_read(self._shot["type"], + self._shot["id"]) + + expected_keys = ["earliest_update_id", + "entity_id", + "entity_type", + "latest_update_id", + "updates"] + + self.assertEqual(set(expected_keys), set(result.keys())) + self.assertEqual(len(result["updates"]), 2) + self.assertEqual(result["entity_type"], "Shot") + self.assertEqual(result["entity_id"], self._shot["id"]) + + + def test_limit(self): + """ + Test limited activity stream + """ + + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + result = self.sg.activity_stream_read(self._shot["type"], + self._shot["id"], + limit=1) + + self.assertEqual(len(result["updates"]), 1) + self.assertEqual(result["updates"][0]["update_type"], "create") + self.assertEqual(result["updates"][0]["meta"]["entity_type"], "Note") + + + def test_extra_fields(self): + """ + Test additional fields for activity stream + """ + + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + result = self.sg.activity_stream_read(self._shot["type"], + self._shot["id"], + entity_fields={"Shot": ["created_by.HumanUser.image"], + "Note": ["content"]}) + + self.assertEqual(len(result["updates"]), 2) + self.assertEqual(set(result["updates"][0]["primary_entity"].keys()), + set(["content", + "id", + "name", + "status", + "type"])) + + self.assertEqual(set(result["updates"][1]["primary_entity"].keys()), + set(["created_by.HumanUser.image", + "id", + "name", + "status", + "type"])) + +class TestNoteThreadRead(base.LiveTestBase): + """ + Unit tests for the note_thread_read method + """ + + def setUp(self): + super(TestNoteThreadRead, self).setUp() + + def _check_note(self, data, note_id, additional_fields): + + # check the expected fields + expected_fields = set(["content", "created_at", "created_by", "id", "type"] + additional_fields) + + self.assertEqual(expected_fields, set(data.keys())) + + # check that the data matches the data we get from a find call + note_data = self.sg.find_one("Note", + [["id", "is", note_id]], + list(expected_fields)) + self.assertEqual(note_data, data) + + def _check_reply(self, data, reply_id, additional_fields): + + # check the expected fields + expected_fields = set(["content", "created_at", "user", "id", "type"] + additional_fields) + self.assertEqual(expected_fields, set(data.keys())) + + # check that the data matches the data we get from a find call + reply_data = self.sg.find_one("Reply", + [["id", "is", reply_id]], + list(expected_fields)) + self.assertEqual(reply_data, data) + + def _check_attachment(self, data, attachment_id, additional_fields): + + # check the expected fields + expected_fields = set(["created_at", "created_by", "id", "type"] + additional_fields) + self.assertEqual(expected_fields, set(data.keys())) + + # check that the data matches the data we get from a find call + reply_data = self.sg.find_one("Attachment", + [["id", "is", attachment_id]], + list(expected_fields)) + + self.assertEqual(reply_data, data) + + def test_simple(self): + """ + Test note reply thread API call + """ + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + # create note + note = self.sg.create( "Note", {"content": "Test!", "project": self.project}) + + # get thread + result = self.sg.note_thread_read(note["id"]) + self.assertEqual(len(result), 1) + self._check_note(result[0], note["id"], additional_fields=[]) + + # now add a reply + reply = self.sg.create( "Reply", {"content": "Reply Content", "entity": note}) + + # get thread + result = self.sg.note_thread_read(note["id"]) + self.assertEqual(len(result), 2) + self._check_note(result[0], note["id"], additional_fields=[]) + self._check_reply(result[1], reply["id"], additional_fields=[]) + + # now upload an attachment + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.join(this_dir, "sg_logo.jpg")) + attachment_id = self.sg.upload(note["type"], note["id"], path) + + # get thread + result = self.sg.note_thread_read(note["id"]) + self.assertEqual(len(result), 3) + self._check_note(result[0], note["id"], additional_fields=[]) + self._check_reply(result[1], reply["id"], additional_fields=[]) + self._check_attachment(result[2], attachment_id, additional_fields=[]) + + def test_complex(self): + """ + Test note reply thread API call with additional params + """ + + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + additional_fields = { + "Note": ["created_by.HumanUser.image", + "addressings_to", + "playlist", + "user" ], + "Reply": ["content"], + "Attachment": ["local_storage", "this_file"] + } + + # create note + note = self.sg.create( "Note", {"content": "Test!", + "project": self.project, + "addressings_to": [self.human_user]}) + + # get thread + result = self.sg.note_thread_read(note["id"], additional_fields) + + self.assertEqual(len(result), 1) + self._check_note(result[0], note["id"], additional_fields["Note"]) + + # now add a reply + reply = self.sg.create( "Reply", {"content": "Reply Content", "entity": note}) + + # get thread + result = self.sg.note_thread_read(note["id"], additional_fields) + self.assertEqual(len(result), 2) + self._check_note(result[0], note["id"], additional_fields["Note"]) + self._check_reply(result[1], reply["id"], additional_fields["Reply"]) + + # now upload an attachment + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.join(this_dir, "sg_logo.jpg")) + attachment_id = self.sg.upload(note["type"], note["id"], path) + + # get thread + result = self.sg.note_thread_read(note["id"], additional_fields) + self.assertEqual(len(result), 3) + self._check_note(result[0], note["id"], additional_fields["Note"]) + self._check_reply(result[1], reply["id"], additional_fields["Reply"]) + self._check_attachment(result[2], attachment_id, additional_fields["Attachment"]) + +class TestTextSearch(base.LiveTestBase): + """ + Unit tests for the text_search() method + """ + + def setUp(self): + super(TestTextSearch, self).setUp() + + # create 5 shots and 5 assets to search for + self._prefix = uuid.uuid4().hex + + batch_data = [] + for i in range(5): + data = { "code":"%s Text Search %s" % (self._prefix, i), + "project": self.project } + batch_data.append( {"request_type": "create", + "entity_type": "Shot", + "data": data} ) + batch_data.append( {"request_type": "create", + "entity_type": "Asset", + "data": data} ) + data = self.sg.batch(batch_data) + + self._shot_ids = [x["id"] for x in data if x["type"] == "Shot"] + self._asset_ids = [x["id"] for x in data if x["type"] == "Asset"] + + def test_simple(self): + """ + Test basic global search + """ + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + result = self.sg.text_search("%s Text Search" % self._prefix, {"Shot" : [] } ) + + self.assertEqual(set(["matches", "terms"]), set(result.keys())) + self.assertEqual(result["terms"], [self._prefix, "text", "search"]) + matches = result["matches"] + self.assertEqual(len(matches), 5) + + for match in matches: + self.assertTrue(match["id"] in self._shot_ids) + self.assertEqual(match["type"], "Shot") + self.assertEqual(match["project_id"], self.project["id"]) + self.assertEqual(match["image"], None) + + def test_limit(self): + """ + Test limited global search + """ + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + result = self.sg.text_search("%s Text Search" % self._prefix, {"Shot" : [] }, limit=3 ) + matches = result["matches"] + self.assertEqual(len(matches), 3) + + def test_entity_filter(self): + """ + Test basic multi-type global search + """ + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + result = self.sg.text_search("%s Text Search" % self._prefix, + {"Shot": [], "Asset": [] } ) + + matches = result["matches"] + + self.assertEqual(set(["matches", "terms"]), set(result.keys())) + self.assertEqual(len(matches), 10) + + + def test_complex_entity_filter(self): + """ + Test complex multi-type global search + """ + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): + return + + result = self.sg.text_search("%s Text Search" % self._prefix, + {"Shot": [["code", "ends_with", "3"]], + "Asset": [ + {"filter_operator": "any", + "filters": [["code", "ends_with", "4"]] + } + ] + }) + + matches = result["matches"] + + self.assertEqual(set(["matches", "terms"]), set(result.keys())) + self.assertEqual(len(matches), 2) + + self.assertEqual(matches[0]["type"], "Shot") + self.assertEqual(matches[0]["name"], "%s Text Search 3" % self._prefix) + self.assertEqual(matches[1]["type"], "Asset") + self.assertEqual(matches[1]["name"], "%s Text Search 4" % self._prefix) + + + + + def _has_unicode(data): for k, v in data.items(): if (isinstance(k, unicode)): From c9f4e4f8d09d9ab7f2ea41f3692217b8462bac16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 8 Sep 2015 13:42:15 +0100 Subject: [PATCH 080/389] [minor] improved unit tests and unit test consistency. --- tests/test_api.py | 118 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 89 insertions(+), 29 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index e54c3086c..990273359 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -426,7 +426,7 @@ def test_deprecated_functions(self): def test_simple_summary(self): - '''test_simple_summary tests simple query using summarize.''' + """Test simple call to summarize""" summaries = [{'field': 'id', 'type': 'count'}] grouping = [{'direction': 'asc', 'field': 'id', 'type': 'exact'}] filters = [['project', 'is', self.project]] @@ -441,6 +441,7 @@ def test_simple_summary(self): assert(result['summaries']) def test_summary_include_archived_projects(self): + """Test summarize with archived project""" if self.sg.server_caps.version > (5, 3, 13): # archive project self.sg.update('Project', self.project['id'], {'archived':True}) @@ -457,32 +458,54 @@ def test_summary_include_archived_projects(self): self.sg.update('Project', self.project['id'], {'archived':False}) def test_summary_values(self): - '''''' - # try to fix data if not in expected state - shots = self.sg.find('Shot',[['project','is',self.project],['code','in',['shot 1','shot 2','shot 3']]]) - print len(shots) - for shot in shots: - # These shots should have been deleted,if they still exist it is due to an failure in mid-test - self.sg.delete('Shot', shot['id']) - - - shot_data = { - 'sg_status_list': 'ip', - 'sg_cut_duration': 100, - 'project': self.project - } + """Test summarize return data""" + + # create three unique shots + shot_prefix = uuid.uuid4().hex + shots = [] - shots.append(self.sg.create('Shot', dict(shot_data.items() + - {'code': 'shot 1'}.items()))) - shots.append(self.sg.create('Shot', dict(shot_data.items() + - {'code': 'shot 2'}.items()))) - shots.append(self.sg.create('Shot', dict(shot_data.items() + - {'code': 'shot 3', - 'sg_status_list': 'fin'}.items()))) + + shot_data_1 = { + "code": "%s Shot 1" % shot_prefix, + "sg_status_list": "ip", + "sg_cut_duration": 100, + "project": self.project + } + + shot_data_2 = { + "code": "%s Shot 2" % shot_prefix, + "sg_status_list": "ip", + "sg_cut_duration": 100, + "project": self.project + } + + shot_data_3 = { + "code": "%s Shot 3" % shot_prefix, + "sg_status_list": "fin", + "sg_cut_duration": 100, + "project": self.project + } + + shot_data_4 = { + "code": "%s Shot 4" % shot_prefix, + "sg_status_list": "wtg", + "sg_cut_duration": 0, + "project": self.project + } + + shots.append(self.sg.create("Shot", shot_data_1)) + shots.append(self.sg.create("Shot", shot_data_2)) + shots.append(self.sg.create("Shot", shot_data_3)) + shots.append(self.sg.create("Shot", shot_data_4)) + + summaries = [{'field': 'id', 'type': 'count'}, {'field': 'sg_cut_duration', 'type': 'sum'}] - grouping = [{'direction': 'asc', 'field': 'sg_status_list', 'type': 'exact'}] - filters = [['project', 'is', self.project]] + grouping = [{'direction': 'asc', + 'field': 'sg_status_list', + 'type': 'exact'}] + filters = [['project', 'is', self.project], + ['code', 'starts_with', shot_prefix]] result = self.sg.summarize('Shot', filters=filters, summary_fields=summaries, @@ -510,7 +533,7 @@ def test_summary_values(self): for s in shots: batch_data.append({"request_type": "delete", "entity_type": "Shot", - "entity_id": s['id'] + "entity_id": s["id"] }) self.sg.batch(batch_data) @@ -1715,6 +1738,20 @@ def setUp(self): "project": self.project, "note_links": [self._shot]}) + def tearDown(self): + batch_data = [] + batch_data.append({"request_type": "delete", + "entity_type": self._note["type"], + "entity_id": self._note["id"] + }) + batch_data.append({"request_type": "delete", + "entity_type": self._shot["type"], + "entity_id": self._shot["id"] + }) + self.sg.batch(batch_data) + + super(TestActivityStream, self).tearDown() + def test_simple(self): """ Test activity stream @@ -1814,6 +1851,11 @@ def _check_reply(self, data, reply_id, additional_fields): reply_data = self.sg.find_one("Reply", [["id", "is", reply_id]], list(expected_fields)) + + # the reply stream adds an image to the user fields in order + # to include thumbnails for users, so add this in before we compare + reply_data["user"]["image"] = None + self.assertEqual(reply_data, data) def _check_attachment(self, data, attachment_id, additional_fields): @@ -1823,11 +1865,11 @@ def _check_attachment(self, data, attachment_id, additional_fields): self.assertEqual(expected_fields, set(data.keys())) # check that the data matches the data we get from a find call - reply_data = self.sg.find_one("Attachment", - [["id", "is", attachment_id]], - list(expected_fields)) + attachment_data = self.sg.find_one("Attachment", + [["id", "is", attachment_id]], + list(expected_fields)) - self.assertEqual(reply_data, data) + self.assertEqual(attachment_data, data) def test_simple(self): """ @@ -1940,6 +1982,24 @@ def setUp(self): self._shot_ids = [x["id"] for x in data if x["type"] == "Shot"] self._asset_ids = [x["id"] for x in data if x["type"] == "Asset"] + def tearDown(self): + + # clean up + batch_data = [] + for shot_id in self._shot_ids: + batch_data.append({"request_type": "delete", + "entity_type": "Shot", + "entity_id": shot_id + }) + for asset_id in self._asset_ids: + batch_data.append({"request_type": "delete", + "entity_type": "Asset", + "entity_id": asset_id + }) + self.sg.batch(batch_data) + + super(TestTextSearch, self).tearDown() + def test_simple(self): """ Test basic global search From 223a6b1e3aeeae057978a34724a2ab49fae8caeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 8 Sep 2015 14:14:07 +0100 Subject: [PATCH 081/389] #29814 Added mockgun mocker to Shotgun API This adds a highly experimental 'Mockgun' Shotgun API mocker to the Shotgun API. This is being moved across from the Toolkit unit test rig into the Shotgun API to allow for a wider range of use and reuse. Mockgun is highly experimental at this point. It only supports a subset of the Shotgun API and we are likely to make big and potentally breaking changes to this in the future. Closes #87 --- shotgun_api3/lib/mockgun.py | 724 ++++++++++++++++++++++++++++++++++++ 1 file changed, 724 insertions(+) create mode 100644 shotgun_api3/lib/mockgun.py diff --git a/shotgun_api3/lib/mockgun.py b/shotgun_api3/lib/mockgun.py new file mode 100644 index 000000000..7b831aa6c --- /dev/null +++ b/shotgun_api3/lib/mockgun.py @@ -0,0 +1,724 @@ +""" + ----------------------------------------------------------------------------- + Copyright (c) 2009-2015, Shotgun Software Inc + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of the Shotgun Software Inc nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------- + + + +----------------------------------------------------------------------------- +M O C K G U N +----------------------------------------------------------------------------- + +Experimental software ahead! +---------------------------- +Disclaimer! Mockgun is in its early stages of development. It is not fully +compatible with the Shotgun API yet and we offer no guarantees at this point +that future versions of Mockgun will be backwards compatible. Consider this +alpha level software and use at your own risk. + + +What is Mockgun? +---------------- +Mockgun is a Shotgun API mocker. It's a class that has got *most* of the same +methods and parameters that the Shotgun API has got. Mockgun is essentially a +Shotgun *emulator* that (for basic operations) looks and feels like Shotgun. + +The primary purpose of Mockgun is to drive unit test rigs where it becomes +too slow, cumbersome or non-practical to connect to a real Shotgun. Using a +Mockgun for unit tests means that a test can be rerun over and over again +from exactly the same database state. This can be hard to do if you connect +to a live Shotgun instance. + + +How do I use Mockgun? +--------------------- +First of all, you need a Shotgun schema to run against. This will define +all the fields and entities that mockgun will use. Simply connect to +your Shotgun site and use the generate_schema() method to download +the schema data: + + # connect to your site + from shotgun_api3 import Shotgun + sg = Shotgun("https://mysite.shotgunstudio.com", script_name="xyz", api_key="abc") + + # write out schema data to files + from shotgun_api3.lib import mockgun + mockgun.generate_schema(sg, "/tmp/schema", "/tmp/entity_schema") + +Now that you have a schema, you can tell your mockgun instance about it. +We do this as a class-level operation, so that the consctructor can be +exactly like the real Shotgun one: + + from shotgun_api3.lib import mockgun + + # tell mockgun about the schema + mockgun.Shotgun.set_schema_paths("/tmp/schema", "/tmp/entity_schema") + + # we are ready to mock! + # this call will not connect to mysite, but instead create a + # mockgun instance which is connected to an *empty* shotgun site + # which has got the same schema as mysite. + sg = mockgun.Shotgun("https://mysite.shotgunstudio.com", script_name="xyz", api_key="abc") + + # now you can start putting stuff in + print sg.create("HumanUser", {"firstname": "John", "login": "john"}) + # prints {'login': 'john', 'type': 'HumanUser', 'id': 1, 'firstname': 'John'} + + # and find what you have created + print sg.find("HumanUser", [["login", "is", "john"]]) + prints [{'type': 'HumanUser', 'id': 1}] + +That's it! Mockgun is used to run the Shotgun Pipeline Toolkit unit test rig. + +Mockgun has a 'database' in the form of a dictionary stored in Mockgun._db +By editing this directly, you can modify the database without going through +the API. + + +What are the limitations? +--------------------- +There are many. Don't expect mockgun to be fully featured at this point. +Below is a non-exhaustive list of things that we still need to implement: + +- Many find queries won't work +- Methods around session handling and authentication is not implemented +- Attachments and upload is rundimental at best +- Schema modification isn't most most likely will never be supported +- There is no validation or sanitation + +""" + +import os, datetime +import cPickle as pickle + +from .. import sg_timezone, ShotgunError +from ..shotgun import _Config + +# ---------------------------------------------------------------------------- +# Version +__version__ = "0.0.1" + +# ---------------------------------------------------------------------------- +# Errors + +class MockgunError(Exception): + """ + Base for all Mockgun related API Errors. + These are errors that relate to mockgun specifically, for example + relating to mockups setup and initialization. For operational errors, + mockgun raises ShotgunErrors just like the Shotgun API. + """ + pass + +# ---------------------------------------------------------------------------- +# Utility methods + +def generate_schema(shotgun, schema_file_path, schema_entity_file_path): + """ + Helper method for mockgun. + Generates the schema files needed by the mocker by connecting to a real shotgun + and downloading the schema information for that site. Once the generated schema + files are being passed to mockgun, it will mimic the site's schema structure. + + :param sg_url: Shotgun site url + :param sg_script: Script name to connect with + :param sg_key: Script key to connect with + :param schema_file_path: Path where to write the main schema file to + :param schema_entity_file_path: Path where to write the entity schema file to + """ + + schema = shotgun.schema_read() + fh = open(schema_file_path, "w") + pickle.dump(schema, fh) + fh.close() + + schema_entity = shotgun.schema_entity_read() + fh = open(schema_entity_file_path, "w") + pickle.dump(schema_entity, fh) + fh.close() + +# ---------------------------------------------------------------------------- +# API + +class Shotgun(object): + """ + Mockgun is a mocked Shotgun API, designed for test purposes. + It generates an object which looks and feels like a normal Shotgun API instance. + Instead of connecting to a real server, it keeps all its data in memory in a way + which makes it easy to introspect and test. + + The methods presented in this class reflect the Shotgun API and are therefore + sparsely documented. + + Please note that this class is built for test purposes only and only creates an + object which *roughly* resembles the Shotgun API - however, for most common + use cases, this is enough to be able to perform relevant and straight forward + testing of code. + """ + + __schema_path = None + __schema_entity_path = None + + @classmethod + def set_schema_paths(cls, schema_path, schema_entity_path): + """ + Set the path where schema files can be found. This is done at the class + level so all Shotgun instances will share the same schema. + The responsability to generate and load these files is left to the user + changing the default value. + + :param schema_path: Directory path where schema files are. + """ + cls.__schema_path = schema_path + cls.__schema_entity_path = schema_entity_path + + @classmethod + def get_schema_paths(cls): + """ + Returns a tuple with paths to the files which are part of the schema. + These paths can then be used in generate_schema if needed. + + :returns: A tuple with schema_file_path and schema_entity_file_path + """ + return (cls.__schema_path, cls.__schema_entity_path) + + def __init__(self, + base_url, + script_name=None, + api_key=None, + convert_datetimes_to_utc=True, + http_proxy=None, + ensure_ascii=True, + connect=True, + ca_certs=None, + login=None, + password=None, + sudo_as_login=None, + session_token=None, + auth_token=None): + + # emulate the config object in the Shotgun API. + # these settings won't make sense for mockgun, but + # having them present means code and get and set them + # they way they would expect to in the real API. + self.config = _Config() + + # load in the shotgun schema to associate with this Shotgun + (schema_path, schema_entity_path) = self.get_schema_paths() + + if schema_path is None or schema_entity_path is None: + raise MockgunError("Cannot create Mockgun instance because no schema files have been defined. " + "Before creating a Mockgun instance, please call Mockgun.set_schema_paths() " + "in order to specify which Shotgun schema Mockgun should operate against.") + + if not os.path.exists(schema_path): + raise MockgunError("Cannot locate Mockgun schema file '%s'!" % schema_path) + + if not os.path.exists(schema_entity_path): + raise MockgunError("Cannot locate Mockgun schema file '%s'!" % schema_entity_path) + + fh = open(schema_path, "r") + try: + self._schema = pickle.load(fh) + finally: + fh.close() + + fh = open(schema_entity_path, "r") + try: + self._schema_entity = pickle.load(fh) + finally: + fh.close() + + # initialize the "database" + self._db = dict((entity, {}) for entity in self._schema) + + # set some basic public members that exist in the Shotgun API + self.base_url = base_url + + # bootstrap the event log + # let's make sure there is at least one event log id in our mock db + data = {} + data["event_type"] = "Hello_Mockgun_World" + data["description"] = "Mockgun was born. Yay." + self.create("EventLogEntry", data) + + self.finds = 0 + + ################################################################################################### + # public API methods + + + def schema_read(self): + return self._schema + + def schema_field_create(self, entity_type, data_type, display_name, properties=None): + raise NotImplementedError + + def schema_field_update(self, entity_type, field_name, properties): + raise NotImplementedError + + def schema_field_delete(self, entity_type, field_name): + raise NotImplementedError + + def schema_entity_read(self): + return self._schema_entity + + def schema_field_read(self, entity_type, field_name=None): + if field_name is None: + return self._schema[entity_type] + else: + return dict((k, v) for k, v in self._schema[entity_type].items() if k == field_name) + + + def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0): + + + self.finds += 1 + + self._validate_entity_type(entity_type) + # do not validate custom fields - this makes it hard to mock up a field quickly + #self._validate_entity_fields(entity_type, fields) + + if isinstance(filters, dict): + # complex filter style! + # {'conditions': [{'path': 'id', 'relation': 'is', 'values': [1]}], 'logical_operator': 'and'} + + resolved_filters = [] + for f in filters["conditions"]: + + if f["path"].startswith("$FROM$"): + # special $FROM$Task.step.entity syntax + # skip this for now + continue + + if len(f["values"]) != 1: + # {'path': 'id', 'relation': 'in', 'values': [1,2,3]} --> ["id", "in", [1,2,3]] + resolved_filters.append([ f["path"], f["relation"], f["values"] ]) + else: + # {'path': 'id', 'relation': 'is', 'values': [3]} --> ["id", "is", 3] + resolved_filters.append([ f["path"], f["relation"], f["values"][0] ]) + + else: + # traditiona style sg filters + resolved_filters = filters + + # now translate ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] + resolved_filters_2 = [] + for f in resolved_filters: + + if len(f) > 3: + # ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] + new_filter = [ f[0], f[1], f[2:] ] + + elif f[1] == "in" and not isinstance(f[2], list): + # ["field", "in", 2] --> ["field", "in", [2]] + new_filter = [ f[0], f[1], [ f[2] ] ] + + else: + new_filter = f + + resolved_filters_2.append(new_filter) + + results = [row for row in self._db[entity_type].values() if self._row_matches_filters(entity_type, row, resolved_filters_2, filter_operator, retired_only)] + + if fields is None: + fields = set(["type", "id"]) + else: + fields = set(fields) | set(["type", "id"]) + + val = [dict((field, self._get_field_from_row(entity_type, row, field)) for field in fields) for row in results] + + return val + + + def find_one(self, entity_type, filters, fields=None, order=None, filter_operator=None, retired_only=False): + results = self.find(entity_type, filters, fields=fields, order=order, filter_operator=filter_operator, retired_only=retired_only) + return results[0] if results else None + + def batch(self, requests): + results = [] + for request in requests: + if request["request_type"] == "create": + results.append(self.create(request["entity_type"], request["data"])) + elif request["request_type"] == "update": + # note: Shotgun.update returns a list of a single item + results.append(self.update(request["entity_type"], request["entity_id"], request["data"])[0]) + elif request["request_type"] == "delete": + results.append(self.delete(request["entity_type"], request["entity_id"])) + else: + raise ShotgunError("Invalid request type %s in request %s" % (request["request_type"], request)) + return results + + def create(self, entity_type, data, return_fields=None): + + # special handling of storage fields - if a field value + # is a dict with a key local_path, then add fields + # local_path_linux, local_path_windows, local_path_mac + # as a reflection of this + for d in data: + if isinstance(data[d], dict) and "local_path" in data[d]: + # partly imitate some of the business logic happening on the + # server side of shotgun when a file/link entity value is created + if "local_storage" not in data[d]: + data[d]["local_storage"] = {"id": 0, "name": "auto_generated_by_mockgun", "type": "LocalStorage"} + if "local_path_linux" not in data[d]: + data[d]["local_path_linux"] = data[d]["local_path"] + if "local_path_windows" not in data[d]: + data[d]["local_path_windows"] = data[d]["local_path"] + if "local_path_mac" not in data[d]: + data[d]["local_path_mac"] = data[d]["local_path"] + + self._validate_entity_type(entity_type) + self._validate_entity_data(entity_type, data) + self._validate_entity_fields(entity_type, return_fields) + try: + # get next id in this table + next_id = max(self._db[entity_type]) + 1 + except ValueError: + next_id = 1 + + row = self._get_new_row(entity_type) + + self._update_row(entity_type, row, data) + row["id"] = next_id + + self._db[entity_type][next_id] = row + + if return_fields is None: + result = dict((field, self._get_field_from_row(entity_type, row, field)) for field in data) + else: + result = dict((field, self._get_field_from_row(entity_type, row, field)) for field in return_fields) + + result["type"] = row["type"] + result["id"] = row["id"] + + return result + + def update(self, entity_type, entity_id, data): + self._validate_entity_type(entity_type) + self._validate_entity_data(entity_type, data) + self._validate_entity_exists(entity_type, entity_id) + + row = self._db[entity_type][entity_id] + self._update_row(entity_type, row, data) + + return [dict((field, item) for field, item in row.items() if field in data or field in ("type", "id"))] + + def delete(self, entity_type, entity_id): + self._validate_entity_type(entity_type) + self._validate_entity_exists(entity_type, entity_id) + + row = self._db[entity_type][entity_id] + if not row["__retired"]: + row["__retired"] = True + return True + else: + return False + + def revive(self, entity_type, entity_id): + self._validate_entity_type(entity_type) + self._validate_entity_exists(entity_type, entity_id) + + row = self._db[entity_type][entity_id] + if row["__retired"]: + row["__retired"] = False + return True + else: + return False + + def upload(self, entity_type, entity_id, path, field_name=None, display_name=None, tag_list=None): + raise NotImplementedError + + def upload_thumbnail(self, entity_type, entity_id, path, **kwargs): + pass + + ################################################################################################### + # internal methods and members + + def _validate_entity_type(self, entity_type): + if entity_type not in self._schema: + raise ShotgunError("%s is not a valid entity" % entity_type) + + def _validate_entity_data(self, entity_type, data): + if "id" in data or "type" in data: + raise ShotgunError("Can't set id or type on create or update") + + self._validate_entity_fields(entity_type, data.keys()) + + for field, item in data.items(): + + if item is None: + # none is always ok + continue + + field_info = self._schema[entity_type][field] + + if field_info["data_type"]["value"] == "multi_entity": + if not isinstance(item, list): + raise ShotgunError("%s.%s is of type multi_entity, but data %s is not a list" % (entity_type, field, item)) + elif item and any(not isinstance(sub_item, dict) for sub_item in item): + raise ShotgunError("%s.%s is of type multi_entity, but data %s contains a non-dictionary" % (entity_type, field, item)) + elif item and any("id" not in sub_item or "type" not in sub_item for sub_item in item): + raise ShotgunError("%s.%s is of type multi-entity, but an item in data %s does not contain 'type' and 'id'" % (entity_type, field, item)) + elif item and any(sub_item["type"] not in field_info["properties"]["valid_types"]["value"] for sub_item in item): + raise ShotgunError("%s.%s is of multi-type entity, but an item in data %s has an invalid type (expected one of %s)" % (entity_type, field, item, field_info["properties"]["valid_types"]["value"])) + + + elif field_info["data_type"]["value"] == "entity": + if not isinstance(item, dict): + raise ShotgunError("%s.%s is of type entity, but data %s is not a dictionary" % (entity_type, field, item)) + elif "id" not in item or "type" not in item: + raise ShotgunError("%s.%s is of type entity, but data %s does not contain 'type' and 'id'" % (entity_type, field, item)) + #elif item["type"] not in field_info["properties"]["valid_types"]["value"]: + # raise ShotgunError("%s.%s is of type entity, but data %s has an invalid type (expected one of %s)" % (entity_type, field, item, field_info["properties"]["valid_types"]["value"])) + + else: + try: + sg_type = field_info["data_type"]["value"] + python_type = {"number": int, + "float": float, + "checkbox": bool, + "text": basestring, + "serializable": dict, + "date": datetime.date, + "date_time": datetime.datetime, + "url": dict}[sg_type] + except KeyError: + raise ShotgunError("Field %s.%s: Handling for Shotgun type %s is not implemented" % (entity_type, field, sg_type)) + + if not isinstance(item, python_type): + raise ShotgunError("%s.%s is of type %s, but data %s is not of type %s" % (entity_type, field, type(item), sg_type, python_type)) + + # TODO: add check for correct timezone + + def _validate_entity_fields(self, entity_type, fields): + self._validate_entity_type(entity_type) + if fields is not None: + valid_fields = set(self._schema[entity_type].keys()) + for field in fields: + try: + field2, entity_type2, field3 = field.split(".", 2) + self._validate_entity_fields(entity_type2, [field3]) + except ValueError: + if field not in valid_fields and field not in ("type", "id"): + raise ShotgunError("%s is not a valid field for entity %s" % (field, entity_type)) + + def _get_default_value(self, entity_type, field): + field_info = self._schema[entity_type][field] + if field_info["data_type"]["value"] == "multi_entity": + default_value = [] + else: + default_value = field_info["properties"]["default_value"]["value"] + return default_value + + def _get_new_row(self, entity_type): + row = {"type": entity_type, "__retired": False} + for field in self._schema[entity_type]: + field_info = self._schema[entity_type][field] + if field_info["data_type"]["value"] == "multi_entity": + default_value = [] + else: + default_value = field_info["properties"]["default_value"]["value"] + row[field] = default_value + return row + + def _compare(self, field_type, lval, operator, rval): + if field_type == "checkbox": + if operator == "is": + return lval == rval + elif operator == "is_not": + return lval != rval + elif field_type in ("float", "number", "date", "date_time"): + if operator == "is": + return lval == rval + elif operator == "is_not": + return lval != rval + elif operator == "less_than": + return lval < rval + elif operator == "greater_than": + return lval > rval + elif operator == "between": + return lval >= rval[0] and lval <= rval[1] + elif operator == "not_between": + return lval < rval[0] or lval > rval[1] + elif operator == "in": + return lval in rval + elif field_type == "list": + if operator == "is": + return lval == rval + elif operator == "is_not": + return lval != rval + elif operator == "in": + return lval in rval + elif operator == "not_in": + return lval not in rval + elif field_type == "entity_type": + if operator == "is": + return lval == rval + elif field_type == "text": + if operator == "is": + return lval == rval + elif operator == "is_not": + return lval != rval + elif operator == "in": + return lval in rval + elif operator == "contains": + return lval in rval + elif operator == "not_contains": + return lval not in rval + elif operator == "starts_with": + return lval.startswith(rval) + elif operator == "ends_with": + return lval.endswith(rval) + elif field_type == "entity": + if operator == "is": + return lval["type"] == rval["type"] and lval["id"] == rval["id"] + elif operator == "is_not": + return lval["type"] != rval["type"] or lval["id"] != rval["id"] + elif operator == "in": + return all((lval["type"] == sub_rval["type"] and lval["id"] == sub_rval["id"]) for sub_rval in rval) + elif operator == "type_is": + return lval["type"] == rval + elif operator == "type_is_not": + return lval["type"] != rval + elif operator == "name_contains": + return rval in lval["name"] + elif operator == "name_not_contains": + return rval not in lval["name"] + elif operator == "name_starts_with": + return lval["name"].startswith(rval) + elif operator == "name_ends_with": + return lval["name"].endswith(rval) + elif field_type == "multi_entity": + if operator == "is": + return rval["id"] in (sub_lval["id"] for sub_lval in lval) + elif operator == "is_not": + return rval["id"] not in (sub_lval["id"] for sub_lval in lval) + + raise ShotgunError("The %s operator is not supported on the %s type" % (operator, field_type)) + + def _get_field_from_row(self, entity_type, row, field): + # split dotted form fields + try: + # is it something like sg_sequence.Sequence.code ? + field2, entity_type2, field3 = field.split(".", 2) + + if field2 in row: + + field_value = row[field2] + + # all deep links need to be link fields + if not isinstance(field_value, dict): + raise ShotgunError("Invalid deep query field %s.%s" % (entity_type, field)) + + # make sure that types in the query match type in the linked field + if entity_type2 != field_value["type"]: + raise ShotgunError("Deep query field %s.%s does not match type " + "with data %s" % (entity_type, field, field_value)) + + # ok so looks like the value is an entity link + # e.g. db contains: {"sg_sequence": {"type":"Sequence", "id": 123 } } + linked_row = self._db[ field_value["type"] ][ field_value["id"] ] + if field3 in linked_row: + return linked_row[field3] + else: + return None + + else: + # sg returns none for unknown stuff + return None + + except ValueError: + # this is not a deep-linked field - just something like "code" + if field in row: + return row[field] + else: + # sg returns none for unknown stuff + return None + + def _get_field_type(self, entity_type, field): + # split dotted form fields + try: + field2, entity_type2, field3 = field.split(".", 2) + return self._get_field_type(entity_type2, field3) + except ValueError: + return self._schema[entity_type][field]["data_type"]["value"] + + def _row_matches_filter(self, entity_type, row, filter): + + + try: + field, operator, rval = filter + except ValueError: + raise ShotgunError("Filters must be in the form [lval, operator, rval]") + lval = self._get_field_from_row(entity_type, row, field) + + field_type = self._get_field_type(entity_type, field) + + # if we're operating on an entity, we'll need to grab the name from the lval's row + if field_type == "entity": + lval_row = self._db[lval["type"]][lval["id"]] + if "name" in lval_row: + lval["name"] = lval_row["name"] + elif "code" in lval_row: + lval["name"] = lval_row["code"] + return self._compare(field_type, lval, operator, rval) + + def _row_matches_filters(self, entity_type, row, filters, filter_operator, retired_only): + + if retired_only and not row["__retired"] or not retired_only and row["__retired"]: + # ignore retired rows unless the retired_only flag is set + # ignore live rows if the retired_only flag is set + return False + elif filter_operator in ("all", None): + return all(self._row_matches_filter(entity_type, row, filter) for filter in filters) + elif filter_operator == "any": + return any(self._row_matches_filter(entity_type, row, filter) for filter in filters) + else: + raise ShotgunError("%s is not a valid filter operator" % filter_operator) + + + def _update_row(self, entity_type, row, data): + for field in data: + field_type = self._get_field_type(entity_type, field) + if field_type == "entity" and data[field]: + row[field] = {"type": data[field]["type"], "id": data[field]["id"]} + elif field_type == "multi_entity": + row[field] = [{"type": item["type"], "id": item["id"]} for item in data[field]] + else: + row[field] = data[field] + + + def _validate_entity_exists(self, entity_type, entity_id): + if entity_id not in self._db[entity_type]: + raise ShotgunError("No entity of type %s exists with id %s" % (entity_type, entity_id)) + + + + From 5002efeda27d1f6a5adebb33def2700b9785a8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 8 Sep 2015 22:22:54 +0100 Subject: [PATCH 082/389] [minor] Further improved and adjusted unit tests. - The activity stream tests won't work when a script user running the tests has got the 'generate events' checkbox ticked. There is now a check and a warning to indicate when this happens to make it easier to troubleshoot in the future. - Added explicit checks for the image parameter that is passed specifically in the user dictionary in replies in the note thread call. --- tests/test_api.py | 82 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 990273359..4a1969650 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1738,6 +1738,22 @@ def setUp(self): "project": self.project, "note_links": [self._shot]}) + # check that if the created_by is a script user, we want to ensure + # that event log generation is enabled for this user. If it has been + # disabled, these tests will fail because the activity stream is + # connected to events. In this case, print a warning to the user + d = self.sg.find_one("Shot", + [["id", "is", self._shot["id"] ]], + ["created_by.ApiUser.generate_event_log_entries"]) + + if d["created_by.ApiUser.generate_event_log_entries"] is False: + # events are turned off! warn the user + print("WARNING! Looks like the script user that is running these " + "tests has got the generate event log entries setting set to " + "off. This will cause the activity stream tests to fail. " + "Please enable event log generation for the script user.") + + def tearDown(self): batch_data = [] batch_data.append({"request_type": "delete", @@ -1747,7 +1763,7 @@ def tearDown(self): batch_data.append({"request_type": "delete", "entity_type": self._shot["type"], "entity_id": self._shot["id"] - }) + }) self.sg.batch(batch_data) super(TestActivityStream, self).tearDown() @@ -1827,6 +1843,11 @@ class TestNoteThreadRead(base.LiveTestBase): def setUp(self): super(TestNoteThreadRead, self).setUp() + + # get path to our std attahcment + this_dir, _ = os.path.split(__file__) + self._thumbnail_path = os.path.abspath(os.path.join(this_dir, "sg_logo.jpg")) + def _check_note(self, data, note_id, additional_fields): @@ -1853,17 +1874,21 @@ def _check_reply(self, data, reply_id, additional_fields): list(expected_fields)) # the reply stream adds an image to the user fields in order - # to include thumbnails for users, so add this in before we compare - reply_data["user"]["image"] = None + # to include thumbnails for users, so remove this before we compare + # against the shotgun find data. The image is tested elsewhere. + del data["user"]["image"] self.assertEqual(reply_data, data) def _check_attachment(self, data, attachment_id, additional_fields): - + + + + # check the expected fields expected_fields = set(["created_at", "created_by", "id", "type"] + additional_fields) self.assertEqual(expected_fields, set(data.keys())) - + # check that the data matches the data we get from a find call attachment_data = self.sg.find_one("Attachment", [["id", "is", attachment_id]], @@ -1881,6 +1906,29 @@ def test_simple(self): # create note note = self.sg.create( "Note", {"content": "Test!", "project": self.project}) + # for this test, we check that the replies returned also + # contain the thumbnail associated with the user doing the + # reply. For this, make sure that there is a thumbnail + # associated with the current user + + d = self.sg.find_one("Note", + [["id", "is", note["id"]]], + ["created_by", "created_by.ApiUser.image"]) + + current_thumbnail = d["created_by.ApiUser.image"] + + if current_thumbnail is None: + # upload thumbnail + self.sg.upload_thumbnail("ApiUser", + d["created_by"]["id"], + self._thumbnail_path) + + d = self.sg.find_one("Note", + [["id", "is", note["id"]]], + ["created_by", "created_by.ApiUser.image"]) + + current_thumbnail = d["created_by.ApiUser.image"] + # get thread result = self.sg.note_thread_read(note["id"]) self.assertEqual(len(result), 1) @@ -1892,13 +1940,22 @@ def test_simple(self): # get thread result = self.sg.note_thread_read(note["id"]) self.assertEqual(len(result), 2) + + # now check that the reply thumbnail field matches + # the uploaded thumbnail. strip off any s3 querystring + # for the comparison + reply_thumb = result[1]["user"]["image"] + url_obj_a = urlparse.urlparse(current_thumbnail) + url_obj_b = urlparse.urlparse(reply_thumb) + self.assertEqual("%s/%s" % (url_obj_a.netloc, url_obj_a.path), + "%s/%s" % (url_obj_b.netloc, url_obj_b.path),) + + # and check ther rest of the data self._check_note(result[0], note["id"], additional_fields=[]) self._check_reply(result[1], reply["id"], additional_fields=[]) # now upload an attachment - this_dir, _ = os.path.split(__file__) - path = os.path.abspath(os.path.join(this_dir, "sg_logo.jpg")) - attachment_id = self.sg.upload(note["type"], note["id"], path) + attachment_id = self.sg.upload(note["type"], note["id"], self._thumbnail_path) # get thread result = self.sg.note_thread_read(note["id"]) @@ -1921,7 +1978,7 @@ def test_complex(self): "playlist", "user" ], "Reply": ["content"], - "Attachment": ["local_storage", "this_file"] + "Attachment": ["this_file"] } # create note @@ -1945,15 +2002,14 @@ def test_complex(self): self._check_reply(result[1], reply["id"], additional_fields["Reply"]) # now upload an attachment - this_dir, _ = os.path.split(__file__) - path = os.path.abspath(os.path.join(this_dir, "sg_logo.jpg")) - attachment_id = self.sg.upload(note["type"], note["id"], path) - + attachment_id = self.sg.upload(note["type"], note["id"], self._thumbnail_path) + # get thread result = self.sg.note_thread_read(note["id"], additional_fields) self.assertEqual(len(result), 3) self._check_note(result[0], note["id"], additional_fields["Note"]) self._check_reply(result[1], reply["id"], additional_fields["Reply"]) + self._check_attachment(result[2], attachment_id, additional_fields["Attachment"]) class TestTextSearch(base.LiveTestBase): From 6f84acb2ff58ec769a7e3d0c7bb52861309361af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 8 Sep 2015 22:52:57 +0100 Subject: [PATCH 083/389] Packaging for v3.0.22 release --- README.md | 15 ++++++++++++--- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dcae79a2d..55e465528 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,18 @@ Integration and unit tests are provided. ## Changelog -**v3.0.22 - TBD** - - + TBD +**v3.0.22 - 2015 September 9** + + + Added method text_search() which allows an API client to access + the Shotgun global search and auto completer. + + Added method activity_stream_read() which allows an API client + to access the activity stream for a given Shotgun entity. + + Added method note_thread_read() which allows an API client to + download an entire note conversation, including replies and + attachments, using a single API call. + + Added an experimental 'mockgun' module which can be used to emulate + the Shotgun API, for example inside unit test rigs. + + [minor] Improved docstrings. **v3.0.21 - 2015 Aug 13** diff --git a/setup.py b/setup.py index 3dad3d6c8..45521fc87 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.21', + version='3.0.22', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index dc301db40..d5a5c51d0 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.22.dev" +__version__ = "3.0.22" # ---------------------------------------------------------------------------- # Errors From 380817aad497dd8dc65544e6f9fd53596de45019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 8 Sep 2015 22:55:49 +0100 Subject: [PATCH 084/389] [minor] Consistency tweaks. --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 55e465528..60b477779 100644 --- a/README.md +++ b/README.md @@ -53,16 +53,16 @@ Integration and unit tests are provided. ## Changelog -**v3.0.22 - 2015 September 9** +**v3.0.22 - 2015 Sept 9** - + Added method text_search() which allows an API client to access + + Added method `text_search()` which allows an API client to access the Shotgun global search and auto completer. - + Added method activity_stream_read() which allows an API client + + Added method `activity_stream_read()` which allows an API client to access the activity stream for a given Shotgun entity. - + Added method note_thread_read() which allows an API client to + + Added method `note_thread_read()` which allows an API client to download an entire note conversation, including replies and attachments, using a single API call. - + Added an experimental 'mockgun' module which can be used to emulate + + Added an experimental `mockgun` module which can be used to emulate the Shotgun API, for example inside unit test rigs. + [minor] Improved docstrings. @@ -208,17 +208,17 @@ Integration and unit tests are provided. + add batch() method to do multiple create, update, and delete requests in one request to the server (requires Shotgun server to be v1.13.0 or higher) -**v3.0b8 - 2010 February 19** +**v3.0b8 - 2010 Feb 19** + fix python gotcha about using lists / dictionaries as defaults. See: http://www.ferg.org/projects/python_gotchas.html#contents_item_6 + add schema_read method -**v3.0b7 - 2009 November 30** +**v3.0b7 - 2009 Nov 30** + add additional retries for connection errors and a catch for broken pipe exceptions -**v3.0b6 - 2009 October 20** +**v3.0b6 - 2009 Oct 20** + add support for HTTP/1.1 keepalive, which greatly improves performance for multiple requests + add more helpful error if server entered is not http or https From 8f5f51f5459cf40af88b735787bf46558ba92e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Wed, 9 Sep 2015 19:03:04 +0100 Subject: [PATCH 085/389] Bump version to v3.0.23.dev --- README.md | 4 ++++ shotgun_api3/shotgun.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 60b477779..9f4f49887 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.23 - TBD** + + + TBD + **v3.0.22 - 2015 Sept 9** + Added method `text_search()` which allows an API client to access diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index d5a5c51d0..9f62074af 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.22" +__version__ = "3.0.23.dev" # ---------------------------------------------------------------------------- # Errors From 1109d20cbcfc81c8e65df0fb4df29afe4e5562d6 Mon Sep 17 00:00:00 2001 From: KP Date: Tue, 15 Sep 2015 12:33:20 -0500 Subject: [PATCH 086/389] #30340 fix unittest and possible mimetypes errors on Win Python v2.7.8 Fixes a unittest issue where the path of some tests would be incorrectly extracted. Closes #74. Fixes a `TypeError` that could arise on Windows using Python v2.7.7/8 if you have NULL bytes in your registry. This is due to a bug in Python (http://bugs.python.org/issue23371) which was addressed in v2.7.9. The fix catches the exception that would be raised and loads the bundled and patched mimetypes library instead. Closes #88 Thanks to @patrickwolf for the reports and info --- README.md | 3 ++- shotgun_api3/sg_26.py | 6 ++++-- tests/test_api.py | 8 +++++++- tests/test_client.py | 3 ++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9f4f49887..bc1666a27 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,8 @@ Integration and unit tests are provided. **v3.0.23 - TBD** - + TBD + + Fix for python bug on Windows loading mimetypes module (http://bugs.python.org/issue23371) thanks to @patrickwolf. + + Fix for tests on older versions of python. **v3.0.22 - 2015 Sept 9** diff --git a/shotgun_api3/sg_26.py b/shotgun_api3/sg_26.py index 9a6b0e1a9..eee819e21 100644 --- a/shotgun_api3/sg_26.py +++ b/shotgun_api3/sg_26.py @@ -29,7 +29,9 @@ import mimetypes # used for attachment upload try: mimetypes.add_type('video/webm','.webm') # try adding to test for unicode error -except UnicodeDecodeError: - # Ticket #25579 python bug on windows with unicode +except (UnicodeDecodeError, TypeError): + # Ticket #25579: python bug on windows with unicode + # Ticket #23371: mimetypes initialization fails on Windows because of TypeError + # (http://bugs.python.org/issue23371) # Use patched version of mimetypes from .lib import mimetypes as mimetypes diff --git a/tests/test_api.py b/tests/test_api.py index 4a1969650..1b7984dd5 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -2142,11 +2142,17 @@ def _has_unicode(data): return False def _get_path(url): + """Returns path component of a url without the sheme, host, query, anchor, or any other + additional elements. + For example, the url "https://foo.shotgunstudio.com/page/2128#Shot_1190_sr10101_034" + returns "/page/2128" + """ # url_parse returns native objects for older python versions (2.4) if isinstance(url, dict): return url.get('path') elif isinstance(url, tuple): - return os.path.join(url[:4]) + # 3rd component is the path + return url[2] else: return url.path diff --git a/tests/test_client.py b/tests/test_client.py index 7460b5970..b3c19b3a7 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -382,7 +382,8 @@ def test_parse_records(self): system = platform.system().lower() if system =='darwin': local_path_field = "local_path_mac" - elif system == 'windows': + # python 2.4 returns 'Microsoft' + elif system in ['windows', 'microsoft']: local_path_field = "local_path_windows" elif system == 'linux': local_path_field = "local_path_linux" From 0ba15628924312b5572c001906224f7b0e8355e1 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Thu, 22 Oct 2015 19:21:52 -0400 Subject: [PATCH 087/389] For #32998 - Make sure auth params are sanitized prior to raising error containing them. --- shotgun_api3/shotgun.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 9f62074af..5aceb0383 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1379,7 +1379,7 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, except urllib2.HTTPError, e: if e.code == 500: raise ShotgunError("Server encountered an internal error. " - "\n%s\n(%s)\n%s\n\n" % (url, params, e)) + "\n%s\n(%s)\n%s\n\n" % (url, self._sanitize_auth_params(params), e)) else: raise ShotgunError("Unanticipated error occurred %s" % (e)) else: @@ -1491,7 +1491,7 @@ def upload(self, entity_type, entity_id, path, field_name=None, except urllib2.HTTPError, e: if e.code == 500: raise ShotgunError("Server encountered an internal error. " - "\n%s\n(%s)\n%s\n\n" % (url, params, e)) + "\n%s\n(%s)\n%s\n\n" % (url, self._sanitize_auth_params(params), e)) else: raise ShotgunError("Unanticipated error occurred uploading " "%s: %s" % (path, e)) @@ -2097,6 +2097,17 @@ def _auth_params(self): return auth_params + def _sanitize_auth_params(params): + """ + Given an authentication parameter dictionary, sanitize any sensitive + information and return the sanitized dict copy. + """ + sanitized_params = copy.copy(params) + for k in ['user_password', 'script_key', 'session_token']: + if k in sanitized_params: + sanitized_params[k] = '********' + return sanitized_params + def _build_payload(self, method, params, include_auth_params=True): """Builds the payload to be send to the rpc endpoint. From bafe55537d910b3b18a842c8d79def437097d13d Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Thu, 22 Oct 2015 23:32:38 -0400 Subject: [PATCH 088/389] For #32998 - Test for sanitize auth params and bugfix. --- shotgun_api3/shotgun.py | 2 +- tests/test_api.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 5aceb0383..34d570847 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2097,7 +2097,7 @@ def _auth_params(self): return auth_params - def _sanitize_auth_params(params): + def _sanitize_auth_params(self, params): """ Given an authentication parameter dictionary, sanitize any sensitive information and return the sanitized dict copy. diff --git a/tests/test_api.py b/tests/test_api.py index 1b7984dd5..d25549d37 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -12,6 +12,7 @@ import uuid import unittest import urlparse +import urllib2 import shotgun_api3 from shotgun_api3.lib.httplib2 import Http @@ -1469,6 +1470,25 @@ def test_status_not_200(self, mock_request): mock_request.return_value = (response, {}) self.assertRaises(shotgun_api3.ProtocolError, self.sg.find_one, 'Shot', []) + @patch.object(urllib2.OpenerDirector, 'open') + def test_sanitized_auth_params(self, mock_open): + # Simulate the server blowing up and giving us a 500 error + mock_open.side_effect = urllib2.HTTPError('url', 500, 'message', {}, None) + + this_dir, _ = os.path.split(__file__) + thumbnail_path = os.path.abspath(os.path.join(this_dir, "sg_logo.jpg")) + + try: + # Try to upload a bogus file + self.sg.upload('Note', 1234, thumbnail_path) + except shotgun_api3.ShotgunError, e: + self.assertFalse(self.api_key in e) + return + + # You should never get here... Otherwise some mocking failed and the + # except above wasn't properly run + self.assertTrue(False) + # def test_malformed_response(self): # #TODO ResponseError # pass From bcb4e2474a3a39c345225ea33922dabb7273ced2 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Thu, 22 Oct 2015 23:57:51 -0400 Subject: [PATCH 089/389] For #32998 - Bugfix for sanitized auth params test --- tests/test_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index d25549d37..e5d69b424 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1482,7 +1482,7 @@ def test_sanitized_auth_params(self, mock_open): # Try to upload a bogus file self.sg.upload('Note', 1234, thumbnail_path) except shotgun_api3.ShotgunError, e: - self.assertFalse(self.api_key in e) + self.assertFalse(self.api_key in str(e)) return # You should never get here... Otherwise some mocking failed and the From a108a6ed149770f587c32750b68ffe286dd00a31 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Mon, 26 Oct 2015 14:33:16 -0400 Subject: [PATCH 090/389] Packaging for v3.0.23 release --- README.md | 3 ++- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bc1666a27..c5ff5f667 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,11 @@ Integration and unit tests are provided. ## Changelog -**v3.0.23 - TBD** +**v3.0.23 - 2015 Oct 26** + Fix for python bug on Windows loading mimetypes module (http://bugs.python.org/issue23371) thanks to @patrickwolf. + Fix for tests on older versions of python. + + Sanitize authentication values before raising error. **v3.0.22 - 2015 Sept 9** diff --git a/setup.py b/setup.py index 45521fc87..b63a85312 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.22', + version='3.0.23', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 34d570847..425cf58a7 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.23.dev" +__version__ = "3.0.23" # ---------------------------------------------------------------------------- # Errors From e5f7ca6beda37049f3864cfa5ab057c000ac0548 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Mon, 26 Oct 2015 14:35:44 -0400 Subject: [PATCH 091/389] Bump version to v3.0.24.dev --- README.md | 4 ++++ shotgun_api3/shotgun.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c5ff5f667..0a7ee1744 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.24 - TBD** + + + TBD + **v3.0.23 - 2015 Oct 26** + Fix for python bug on Windows loading mimetypes module (http://bugs.python.org/issue23371) thanks to @patrickwolf. diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 425cf58a7..3050d0be7 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -76,7 +76,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.23" +__version__ = "3.0.24.dev" # ---------------------------------------------------------------------------- # Errors From 9bd65d43e43325eeb0497bc3579f2c68e9881693 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 7 Jan 2016 21:42:54 -0600 Subject: [PATCH 092/389] #34265 Add environment variable override for `NO_SSL_VALIDATION`. Package release v3.0.24 closes #96 --- README.md | 6 +++--- setup.py | 2 +- shotgun_api3/shotgun.py | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0a7ee1744..d88924a05 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,10 @@ Integration and unit tests are provided. ## Changelog -**v3.0.24 - TBD** - - + TBD +**v3.0.24 - 2016 Jan 08** + + Add environment variable override for `NO_SSL_VALIDATION`. + **v3.0.23 - 2015 Oct 26** + Fix for python bug on Windows loading mimetypes module (http://bugs.python.org/issue23371) thanks to @patrickwolf. diff --git a/setup.py b/setup.py index b63a85312..6e5d07e8a 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.23', + version='3.0.24', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 3050d0be7..0f6ee722f 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -67,16 +67,18 @@ SG_TIMEZONE = SgTimezone() +NO_SSL_VALIDATION = False try: import ssl - NO_SSL_VALIDATION = False + if os.environ.get("SHOTGUN_DISABLE_SSL_VALIDATION", False): + NO_SSL_VALIDATION = True except ImportError: LOG.debug("ssl not found, disabling certificate validation") NO_SSL_VALIDATION = True # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.24.dev" +__version__ = "3.0.24" # ---------------------------------------------------------------------------- # Errors From 3e72b44a5b0e128d532ca95e57fae600ad861693 Mon Sep 17 00:00:00 2001 From: KP Date: Tue, 12 Jan 2016 21:57:33 -0800 Subject: [PATCH 093/389] #34265 add handling for Python versions incompatible with SHA-2 The hosted Shotgun server certificates are being upgraded to more secure ones signed with SHA-2. Some older versions of Python will have issues with this change as they do not support SHA-2 encryption. In order to try and prevent scripts from breaking, when the API encounters a version of Python that is incompatible with SHA-2, it will automatically turn off certificate verification and try the request again. If the validation still fails for some reason, the error will be raised, otherwise the request succeeds and validation will remain off for the remaining life of the connection. There is also support for the `SHOTGUN_FORCE_CERTIFICATE_VALIDATION` environment variable which when set (the value does not matter), will prevent disabling certificate verification and will instead raise an exception. This behavior of having certificate validation off, is actually the default in Python versions < v2.7.9. Up to this point we have been electing to enhance the default level of security. Your connection is still encrypted when certificate validation is off, but the server identity cannot be verified. Adds info showing the OpenSSL version (if available) and whether certificate validation is enabled or not, to the user-agent string --- shotgun_api3/sg_24.py | 2 +- shotgun_api3/sg_25.py | 2 +- shotgun_api3/sg_26.py | 2 +- shotgun_api3/shotgun.py | 84 ++++++++++++++++++++++++++++++++++------- tests/test_api.py | 61 +++++++++++++++++++++++++++++- tests/test_client.py | 32 +++++++++++----- 6 files changed, 156 insertions(+), 27 deletions(-) diff --git a/shotgun_api3/sg_24.py b/shotgun_api3/sg_24.py index ea584ec79..457fb9699 100644 --- a/shotgun_api3/sg_24.py +++ b/shotgun_api3/sg_24.py @@ -2,7 +2,7 @@ import sys import logging -from shotgun_api3.lib.httplib2 import Http, ProxyInfo, socks +from shotgun_api3.lib.httplib2 import Http, ProxyInfo, socks, SSLHandshakeError from shotgun_api3.lib.sgtimezone import SgTimezone from shotgun_api3.lib.xmlrpclib import Error, ProtocolError, ResponseError import mimetypes # used for attachment upload diff --git a/shotgun_api3/sg_25.py b/shotgun_api3/sg_25.py index 3cd4a0d5b..88a52aa58 100644 --- a/shotgun_api3/sg_25.py +++ b/shotgun_api3/sg_25.py @@ -2,7 +2,7 @@ import os import logging -from .lib.httplib2 import Http, ProxyInfo, socks +from .lib.httplib2 import Http, ProxyInfo, socks, SSLHandshakeError from .lib.sgtimezone import SgTimezone from .lib.xmlrpclib import Error, ProtocolError, ResponseError import mimetypes # used for attachment upload diff --git a/shotgun_api3/sg_26.py b/shotgun_api3/sg_26.py index eee819e21..544bf069f 100644 --- a/shotgun_api3/sg_26.py +++ b/shotgun_api3/sg_26.py @@ -2,7 +2,7 @@ import os import logging -from .lib.httplib2 import Http, ProxyInfo, socks +from .lib.httplib2 import Http, ProxyInfo, socks, SSLHandshakeError from .lib.sgtimezone import SgTimezone from .lib.xmlrpclib import Error, ProtocolError, ResponseError diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 0f6ee722f..66ee979f6 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -66,19 +66,19 @@ SG_TIMEZONE = SgTimezone() - NO_SSL_VALIDATION = False try: - import ssl - if os.environ.get("SHOTGUN_DISABLE_SSL_VALIDATION", False): - NO_SSL_VALIDATION = True -except ImportError: + import ssl +except ImportError, e: + if "SHOTGUN_FORCE_CERTIFICATE_VALIDATION" in os.environ: + raise ImportError("%s. SHOTGUN_FORCE_CERTIFICATE_VALIDATION environment variable prevents " + "disabling SSL certificate validation." % e) LOG.debug("ssl not found, disabling certificate validation") NO_SSL_VALIDATION = True # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.24" +__version__ = "3.0.25.Dev" # ---------------------------------------------------------------------------- # Errors @@ -217,10 +217,18 @@ def __init__(self): self.py_version = ".".join(str(x) for x in sys.version_info[:2]) + # extract the OpenSSL version if we can. The version is only available in Python 2.7 and + # only if we successfully imported ssl + self.ssl_version = "unknown" + try: + self.ssl_version = ssl.OPENSSL_VERSION + except (AttributeError, NameError): + pass + def __str__(self): return "ClientCapabilities: platform %s, local_path_field %s, "\ - "py_verison %s" % (self.platform, self.local_path_field, - self.py_version) + "py_verison %s, ssl version %s" % (self.platform, self.local_path_field, + self.py_version, self.ssl_version) class _Config(object): """Container for the client configuration.""" @@ -1259,13 +1267,22 @@ def add_user_agent(self, agent): def reset_user_agent(self): """Reset user agent to the default. - Eg. shotgun-json (3.0.17); Python 2.6 (Mac) + Eg. "shotgun-json (3.0.17); Python 2.6 (Mac); ssl OpenSSL 1.0.2d 9 Jul 2015 (validate)" """ ua_platform = "Unknown" if self.client_caps.platform is not None: ua_platform = self.client_caps.platform.capitalize() + + + # create ssl validation string based on settings + validation_str = "validate" + if self.config.no_ssl_validation: + validation_str = "no-validate" + self._user_agents = ["shotgun-json (%s)" % __version__, - "Python %s (%s)" % (self.client_caps.py_version, ua_platform)] + "Python %s (%s)" % (self.client_caps.py_version, ua_platform), + "ssl %s (%s)" % (self.client_caps.ssl_version, validation_str)] + def set_session_uuid(self, session_uuid): """Sets the browser session_uuid for this API session. @@ -2000,6 +2017,16 @@ def _build_opener(self, handler): opener = urllib2.build_opener(handler) return opener + def _turn_off_ssl_validation(self): + """Turn off SSL certificate validation.""" + global NO_SSL_VALIDATION + self.config.no_ssl_validation = True + NO_SSL_VALIDATION = True + # reset ssl-validation in user-agents + self._user_agents = ["ssl %s (no-validate)" % self.client_caps.ssl_version + if ua.startswith("ssl ") else ua + for ua in self._user_agents] + # Deprecated methods from old wrapper def schema(self, entity_type): raise ShotgunError("Deprecated: use schema_field_read('type':'%s') " @@ -2149,9 +2176,8 @@ def _make_call(self, verb, path, body, headers): """ attempt = 0 - req_headers = { - "user-agent": "; ".join(self._user_agents), - } + req_headers = {} + req_headers["user-agent"] = "; ".join(self._user_agents) if self.config.authorization: req_headers["Authorization"] = self.config.authorization @@ -2164,6 +2190,38 @@ def _make_call(self, verb, path, body, headers): attempt += 1 try: return self._http_request(verb, path, body, req_headers) + except SSLHandshakeError, e: + # Test whether the exception is due to the fact that this is an older version of + # Python that cannot validate certificates encrypted with SHA-2. If it is, then + # fall back on disabling the certificate validation and try again - unless the + # SHOTGUN_FORCE_CERTIFICATE_VALIDATION environment variable has been set by the + # user. In that case we simply raise the exception. Any other exceptions simply + # get raised as well. + # + # For more info see: + # http://blog.shotgunsoftware.com/2016/01/important-ssl-certificate-renewal-and.html + # + # SHA-2 errors look like this: + # [Errno 1] _ssl.c:480: error:0D0C50A1:asn1 encoding routines:ASN1_item_verify: + # unknown message digest algorithm + # + # Any other exceptions simply get raised. + if not str(e).endswith("unknown message digest algorithm") or \ + "SHOTGUN_FORCE_CERTIFICATE_VALIDATION" in os.environ: + raise + + if self.config.no_ssl_validation is False: + LOG.warning("SSLHandshakeError: this Python installation is incompatible with " + "certificates signed with SHA-2. Disabling certificate validation. " + "For more information, see http://blog.shotgunsoftware.com/2016/01/" + "important-ssl-certificate-renewal-and.html") + self._turn_off_ssl_validation() + # reload user agent to reflect that we have turned off ssl validation + req_headers["user-agent"] = "; ".join(self._user_agents) + + self._close_connection() + if attempt == max_rpc_attempts: + raise except Exception: #TODO: LOG ? self._close_connection() diff --git a/tests/test_api.py b/tests/test_api.py index e5d69b424..697b1d8ca 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -15,7 +15,7 @@ import urllib2 import shotgun_api3 -from shotgun_api3.lib.httplib2 import Http +from shotgun_api3.lib.httplib2 import Http, SSLHandshakeError import base @@ -1470,6 +1470,65 @@ def test_status_not_200(self, mock_request): mock_request.return_value = (response, {}) self.assertRaises(shotgun_api3.ProtocolError, self.sg.find_one, 'Shot', []) + @patch('shotgun_api3.shotgun.Http.request') + def test_sha2_error(self, mock_request): + # Simulate the SSLHandshakeError raised with SHA-2 errors + mock_request.side_effect = SSLHandshakeError("[Errno 1] _ssl.c:480: error:0D0C50A1:asn1 " + "encoding routines:ASN1_item_verify: unknown message digest " + "algorithm") + + # save the original state + original_env_val = os.environ.pop("SHOTGUN_FORCE_CERTIFICATE_VALIDATION", None) + + # ensure we're starting with the right values + self.sg.reset_user_agent() + + # ensure the initial settings are correct + self.assertFalse(self.sg.config.no_ssl_validation) + self.assertFalse(shotgun_api3.shotgun.NO_SSL_VALIDATION) + self.assertTrue("(validate)" in " ".join(self.sg._user_agents)) + self.assertFalse("(no-validate)" in " ".join(self.sg._user_agents)) + try: + result = self.sg.info() + except SSLHandshakeError: + # ensure the api has reset the values in the correct fallback behavior + self.assertTrue(self.sg.config.no_ssl_validation) + self.assertTrue(shotgun_api3.shotgun.NO_SSL_VALIDATION) + self.assertFalse("(validate)" in " ".join(self.sg._user_agents)) + self.assertTrue("(no-validate)" in " ".join(self.sg._user_agents)) + + if original_env_val is not None: + os.environ["SHOTGUN_FORCE_CERTIFICATE_VALIDATION"] = original_env_val + + @patch('shotgun_api3.shotgun.Http.request') + def test_sha2_error_with_strict(self, mock_request): + # Simulate the SSLHandshakeError raised with SHA-2 errors + mock_request.side_effect = SSLHandshakeError("[Errno 1] _ssl.c:480: error:0D0C50A1:asn1 " + "encoding routines:ASN1_item_verify: unknown message digest " + "algorithm") + + # save the original state + original_env_val = os.environ.pop("SHOTGUN_FORCE_CERTIFICATE_VALIDATION", None) + os.environ["SHOTGUN_FORCE_CERTIFICATE_VALIDATION"] = "1" + + # ensure we're starting with the right values + self.sg.config.no_ssl_validation = False + shotgun_api3.shotgun.NO_SSL_VALIDATION = False + self.sg.reset_user_agent() + + try: + result = self.sg.info() + except SSLHandshakeError: + # ensure the api has NOT reset the values in the fallback behavior because we have + # set the env variable to force validation + self.assertFalse(self.sg.config.no_ssl_validation) + self.assertFalse(shotgun_api3.shotgun.NO_SSL_VALIDATION) + self.assertFalse("(no-validate)" in " ".join(self.sg._user_agents)) + self.assertTrue("(validate)" in " ".join(self.sg._user_agents)) + + if original_env_val is not None: + os.environ["SHOTGUN_FORCE_CERTIFICATE_VALIDATION"] = original_env_val + @patch.object(urllib2.OpenerDirector, 'open') def test_sanitized_auth_params(self, mock_open): # Simulate the server blowing up and giving us a 500 error diff --git a/tests/test_client.py b/tests/test_client.py index b3c19b3a7..00e110f82 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -48,6 +48,8 @@ def test_detect_client_caps(self): self.assertTrue(str(client_caps).startswith("ClientCapabilities")) self.assertTrue(client_caps.py_version.startswith(str(sys.version_info[0]))) self.assertTrue(client_caps.py_version.endswith(str(sys.version_info[1]))) + self.assertTrue(client_caps.ssl_version is not None) + # todo test for version string (eg. "1.2.3ng") or "unknown" def test_detect_server_caps(self): '''test_detect_server_caps tests that ServerCapabilities object is made @@ -158,12 +160,17 @@ def test_user_agent(self): # test default user agent self.sg.info() client_caps = self.sg.client_caps + config = self.sg.config args, _ = self.sg._http_request.call_args (_, _, _, headers) = args - expected = "shotgun-json (%s); Python %s (%s)" % (api.__version__, - client_caps.py_version, - client_caps.platform.capitalize() - ) + ssl_validate_lut = {True: "no-validate", False: "validate"} + expected = "shotgun-json (%s); Python %s (%s); ssl %s (%s)" % ( + api.__version__, + client_caps.py_version, + client_caps.platform.capitalize(), + client_caps.ssl_version, + ssl_validate_lut[config.no_ssl_validation] + ) self.assertEqual(expected, headers.get("user-agent")) # test adding to user agent @@ -171,10 +178,12 @@ def test_user_agent(self): self.sg.info() args, _ = self.sg._http_request.call_args (_, _, _, headers) = args - expected = "shotgun-json (%s); Python %s (%s); test-agent" % ( + expected = "shotgun-json (%s); Python %s (%s); ssl %s (%s); test-agent" % ( api.__version__, client_caps.py_version, - client_caps.platform.capitalize() + client_caps.platform.capitalize(), + client_caps.ssl_version, + ssl_validate_lut[config.no_ssl_validation] ) self.assertEqual(expected, headers.get("user-agent")) @@ -183,10 +192,13 @@ def test_user_agent(self): self.sg.info() args, _ = self.sg._http_request.call_args (_, _, _, headers) = args - expected = "shotgun-json (%s); Python %s (%s)" % (api.__version__, - client_caps.py_version, - client_caps.platform.capitalize(), - ) + expected = "shotgun-json (%s); Python %s (%s); ssl %s (%s)" % ( + api.__version__, + client_caps.py_version, + client_caps.platform.capitalize(), + client_caps.ssl_version, + ssl_validate_lut[config.no_ssl_validation] + ) self.assertEqual(expected, headers.get("user-agent")) def test_connect_close(self): From 85c611c0fb9efe1ac71d4769dbc59300b93408b6 Mon Sep 17 00:00:00 2001 From: KP Date: Tue, 12 Jan 2016 22:13:23 -0800 Subject: [PATCH 094/389] packaging for the v3.0.25 release --- README.md | 8 +++++++- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d88924a05..5d8db15c2 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,15 @@ Integration and unit tests are provided. ## Changelog +**v3.0.25 - 2016 Jan 12** + + + Add handling for Python versions incompatible with SHA-2 (see http://blog.shotgunsoftware.com/2016/01/important-ssl-certificate-renewal-and.html). + + Add SHOTGUN_FORCE_CERTIFICATE_VALIDATION environment variable to prevent disabling certficate validation when SHA-2 validation is not available. + + Add SSL info to user-agent header. + **v3.0.24 - 2016 Jan 08** - + Add environment variable override for `NO_SSL_VALIDATION`. + + Not released. **v3.0.23 - 2015 Oct 26** diff --git a/setup.py b/setup.py index 6e5d07e8a..b68bdafa8 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.24', + version='3.0.25', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 66ee979f6..8a5e2d026 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.25.Dev" +__version__ = "3.0.25" # ---------------------------------------------------------------------------- # Errors From 92c835da34af20158b2c03e84e8624841b658e5e Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 14 Jan 2016 00:04:23 -0800 Subject: [PATCH 095/389] [minor] fix for SHA-2 test when ssl isn't available --- tests/test_api.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 697b1d8ca..2442619c3 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -5,6 +5,7 @@ """ import datetime +import sys import os import re from mock import patch, Mock, MagicMock @@ -1483,11 +1484,19 @@ def test_sha2_error(self, mock_request): # ensure we're starting with the right values self.sg.reset_user_agent() - # ensure the initial settings are correct - self.assertFalse(self.sg.config.no_ssl_validation) - self.assertFalse(shotgun_api3.shotgun.NO_SSL_VALIDATION) - self.assertTrue("(validate)" in " ".join(self.sg._user_agents)) - self.assertFalse("(no-validate)" in " ".join(self.sg._user_agents)) + # ensure the initial settings are correct. These will be different depending on whether + # the ssl module imported successfully or not. + if "ssl" in sys.modules: + self.assertFalse(self.sg.config.no_ssl_validation) + self.assertFalse(shotgun_api3.shotgun.NO_SSL_VALIDATION) + self.assertTrue("(validate)" in " ".join(self.sg._user_agents)) + self.assertFalse("(no-validate)" in " ".join(self.sg._user_agents)) + else: + self.assertTrue(self.sg.config.no_ssl_validation) + self.assertTrue(shotgun_api3.shotgun.NO_SSL_VALIDATION) + self.assertFalse("(validate)" in " ".join(self.sg._user_agents)) + self.assertTrue("(no-validate)" in " ".join(self.sg._user_agents)) + try: result = self.sg.info() except SSLHandshakeError: From e5449df4c5fcbd8c730ab4e5cc6d9a53deda2b8a Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 14 Jan 2016 00:08:04 -0800 Subject: [PATCH 096/389] bump version to v3.0.26.dev --- README.md | 2 ++ shotgun_api3/shotgun.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d8db15c2..efa52187d 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,8 @@ Integration and unit tests are provided. ## Changelog +**v3.0.26 - TBD** + **v3.0.25 - 2016 Jan 12** + Add handling for Python versions incompatible with SHA-2 (see http://blog.shotgunsoftware.com/2016/01/important-ssl-certificate-renewal-and.html). diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 8a5e2d026..ff56db1a7 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.25" +__version__ = "3.0.26.dev" # ---------------------------------------------------------------------------- # Errors From 78383bfd5c8d227655e5d082f23dc0755f448d2f Mon Sep 17 00:00:00 2001 From: Samuel Date: Fri, 22 Jan 2016 13:14:21 -0500 Subject: [PATCH 097/389] Fixed requirement of a deprecated field name to upload a thumbnail using the upload function. Added appropriate unit test. --- shotgun_api3/shotgun.py | 7 ++++--- tests/test_api.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index ff56db1a7..9e84266ff 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1425,7 +1425,7 @@ def upload_thumbnail(self, entity_type, entity_id, path, **kwargs): :returns: Id of the new attachment """ return self.upload(entity_type, entity_id, path, - field_name="thumb_image", **kwargs) + field_name="image", **kwargs) def upload_filmstrip_thumbnail(self, entity_type, entity_id, path, **kwargs): """Convenience function for uploading filmstrip thumbnails. @@ -1443,7 +1443,7 @@ def upload_filmstrip_thumbnail(self, entity_type, entity_id, path, **kwargs): "higher, server is %s" % (self.server_caps.version,)) return self.upload(entity_type, entity_id, path, - field_name="filmstrip_thumb_image", **kwargs) + field_name="filmstrip_image", **kwargs) def upload(self, entity_type, entity_id, path, field_name=None, display_name=None, tag_list=None): @@ -1470,7 +1470,8 @@ def upload(self, entity_type, entity_id, path, field_name=None, if not os.path.isfile(path): raise ShotgunError("Path must be a valid file, got '%s'" % path) - is_thumbnail = (field_name == "thumb_image" or field_name == "filmstrip_thumb_image") + is_thumbnail = (field_name == "thumb_image" or field_name == "filmstrip_thumb_image" + or field_name == "image" or field_name == "filmstrip_image") params = { "entity_type" : entity_type, diff --git a/tests/test_api.py b/tests/test_api.py index 2442619c3..4056e5454 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -318,6 +318,17 @@ def test_upload_thumbnail_for_task(self): self.version['id'], {'image': None}) expected_clear_thumbnail = {'id': self.version['id'], 'image': None, 'type': 'Version'} self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) + + def test_upload_thumbnail_with_upload_function(self): + """Upload thumbnail via upload function test""" + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.expanduser( + os.path.join(this_dir,"sg_logo.jpg"))) + size = os.stat(path).st_size + + # upload thumbnail + thumb_id = self.sg.upload("Task", self.task['id'], path, 'image') + self.assertTrue(isinstance(thumb_id, int)) def test_linked_thumbnail_url(self): this_dir, _ = os.path.split(__file__) From fb64bf5e6e599d4a9adff6828c51a3bff5b1160e Mon Sep 17 00:00:00 2001 From: Samuel Date: Fri, 22 Jan 2016 16:14:08 -0500 Subject: [PATCH 098/389] For ticket #34463 ready for code review --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 9e84266ff..de7471c1e 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1471,7 +1471,7 @@ def upload(self, entity_type, entity_id, path, field_name=None, raise ShotgunError("Path must be a valid file, got '%s'" % path) is_thumbnail = (field_name == "thumb_image" or field_name == "filmstrip_thumb_image" - or field_name == "image" or field_name == "filmstrip_image") + or field_name == "image" or field_name == "filmstrip_image") params = { "entity_type" : entity_type, From fb6a09cff832e74ef517bc404f45aba17ca3181c Mon Sep 17 00:00:00 2001 From: Samuel Date: Tue, 26 Jan 2016 10:19:34 -0500 Subject: [PATCH 099/389] For #34463 changed condition to more readable format --- shotgun_api3/shotgun.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index de7471c1e..0296e59d6 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1470,8 +1470,8 @@ def upload(self, entity_type, entity_id, path, field_name=None, if not os.path.isfile(path): raise ShotgunError("Path must be a valid file, got '%s'" % path) - is_thumbnail = (field_name == "thumb_image" or field_name == "filmstrip_thumb_image" - or field_name == "image" or field_name == "filmstrip_image") + is_thumbnail = (field_name in ["thumb_image", "filmstrip_thumb_image", "image", + "filmstrip_image"]) params = { "entity_type" : entity_type, From 205c4b55b38891d9e4866bf8f901cc89966737e8 Mon Sep 17 00:00:00 2001 From: Samuel Date: Tue, 26 Jan 2016 10:36:29 -0500 Subject: [PATCH 100/389] Removed magical code --- tests/test_api.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 4056e5454..3ac832128 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -321,11 +321,6 @@ def test_upload_thumbnail_for_task(self): def test_upload_thumbnail_with_upload_function(self): """Upload thumbnail via upload function test""" - this_dir, _ = os.path.split(__file__) - path = os.path.abspath(os.path.expanduser( - os.path.join(this_dir,"sg_logo.jpg"))) - size = os.stat(path).st_size - # upload thumbnail thumb_id = self.sg.upload("Task", self.task['id'], path, 'image') self.assertTrue(isinstance(thumb_id, int)) From adf5f7d0b5fc87dbb89faf0ba2b21fcb66a288c2 Mon Sep 17 00:00:00 2001 From: Samuel Date: Tue, 26 Jan 2016 10:42:36 -0500 Subject: [PATCH 101/389] Returned magical code :( --- tests/test_api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index 3ac832128..0a7b344bb 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -321,6 +321,8 @@ def test_upload_thumbnail_for_task(self): def test_upload_thumbnail_with_upload_function(self): """Upload thumbnail via upload function test""" + size = os.stat(path).st_size + # upload thumbnail thumb_id = self.sg.upload("Task", self.task['id'], path, 'image') self.assertTrue(isinstance(thumb_id, int)) From 031a369134f361ee236fcad92f0218d9091065b0 Mon Sep 17 00:00:00 2001 From: Samuel Date: Tue, 26 Jan 2016 11:17:55 -0500 Subject: [PATCH 102/389] Added filmstrip unit test --- shotgun_api3/shotgun.py | 2 +- tests/test_api.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 0296e59d6..c7c7fca69 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1484,7 +1484,7 @@ def upload(self, entity_type, entity_id, path, field_name=None, url = urlparse.urlunparse((self.config.scheme, self.config.server, "/upload/publish_thumbnail", None, None, None)) params["thumb_image"] = open(path, "rb") - if field_name == "filmstrip_thumb_image": + if field_name == "filmstrip_thumb_image" or field_name == "filmstrip_image": params["filmstrip"] = True else: diff --git a/tests/test_api.py b/tests/test_api.py index 0a7b344bb..00435b3ce 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -326,7 +326,11 @@ def test_upload_thumbnail_with_upload_function(self): # upload thumbnail thumb_id = self.sg.upload("Task", self.task['id'], path, 'image') self.assertTrue(isinstance(thumb_id, int)) - + + #upload filmstrip thumbnail + f_thumb_id = self.sg.upload("Task", self.task['id'], path, 'filmstrip_image') + self.assertTrue(isinstance(f_thumb_id, int)) + def test_linked_thumbnail_url(self): this_dir, _ = os.path.split(__file__) path = os.path.abspath(os.path.expanduser( From 399d602c7ce407dbb7ae1690638c5bafd68bfb0b Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Wed, 27 Jan 2016 02:03:21 -0800 Subject: [PATCH 103/389] Cleaning up tests so travis-ci can automate them all --- .travis.yml | 4 ++-- shotgun_api3/shotgun.py | 2 +- tests/base.py | 5 +++-- tests/test_client.py | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index caab72b30..e8f7da4d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,11 @@ python: - "2.7" # command to install dependencies install: - - pip install nose --use-mirrors + - pip install nose before_script: - cp ./tests/example_config ./tests/config # command to run tests -script: nosetests tests.tests_unit tests.test_client +script: nosetests -w tests/ notifications: email: - api@shotgunsoftware.com diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index ff56db1a7..07d773529 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -409,7 +409,7 @@ def __init__(self, else: self.__ca_certs = os.environ.get('SHOTGUN_API_CACERTS') - self.base_url = (base_url or "").lower() + self.base_url = (base_url or "") self.config.scheme, self.config.server, api_base, _, _ = \ urlparse.urlsplit(self.base_url) if self.config.scheme not in ("http", "https"): diff --git a/tests/base.py b/tests/base.py index 201844b4f..ca48829dd 100644 --- a/tests/base.py +++ b/tests/base.py @@ -1,4 +1,5 @@ """Base class for Shotgun API tests.""" +import os import re import unittest from ConfigParser import ConfigParser @@ -300,13 +301,13 @@ def __init__(self): self.shot_code = None self.task_content = None - def read_config(self, config_path): config_parser = ConfigParser() config_parser.read(config_path) for section in config_parser.sections(): for option in config_parser.options(section): - value = config_parser.get(section, option) + value = (os.environ.get('SG_{0}'.format(str(option).upper())) or + config_parser.get(section, option)) setattr(self, option, value) diff --git a/tests/test_client.py b/tests/test_client.py index 00e110f82..ade91a249 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -240,7 +240,7 @@ def test_rpc_error(self): try: self.sg.info() - except api.Fault, e: + except api.Fault as e: self.assertEqual("Go BANG", str(e)) def test_call_rpc(self): From 01ae5ce8e06ce4ee8973d13d85ebbef924f288cb Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Wed, 27 Jan 2016 13:09:34 -0800 Subject: [PATCH 104/389] For #34500 : Updating base to be clearer about env vars, changing nosetests call so config will be correctly picked up, applying manne's feedback --- .travis.yml | 2 +- shotgun_api3/shotgun.py | 4 ++-- tests/base.py | 39 ++++++++++++++++++++++----------------- tests/test_client.py | 2 +- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/.travis.yml b/.travis.yml index e8f7da4d2..cd190b41d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ install: before_script: - cp ./tests/example_config ./tests/config # command to run tests -script: nosetests -w tests/ +script: nosetests -v notifications: email: - api@shotgunsoftware.com diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 07d773529..ceb1b7c97 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -409,7 +409,7 @@ def __init__(self, else: self.__ca_certs = os.environ.get('SHOTGUN_API_CACERTS') - self.base_url = (base_url or "") + self.base_url = (base_url or "").lower() self.config.scheme, self.config.server, api_base, _, _ = \ urlparse.urlsplit(self.base_url) if self.config.scheme not in ("http", "https"): @@ -422,7 +422,7 @@ def __init__(self, # if the service contains user information strip it out # copied from the xmlrpclib which turned the user:password into # and auth header - auth, self.config.server = urllib.splituser(self.config.server) + auth, self.config.server = urllib.splituser(urlparse.urlsplit(base_url).netloc) if auth: auth = base64.encodestring(urllib.unquote(auth)) self.config.authorization = "Basic " + auth.strip() diff --git a/tests/base.py b/tests/base.py index ca48829dd..587b186a3 100644 --- a/tests/base.py +++ b/tests/base.py @@ -286,29 +286,34 @@ def setUp(self): class SgTestConfig(object): '''Reads test config and holds values''' def __init__(self): - self.mock = True - self.server_url = None - self.script_name = None - self.api_key = None - self.http_proxy = None - self.session_uuid = None - self.project_name = None - self.human_name = None - self.human_login = None - self.human_password = None - self.asset_code = None - self.version_code = None - self.shot_code = None - self.task_content = None + + for key in self.config_keys(): + value = None + if key in ['mock']: + value = True + # Look for any environment variables that match our test + # configuration naming of "SG_{KEY}". Default is None. + value = os.environ.get('SG_{0}'.format(str(key).upper())) + setattr(self, key, value) + + def config_keys(self): + return [ + 'api_key', 'asset_code', 'http_proxy', 'human_login', 'human_name', + 'human_password', 'mock', 'project_name', 'script_name', + 'server_url', 'session_uuid', 'shot_code', 'task_content', + 'version_code' + ] def read_config(self, config_path): config_parser = ConfigParser() config_parser.read(config_path) for section in config_parser.sections(): for option in config_parser.options(section): - value = (os.environ.get('SG_{0}'.format(str(option).upper())) or - config_parser.get(section, option)) - setattr(self, option, value) + # We only care about the configuration file if an environment + # variable has not already been set + if not getattr(self, option, None): + value = config_parser.get(section, option) + setattr(self, option, value) def _find_or_create_entity(sg, entity_type, data, identifyiers=None): diff --git a/tests/test_client.py b/tests/test_client.py index ade91a249..00e110f82 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -240,7 +240,7 @@ def test_rpc_error(self): try: self.sg.info() - except api.Fault as e: + except api.Fault, e: self.assertEqual("Go BANG", str(e)) def test_call_rpc(self): From 36f6b6b45b9acd2e7f613657f5daf8877e90140b Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Thu, 28 Jan 2016 09:46:30 -0800 Subject: [PATCH 105/389] For #34500 : Removing .format for 2.4|2.5 compatibility; Adding check for boolean variables. --- tests/base.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/base.py b/tests/base.py index 587b186a3..023bbb35e 100644 --- a/tests/base.py +++ b/tests/base.py @@ -288,12 +288,17 @@ class SgTestConfig(object): def __init__(self): for key in self.config_keys(): - value = None - if key in ['mock']: - value = True + # Look for any environment variables that match our test # configuration naming of "SG_{KEY}". Default is None. - value = os.environ.get('SG_{0}'.format(str(key).upper())) + value = os.environ.get('SG_%s' % (str(key).upper())) + + if key in ['mock']: + if value == None or str(value).lower() in ['true','1']: + value = True + else: + value = False + setattr(self, key, value) def config_keys(self): From ee3aa67dc4c4ea3f9c53f679592ffbaf4e2bfcb9 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Thu, 28 Jan 2016 10:01:49 -0800 Subject: [PATCH 106/389] For #34500 : Updating value checking syntax for brevity --- tests/base.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/base.py b/tests/base.py index 023bbb35e..bd52dc70a 100644 --- a/tests/base.py +++ b/tests/base.py @@ -292,13 +292,8 @@ def __init__(self): # Look for any environment variables that match our test # configuration naming of "SG_{KEY}". Default is None. value = os.environ.get('SG_%s' % (str(key).upper())) - if key in ['mock']: - if value == None or str(value).lower() in ['true','1']: - value = True - else: - value = False - + value = (value == None) or (str(value).lower() in ['true','1']): setattr(self, key, value) def config_keys(self): From 9894b84c2630bd9627f3b382dda8de540ef0881b Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Thu, 28 Jan 2016 10:10:44 -0800 Subject: [PATCH 107/389] For #34500 : Updating value checking syntax for brevity --- tests/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/base.py b/tests/base.py index bd52dc70a..5ed11afb2 100644 --- a/tests/base.py +++ b/tests/base.py @@ -293,7 +293,7 @@ def __init__(self): # configuration naming of "SG_{KEY}". Default is None. value = os.environ.get('SG_%s' % (str(key).upper())) if key in ['mock']: - value = (value == None) or (str(value).lower() in ['true','1']): + value = (value == None) or (str(value).lower() in ['true','1']) setattr(self, key, value) def config_keys(self): From 637b5d50bb3c7702e6e8cd9606231a7c249e31ca Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Mon, 1 Feb 2016 14:46:05 -0800 Subject: [PATCH 108/389] For #34500 : prepping for release --- README.md | 7 ++++++- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index efa52187d..8e9c69e8d 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,12 @@ Integration and unit tests are provided. ## Changelog -**v3.0.26 - TBD** +**v3.0.27 - TBD** + +**v3.0.26 - 2016 Feb 1** + + + Updating testing framework to use environment variables inconjunction with existing example_config file so that commits and pull requests are automatically run on travis-ci. + + Fix to prevent stripping out case-sensitivity of a URL if the user passes their credentials to config.server as an authrization header. **v3.0.25 - 2016 Jan 12** diff --git a/setup.py b/setup.py index b68bdafa8..117c754e8 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.25', + version='3.0.26', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index ceb1b7c97..06accf9c7 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.26.dev" +__version__ = "3.0.26" # ---------------------------------------------------------------------------- # Errors From 38c76481ba0d0a8b1674de9ccb0d78ed7c31a938 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Mon, 1 Feb 2016 14:52:23 -0800 Subject: [PATCH 109/389] Bumping version to 3.0.27.dev --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 06accf9c7..8b0a4099a 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.26" +__version__ = "3.0.27.dev" # ---------------------------------------------------------------------------- # Errors From e95c1903af3687f2170525ff368f56a413dd87f0 Mon Sep 17 00:00:00 2001 From: Samuel Date: Wed, 3 Feb 2016 11:03:47 -0500 Subject: [PATCH 110/389] Fixed uninstanciated variable in test --- tests/test_api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index 00435b3ce..955d6ce2e 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -321,7 +321,8 @@ def test_upload_thumbnail_for_task(self): def test_upload_thumbnail_with_upload_function(self): """Upload thumbnail via upload function test""" - size = os.stat(path).st_size + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.expanduser(os.path.join(this_dir,"sg_logo.jpg"))) # upload thumbnail thumb_id = self.sg.upload("Task", self.task['id'], path, 'image') From 0b629bb057e29e3b1a6df3e7c5d0ac1c8031de1a Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Wed, 3 Feb 2016 11:51:19 -0500 Subject: [PATCH 111/389] Integrate Travis builds with Hipchat --- .travis.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd190b41d..92fb405d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,16 @@ language: python python: - - "2.6" - - "2.7" -# command to install dependencies +- '2.6' +- '2.7' install: - - pip install nose +- pip install nose before_script: - - cp ./tests/example_config ./tests/config -# command to run tests +- cp ./tests/example_config ./tests/config script: nosetests -v notifications: email: - api@shotgunsoftware.com + hipchat: + rooms: + secure: E3KqkCZXTRSr91g0d00VSzNshsYZcD7akKeJBd+Yv83LHCnLCeTZImQblV9kPoKv+JVXHyfzIzX4SJ93oqzFq17ilSjPsnpagmOlVzuczuPHIPTBKc/nDslIAdMiCfkOihTQPsCeDQ6NlGvtteP683D2juyK+RkTMa0ptW94HhQ= + format: html From 3ee09ecadfc4687bf8491aca02fc3ddbc9f6b53a Mon Sep 17 00:00:00 2001 From: Samuel Date: Wed, 3 Feb 2016 12:24:07 -0500 Subject: [PATCH 112/389] Cleaned up path fetch in test --- tests/test_api.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 955d6ce2e..25d1215e9 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -321,8 +321,7 @@ def test_upload_thumbnail_for_task(self): def test_upload_thumbnail_with_upload_function(self): """Upload thumbnail via upload function test""" - this_dir, _ = os.path.split(__file__) - path = os.path.abspath(os.path.expanduser(os.path.join(this_dir,"sg_logo.jpg"))) + path = os.path.abspath(os.path.expanduser(os.path.join(os.path.dirname(__file__), "sg_logo.jpg"))) # upload thumbnail thumb_id = self.sg.upload("Task", self.task['id'], path, 'image') From 3bbc5998b374d3f5ba4809154ee48cca4533f566 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Wed, 3 Feb 2016 17:07:39 -0500 Subject: [PATCH 113/389] Update hipchat integration of Travis CI --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 92fb405d0..efc9d3b71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,8 @@ before_script: script: nosetests -v notifications: email: - - api@shotgunsoftware.com + - api@shotgunsoftware.com hipchat: rooms: - secure: E3KqkCZXTRSr91g0d00VSzNshsYZcD7akKeJBd+Yv83LHCnLCeTZImQblV9kPoKv+JVXHyfzIzX4SJ93oqzFq17ilSjPsnpagmOlVzuczuPHIPTBKc/nDslIAdMiCfkOihTQPsCeDQ6NlGvtteP683D2juyK+RkTMa0ptW94HhQ= + secure: Fn5h3NWccsKeXrH/wP/WcfIMco1xCxJsqnEgzSguAIo2DlQX8UprmbyDPoZTOmKF3Tl1HMSZzgLDr2CWQua5IR8IfFum5rfvkckUCeN+PkihL8aJ+1kqXe1GZc0+rRY8iDjAUyX8i+lupnsF0RGmg/eS9QfqblM83VBKskiSsDs= format: html From 46af88ebb26a4f827048e115d920a0cc31e17ce6 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Wed, 3 Feb 2016 19:52:42 -0500 Subject: [PATCH 114/389] Single line travis notification in HC --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index efc9d3b71..58a1fae2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,6 @@ notifications: hipchat: rooms: secure: Fn5h3NWccsKeXrH/wP/WcfIMco1xCxJsqnEgzSguAIo2DlQX8UprmbyDPoZTOmKF3Tl1HMSZzgLDr2CWQua5IR8IfFum5rfvkckUCeN+PkihL8aJ+1kqXe1GZc0+rRY8iDjAUyX8i+lupnsF0RGmg/eS9QfqblM83VBKskiSsDs= + template: + - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (Details/Change view)' format: html From 99c519aed7d349a8283633ba46f812e689794304 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Wed, 3 Feb 2016 22:32:36 -0500 Subject: [PATCH 115/389] Only notify of pull requests and restore human readability. --- .travis.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 58a1fae2f..4d880787d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,21 @@ language: python python: -- '2.6' -- '2.7' + - "2.6" + - "2.7" +# command to install dependencies install: -- pip install nose + - pip install nose before_script: -- cp ./tests/example_config ./tests/config + - cp ./tests/example_config ./tests/config +# command to run tests script: nosetests -v notifications: email: - - api@shotgunsoftware.com + - api@shotgunsoftware.com hipchat: rooms: secure: Fn5h3NWccsKeXrH/wP/WcfIMco1xCxJsqnEgzSguAIo2DlQX8UprmbyDPoZTOmKF3Tl1HMSZzgLDr2CWQua5IR8IfFum5rfvkckUCeN+PkihL8aJ+1kqXe1GZc0+rRY8iDjAUyX8i+lupnsF0RGmg/eS9QfqblM83VBKskiSsDs= template: - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (Details/Change view)' format: html + on_pull_requests: false From 5b8d6ecb1638bc0210e506d52df5ae42ce2d721b Mon Sep 17 00:00:00 2001 From: dallum Date: Fri, 5 Feb 2016 13:34:08 +0000 Subject: [PATCH 116/389] Update Copyright Date Update Copyright Date for 2016 --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 0ec0e4fd7..a245dfb77 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ ----------------------------------------------------------------------------- - Copyright (c) 2009-2015, Shotgun Software Inc + Copyright (c) 2009-2016, Shotgun Software Inc Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From 7a022ecc92e1e532fc5398e0042fbdaa57d488c6 Mon Sep 17 00:00:00 2001 From: Owen Lewery Date: Tue, 9 Feb 2016 16:58:22 -0500 Subject: [PATCH 117/389] For #34814 - update test to reflect new server response --- tests/test_api.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 25d1215e9..684c87cf6 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1626,14 +1626,15 @@ def test_human_user_sudo_auth_fails(self): http_proxy=self.config.http_proxy, sudo_as_login="blah" ) self.assertRaises(shotgun_api3.Fault, x.find_one, 'Shot', []) + expected = "The user does not have permission to 'sudo': %s" % self.config.human_login try : x.find_one('Shot',[]) except shotgun_api3.Fault, e: # py24 exceptions don't have message attr if hasattr(e, 'message'): - self.assertEquals("The user does not have permission to 'sudo': ", e.message) + self.assertEquals(expected, e.message) else: - self.assertEquals("The user does not have permission to 'sudo': ", e.args[0]) + self.assertEquals(expected, e.args[0]) From e1de32689e4408fc5b640d30783da25c1829ab62 Mon Sep 17 00:00:00 2001 From: Owen Lewery Date: Tue, 9 Feb 2016 17:34:35 -0500 Subject: [PATCH 118/389] For #34814 - test for both old and new responses --- tests/test_api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 684c87cf6..748d38490 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1626,15 +1626,15 @@ def test_human_user_sudo_auth_fails(self): http_proxy=self.config.http_proxy, sudo_as_login="blah" ) self.assertRaises(shotgun_api3.Fault, x.find_one, 'Shot', []) - expected = "The user does not have permission to 'sudo': %s" % self.config.human_login + expected = "The user does not have permission to 'sudo':" try : x.find_one('Shot',[]) except shotgun_api3.Fault, e: # py24 exceptions don't have message attr if hasattr(e, 'message'): - self.assertEquals(expected, e.message) + self.assert_(e.message.startswith(expected)) else: - self.assertEquals(expected, e.args[0]) + self.assert_(e.args[0].startswith(expected)) From 65601c16bffb5e86690f93d70edfc69db89b10ba Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Wed, 10 Feb 2016 11:18:27 -0500 Subject: [PATCH 119/389] Ignore .travis-solo test directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2ceb44653..20ec5ddec 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ tests/config .coverage .cache +.travis-solo htmlcov # setup related From c4f4c00a2a4e21433e7c4de0edd3648f4fed7d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 11 Feb 2016 14:14:31 -0500 Subject: [PATCH 120/389] For #33172, support @ in proxy authentication passwords Splitting the string on @ was the right idea, but we have to do it from the end, since the password might have @ in it. Splitting from the end is safe since the the host and port number can't have this character. Closes https://github.com/shotgunsoftware/python-api/pull/105 --- shotgun_api3/shotgun.py | 5 +++-- tests/tests_unit.py | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a245dfb77..62622cb51 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -429,8 +429,9 @@ def __init__(self, # foo:bar@123.456.789.012:3456 if http_proxy: - # check if we're using authentication - p = http_proxy.split("@", 1) + # check if we're using authentication. Start from the end since there might be + # @ in the user's password. + p = http_proxy.rsplit("@", 1) if len(p) > 1: self.config.proxy_user, self.config.proxy_pass = \ p[0].split(":", 1) diff --git a/tests/tests_unit.py b/tests/tests_unit.py index e7707ce48..a16ad9034 100755 --- a/tests/tests_unit.py +++ b/tests/tests_unit.py @@ -84,6 +84,23 @@ def test_http_proxy_server_and_port_with_authentication(self): self.assertEquals(sg.config.proxy_port, proxy_port) self.assertEquals(sg.config.proxy_user, proxy_user) self.assertEquals(sg.config.proxy_pass, proxy_pass) + + def test_http_proxy_with_at_in_password(self): + proxy_server = "someserver.com" + proxy_port = 1234 + proxy_user = "user" + proxy_pass = "p@ssword" + http_proxy = "%s:%s@%s:%d" % (proxy_user, proxy_pass, proxy_server, + proxy_port) + sg = api.Shotgun(self.server_path, + self.script_name, + self.api_key, + http_proxy=http_proxy, + connect=False) + self.assertEquals(sg.config.proxy_server, proxy_server) + self.assertEquals(sg.config.proxy_port, proxy_port) + self.assertEquals(sg.config.proxy_user, proxy_user) + self.assertEquals(sg.config.proxy_pass, proxy_pass) def test_malformatted_proxy_info(self): proxy_server = "someserver.com" From b6545dda1fc84871a28f9af4d066e25dbe675e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 18 Feb 2016 10:43:30 -0500 Subject: [PATCH 121/389] Getting the repo ready for the 3.0.27 release. --- README.md | 8 +++++++- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8e9c69e8d..247cf5d48 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,13 @@ Integration and unit tests are provided. ## Changelog -**v3.0.27 - TBD** +**v3.0.27 - 2016 Feb 18** + + + Make sure HTTP proxy authentication works with the @ character in a password. + + Make sure sudo authentication test works with Shotgun versions after 6.3.10 + + Smarter uploading of thumbnails and filmstrips with the upload() method. + + Improve Travis build integration of the Python-API to run the full suite of + API tests instead of just the unit and client tests. **v3.0.26 - 2016 Feb 1** diff --git a/setup.py b/setup.py index 117c754e8..8920df70f 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.26', + version='3.0.27', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 62622cb51..a6b3cf0aa 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.27.dev" +__version__ = "3.0.27" # ---------------------------------------------------------------------------- # Errors From e49a9b3ec4d8933742ca6184c14ac9ac572a3e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 18 Feb 2016 10:55:14 -0500 Subject: [PATCH 122/389] Bumping version to 3.0.27 dev --- README.md | 4 ++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 247cf5d48..4d22bd110 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.28 - TBD** + + + TBD + **v3.0.27 - 2016 Feb 18** + Make sure HTTP proxy authentication works with the @ character in a password. diff --git a/setup.py b/setup.py index 8920df70f..6ce414e99 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.27', + version='3.0.28.dev', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a6b3cf0aa..c497c3e0b 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.27" +__version__ = "3.0.28.dev" # ---------------------------------------------------------------------------- # Errors From f60c31b853cf46763e63b79dc5a831c196f37ab0 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Fri, 26 Feb 2016 10:16:21 -0800 Subject: [PATCH 123/389] For #35260: Refactoring scoping of sgtimezone so that dates are picklable and convertable --- shotgun_api3/lib/sgtimezone.py | 76 +++++++++++++++++----------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/shotgun_api3/lib/sgtimezone.py b/shotgun_api3/lib/sgtimezone.py index ced06365e..f1072c9df 100644 --- a/shotgun_api3/lib/sgtimezone.py +++ b/shotgun_api3/lib/sgtimezone.py @@ -5,10 +5,11 @@ # current users of api2 to install new modules and modify PYTHONPATH info. # ---------------------------------------------------------------------------- -class SgTimezone(object): - from datetime import tzinfo, timedelta, datetime - import time as _time +from datetime import tzinfo, timedelta, datetime +import time as _time +class SgTimezone(object): + ZERO = timedelta(0) STDOFFSET = timedelta(seconds = -_time.timezone) if _time.daylight: @@ -18,41 +19,40 @@ class SgTimezone(object): DSTDIFF = DSTOFFSET - STDOFFSET def __init__(self): - self.utc = self.UTC() - self.local = self.LocalTimezone() + self.utc = UTC() + self.local = LocalTimezone() - class UTC(tzinfo): - - def utcoffset(self, dt): - return SgTimezone.ZERO - - def tzname(self, dt): - return "UTC" - - def dst(self, dt): - return SgTimezone.ZERO +class UTC(tzinfo): + + def utcoffset(self, dt): + return SgTimezone.ZERO - class LocalTimezone(tzinfo): - - def utcoffset(self, dt): - if self._isdst(dt): - return SgTimezone.DSTOFFSET - else: - return SgTimezone.STDOFFSET - - def dst(self, dt): - if self._isdst(dt): - return SgTimezone.DSTDIFF - else: - return SgTimezone.ZERO - - def tzname(self, dt): - return _time.tzname[self._isdst(dt)] - - def _isdst(self, dt): - tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) - import time as _time - stamp = _time.mktime(tt) - tt = _time.localtime(stamp) - return tt.tm_isdst > 0 + def tzname(self, dt): + return "UTC" + + def dst(self, dt): + return SgTimezone.ZERO +class LocalTimezone(tzinfo): + + def utcoffset(self, dt): + if self._isdst(dt): + return SgTimezone.DSTOFFSET + else: + return SgTimezone.STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return SgTimezone.DSTDIFF + else: + return SgTimezone.ZERO + + def tzname(self, dt): + return _time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) + import time as _time + stamp = _time.mktime(tt) + tt = _time.localtime(stamp) + return tt.tm_isdst > 0 From 026a5e0f48041d24d249a1c670e23ebd4166ab44 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Wed, 2 Mar 2016 15:29:05 -0800 Subject: [PATCH 124/389] For #35260 : Adding classmethods to SgTimezone for nested class backwards compatability, as well as docstrings to better explain the module --- shotgun_api3/lib/sgtimezone.py | 45 ++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/lib/sgtimezone.py b/shotgun_api3/lib/sgtimezone.py index f1072c9df..ef06c8640 100644 --- a/shotgun_api3/lib/sgtimezone.py +++ b/shotgun_api3/lib/sgtimezone.py @@ -9,7 +9,12 @@ import time as _time class SgTimezone(object): - + ''' + Shotgun's server infrastructure is configured for Coordinated Universal + Time (UTC). In order to provide relevant local timestamps to users, we wrap + the datetime module's tzinfo to provide convenient conversion methods. + ''' + ZERO = timedelta(0) STDOFFSET = timedelta(seconds = -_time.timezone) if _time.daylight: @@ -21,8 +26,28 @@ class SgTimezone(object): def __init__(self): self.utc = UTC() self.local = LocalTimezone() + + @classmethod + def UTC(cls): + ''' + For backwards compatibility, from when UTC was a nested class, + we allow instantiation via SgTimezone + ''' + return UTC() + + @classmethod + def LocalTimezone(cls): + ''' + For backwards compatibility, from when LocalTimezone was a nested + class, we allow instantiation via SgTimezone + ''' + return LocalTimezone() class UTC(tzinfo): + ''' + Implementation of datetime's tzinfo to provide consistent calculated + offsets against Coordinated Universal Time (UTC) + ''' def utcoffset(self, dt): return SgTimezone.ZERO @@ -34,25 +59,41 @@ def dst(self, dt): return SgTimezone.ZERO class LocalTimezone(tzinfo): + ''' + Implementation of datetime's tzinfo to provide convenient conversion + between Shotgun server time and local user time + ''' def utcoffset(self, dt): + ''' + Difference between the user's local timezone and UTC timezone in seconds + ''' if self._isdst(dt): return SgTimezone.DSTOFFSET else: return SgTimezone.STDOFFSET def dst(self, dt): + ''' + Daylight savings time (dst) offset in seconds + ''' if self._isdst(dt): return SgTimezone.DSTDIFF else: return SgTimezone.ZERO def tzname(self, dt): + ''' + Name of the user's local timezone, including a reference + to daylight savings time (dst) if applicable + ''' return _time.tzname[self._isdst(dt)] def _isdst(self, dt): + ''' + Calculate whether the timestamp in question was in daylight savings + ''' tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) - import time as _time stamp = _time.mktime(tt) tt = _time.localtime(stamp) return tt.tm_isdst > 0 From 4bbdabcb0b00c401d65491a7a0b881e7ac2d0903 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Thu, 3 Mar 2016 12:06:19 -0800 Subject: [PATCH 125/389] Prepping for release of 3.0.28 --- README.md | 4 ++-- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4d22bd110..fd1e7c95d 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,9 @@ Integration and unit tests are provided. ## Changelog -**v3.0.28 - TBD** +**v3.0.28 - 2016 Mar 3** - + TBD + + Refactored nested classing of sgtimezone library to allow for serializable timestamps. **v3.0.27 - 2016 Feb 18** diff --git a/setup.py b/setup.py index 6ce414e99..2b8d8591b 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.28.dev', + version='3.0.28', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index c497c3e0b..66be9ef36 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.28.dev" +__version__ = "3.0.28" # ---------------------------------------------------------------------------- # Errors From f680acd45aa152dcdb84b6c8edc095a004f02e79 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Thu, 3 Mar 2016 12:13:06 -0800 Subject: [PATCH 126/389] Bumping master to 3.0.29.dev --- README.md | 4 ++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fd1e7c95d..80e8553b9 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.29.dev - TBD** + + + TBD + **v3.0.28 - 2016 Mar 3** + Refactored nested classing of sgtimezone library to allow for serializable timestamps. diff --git a/setup.py b/setup.py index 2b8d8591b..ba72ad03b 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.28', + version='3.0.29.dev', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 66be9ef36..783a11ed1 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.28" +__version__ = "3.0.29.dev" # ---------------------------------------------------------------------------- # Errors From 1910f68975e71bdd641d4f64a2d41fce6f681566 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Mon, 7 Mar 2016 17:34:45 -0500 Subject: [PATCH 127/389] Reverts image upload default field name change. --- README.md | 4 ++-- setup.py | 2 +- shotgun_api3/shotgun.py | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 80e8553b9..7c90d14d5 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,9 @@ Integration and unit tests are provided. ## Changelog -**v3.0.29.dev - TBD** +**v3.0.29 - 2016 Mar 7** - + TBD + + Reverted the change to the default field names for image uploading. **v3.0.28 - 2016 Mar 3** diff --git a/setup.py b/setup.py index ba72ad03b..d5e0f6ed5 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.29.dev', + version='3.0.29', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 783a11ed1..fce3a6fd5 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.29.dev" +__version__ = "3.0.29" # ---------------------------------------------------------------------------- # Errors @@ -1426,7 +1426,7 @@ def upload_thumbnail(self, entity_type, entity_id, path, **kwargs): :returns: Id of the new attachment """ return self.upload(entity_type, entity_id, path, - field_name="image", **kwargs) + field_name="thumb_image", **kwargs) def upload_filmstrip_thumbnail(self, entity_type, entity_id, path, **kwargs): """Convenience function for uploading filmstrip thumbnails. @@ -1444,7 +1444,7 @@ def upload_filmstrip_thumbnail(self, entity_type, entity_id, path, **kwargs): "higher, server is %s" % (self.server_caps.version,)) return self.upload(entity_type, entity_id, path, - field_name="filmstrip_image", **kwargs) + field_name="filmstrip_thumb_image", **kwargs) def upload(self, entity_type, entity_id, path, field_name=None, display_name=None, tag_list=None): From 653d8957fc444183b0ac71f9f3d870a1a60d2598 Mon Sep 17 00:00:00 2001 From: Rob Blau Date: Mon, 7 Mar 2016 15:33:18 -0800 Subject: [PATCH 128/389] Bump version to v3.0.30.dev --- README.md | 4 ++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7c90d14d5..e0a06ed39 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.30.dev - TBD** + + + TBD + **v3.0.29 - 2016 Mar 7** + Reverted the change to the default field names for image uploading. diff --git a/setup.py b/setup.py index d5e0f6ed5..c9124b885 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.29', + version='3.0.30.dev', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index fce3a6fd5..30812310e 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.29" +__version__ = "3.0.30.dev" # ---------------------------------------------------------------------------- # Errors From a19a583e8a5e1e30968977a7982367c5beb7a74f Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Fri, 18 Mar 2016 16:05:53 -0400 Subject: [PATCH 129/389] For #35620 - Enable Slack notifications --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 4d880787d..2eb10e5ed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,3 +19,6 @@ notifications: - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (Details/Change view)' format: html on_pull_requests: false + slack: + rooms: + secure: NgcVxptQji2OL7EKx5owh21tOl4rRg51ydYhLPHpBIpBVzlqPxi1jbMHpcbl8mG+GuhU6y1D6kVQgQfuAfIWx5YOc4FodhOFZgeS+eol5RTmEepl1OT6XmAVgEclSZUYQmK25OkcxnFnOV/31RuDPXWcgCvSBZqTy6lAbOZ5VwQ= From e9c29e3f28f7b230d8bcd8fb17f494ec88e7fede Mon Sep 17 00:00:00 2001 From: Alan Trombla Date: Tue, 5 Apr 2016 16:47:58 -0700 Subject: [PATCH 130/389] shotgun.py: optional extra_auth_params added to Config object * As of Shotgun 5.4.10, session tokens are distinguished by a "product" field depending on how they were created. If the appropriate product is not supplied with the session_token, any authentication request with that token will fail. * We add an optional "extra_auth_params" arg to the Shotgun constructor, so that we can pass in the "product" when needed, and other supplementary params we might add in the future. * New client_test "test_extra_auth_params()" succeeds with changes in this commit. * README.md refreshed a little. --- README.md | 8 +++++--- shotgun_api3/shotgun.py | 5 +++++ tests/test_client.py | 20 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e0a06ed39..8f43f77b2 100644 --- a/README.md +++ b/README.md @@ -47,9 +47,11 @@ Integration and unit tests are provided. [![Build Status](https://secure.travis-ci.org/shotgunsoftware/python-api.png?branch=master)](http://travis-ci.org/shotgunsoftware/python-api) -- test_client and tests_unit mock server interaction and do not require a shotgun instance to be available. -- test_api and test_api_long do require a shotgun instance, with a script key available for the tests. These tests rely on a tests/config file, which can be created by renaming example_config and supplying the server and script user values. The tests will set up test data on the server based on the data set forth in the config. This data will be manipulated by the tests, and should not be used for other purposes. -- To run all of the tests, use the shell script run-tests. This script require nose to be installed. +- All tests require the "nose" unit testing tools (http://nose.readthedocs.org), and a "tests/config" file (copy from "tests/example_config"). +- Tests can be run individually like this: `nosetest tests/test_client.py` +- test_client and tests_unit use mock server interaction and do not require a shotgun instance to be available (no modifacations to tests/config necessary). +- test_api and test_api_long do require a shotgun instance, with a script key available for the tests. The server and script user values must be supplied in the tests/config file. The tests will set up test data on the server based on the data set forth in the config. This data will be manipulated by the tests, and should not be used for other purposes. +- To run all of the tests, use the shell script run-tests. ## Changelog diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 30812310e..e3d1b8a5c 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -249,6 +249,8 @@ def __init__(self): self.user_password = None self.auth_token = None self.sudo_as_login = None + # Authentication parameters to be folded into final auth_params dict + self.extra_auth_params = None # uuid as a string self.session_uuid = None self.scheme = None @@ -2126,6 +2128,9 @@ def _auth_params(self): "higher, server is %s" % (self.server_caps.version,)) auth_params["sudo_as_login"] = self.config.sudo_as_login + if self.config.extra_auth_params: + auth_params.update(self.config.extra_auth_params) + return auth_params def _sanitize_auth_params(self, params): diff --git a/tests/test_client.py b/tests/test_client.py index 00e110f82..e3e85d401 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -89,6 +89,26 @@ def test_server_version_json(self): sc.version = (2,5,0) sc._ensure_json_supported() + def test_extra_auth_params(self): + """test_extra_auth_params tests provided auth_params are included in request""" + # ok for the mock server to just return an error, we want to look at + # what's in the request + self._mock_http({ "message":"Go BANG", + "exception":True }) + + def auth_args(): + args = self.sg._http_request.call_args[0] + body = args[2] + body = json.loads(body) + return body["params"][0] + + self.sg.config.extra_auth_params = None + self.assertRaises(api.Fault, self.sg.delete, "FakeType", 1) + self.assertTrue("product" not in auth_args()) + + self.sg.config.extra_auth_params = {"product":"rv"} + self.assertRaises(api.Fault, self.sg.delete, "FakeType", 1) + self.assertEqual("rv", auth_args()["product"]) def test_session_uuid(self): """test_session_uuid tests session UUID is included in request""" From cf224011614672934959576a27e13883a8d35f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Tue, 19 Apr 2016 01:45:41 +0100 Subject: [PATCH 131/389] #35786 Adds basic find() ordering support to mockgun. This minor change extends the existing mockgun library with order support for the find() method. Previously, any order directives were ignored by mockgun. Please note that mockgun is still highly experimental at this point. Closes #113 --- shotgun_api3/lib/mockgun.py | 52 +++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/shotgun_api3/lib/mockgun.py b/shotgun_api3/lib/mockgun.py index 7b831aa6c..5197b19fc 100644 --- a/shotgun_api3/lib/mockgun.py +++ b/shotgun_api3/lib/mockgun.py @@ -298,62 +298,80 @@ def schema_field_read(self, entity_type, field_name=None): def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0): - + self.finds += 1 - + self._validate_entity_type(entity_type) # do not validate custom fields - this makes it hard to mock up a field quickly #self._validate_entity_fields(entity_type, fields) - + if isinstance(filters, dict): # complex filter style! # {'conditions': [{'path': 'id', 'relation': 'is', 'values': [1]}], 'logical_operator': 'and'} - + resolved_filters = [] for f in filters["conditions"]: - + if f["path"].startswith("$FROM$"): # special $FROM$Task.step.entity syntax # skip this for now continue - + if len(f["values"]) != 1: # {'path': 'id', 'relation': 'in', 'values': [1,2,3]} --> ["id", "in", [1,2,3]] resolved_filters.append([ f["path"], f["relation"], f["values"] ]) else: # {'path': 'id', 'relation': 'is', 'values': [3]} --> ["id", "is", 3] resolved_filters.append([ f["path"], f["relation"], f["values"][0] ]) - + else: # traditiona style sg filters - resolved_filters = filters - + resolved_filters = filters + # now translate ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] resolved_filters_2 = [] for f in resolved_filters: - + if len(f) > 3: # ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] new_filter = [ f[0], f[1], f[2:] ] - + elif f[1] == "in" and not isinstance(f[2], list): # ["field", "in", 2] --> ["field", "in", [2]] new_filter = [ f[0], f[1], [ f[2] ] ] - + else: new_filter = f - + resolved_filters_2.append(new_filter) - + results = [row for row in self._db[entity_type].values() if self._row_matches_filters(entity_type, row, resolved_filters_2, filter_operator, retired_only)] - + + # handle the ordering of the recordset + if order: + # order: [{"field_name": "code", "direction": "asc"}, ... ] + for order_entry in order: + if "field_name" not in order_entry: + raise ValueError("Order clauses must be list of dicts with keys 'field_name' and 'direction'!") + + order_field = order_entry["field_name"] + if order_entry["direction"] == "asc": + desc_order = False + elif order_entry["direction"] == "desc": + desc_order = True + else: + raise ValueError("Unknown ordering direction") + + results = sorted(results, key=lambda k: k[order_field], reverse=desc_order) + if fields is None: fields = set(["type", "id"]) else: fields = set(fields) | set(["type", "id"]) - + + # get the values requested val = [dict((field, self._get_field_from_row(entity_type, row, field)) for field in fields) for row in results] - + return val From ac72b7f37e396bdf3605890ec56e09d31678850f Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Mon, 25 Apr 2016 12:54:58 -0700 Subject: [PATCH 132/389] For #36143: Explicitly closing download_attachment file handler (#114) We want to ensure that we're explicitly closing our file handler in download_attachment, so that we don't throw an error in cases where Python's garbage collector doesn't close the file. --- shotgun_api3/shotgun.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index e3d1b8a5c..33c048ad3 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1612,6 +1612,8 @@ def download_attachment(self, attachment=False, file_path=None, raise ShotgunFileDownloadError(err) else: if file_path: + if not fp.closed: + fp.close() return file_path else: return attachment From c89da308edff167fd96e745c3747ae6faeadc224 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Mon, 25 Apr 2016 12:56:06 -0700 Subject: [PATCH 133/389] For #10692: Option to use add/remove/set modes when updating multi-entity fields (#111) This update will allow for updating multi-entity fields without having to pull down the field's entire dataset first. It uses the new parameter multi_entity_update_modes on the update method to specify one of 'add', 'remove', or 'set'. --- shotgun_api3/shotgun.py | 54 ++++++++++++++++++++++++++-------- tests/base.py | 12 ++++++-- tests/example_config | 3 +- tests/test_api.py | 65 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 116 insertions(+), 18 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 33c048ad3..999e6c91c 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -843,7 +843,7 @@ def create(self, entity_type, data, return_fields=None): return result - def update(self, entity_type, entity_id, data): + def update(self, entity_type, entity_id, data, multi_entity_update_modes=None): """Updates the specified entity with the supplied data. :param entity_type: Required, entity type (string) to update. @@ -852,6 +852,16 @@ def update(self, entity_type, entity_id, data): :param data: Required, dict fields to update on the entity. + :param multi_entity_update_modes: Optional, dict of what update mode to + use when updating a multi-entity link field. The keys in the dict are + the fields to set the mode for and the values from the dict are one + of "set", "add", or "remove". The default behavior if mode is not + specified for a field is 'set'. For example, on the 'Sequence' entity, + to append to the 'shots' field and remove from the 'assets' field, you + would specify: + + multi_entity_update_modes={"shots":"add", "assets":"remove"} + :returns: dict of the fields updated, with the entity_type and id added. """ @@ -871,7 +881,10 @@ def update(self, entity_type, entity_id, data): params = { "type" : entity_type, "id" : entity_id, - "fields" : self._dict_to_list(data) + "fields" : self._dict_to_list( + data, + extra_data=self._dict_to_extra_data( + multi_entity_update_modes, "multi_entity_update_mode")) } record = self._call_rpc("update", params) result = self._parse_records(record)[0] @@ -941,7 +954,7 @@ def batch(self, requests): :param requests: A list of dict's of the form which have a request_type key and also specifies: - create: entity_type, data dict of fields to set - - update: entity_type, entity_id, data dict of fields to set + - update: entity_type, entity_id, data dict of fields to set, optionally multi_entity_update_modes - delete: entity_type and entity_id :returns: A list of values for each operation, create and update @@ -982,7 +995,12 @@ def _required_keys(message, required_keys, data): ['entity_id', 'data'], req) request_params['id'] = req['entity_id'] - request_params['fields'] = self._dict_to_list(req["data"]) + request_params['fields'] = self._dict_to_list(req["data"], + extra_data=self._dict_to_extra_data( + req.get("multi_entity_update_modes"), + "multi_entity_update_mode")) + if "multi_entity_update_mode" in req: + request_params['multi_entity_update_mode'] = req["multi_entity_update_mode"] elif req["request_type"] == "delete": _required_keys("Batched delete request", ['entity_id'], req) request_params['id'] = req['entity_id'] @@ -2573,18 +2591,30 @@ def _build_thumb_url(self, entity_type, entity_id): # Comments in prev version said we can get this sometimes. raise RuntimeError("Unknown code %s %s" % (code, thumb_url)) - def _dict_to_list(self, d, key_name="field_name", value_name="value"): + def _dict_to_list(self, d, key_name="field_name", value_name="value", extra_data=None): """Utility function to convert a dict into a list dicts using the key_name and value_name keys. - e.g. d {'foo' : 'bar'} changed to [{'field_name':'foo, 'value':'bar'}] - """ - - return [ - {key_name : k, value_name : v } - for k, v in (d or {}).iteritems() - ] + e.g. d {'foo' : 'bar'} changed to [{'field_name':'foo', 'value':'bar'}] + Any dictionary passed in via extra_data will be merged into the resulting dictionary. + e.g. d as above and extra_data of {'foo': {'thing1': 'value1'}} changes into + [{'field_name': 'foo', 'value': 'bar', 'thing1': 'value1'}] + """ + ret = [] + for k, v in (d or {}).iteritems(): + d = {key_name: k, value_name: v} + d.update((extra_data or {}).get(k, {})) + ret.append(d) + return ret + + def _dict_to_extra_data(self, d, key_name="value"): + """Utility function to convert a dict into a dict compatible with the extra_data arg + of _dict_to_list + + e.g. d {'foo' : 'bar'} changed to {'foo': {"value": 'bar'}] + """ + return dict([(k, {key_name: v}) for (k,v) in (d or {}).iteritems()]) # Helpers from the previous API, left as is. diff --git a/tests/base.py b/tests/base.py index 5ed11afb2..a70d930e2 100644 --- a/tests/base.py +++ b/tests/base.py @@ -26,6 +26,7 @@ def __init__(self, *args, **kws): self.asset = None self.version = None self.note = None + self.playlist = None self.task = None self.ticket = None self.human_password = None @@ -180,9 +181,12 @@ def _setup_mock_data(self): self.version = { 'id':5, 'code':self.config.version_code, 'type':'Version' } - self.ticket = { 'id':6, + self.ticket = { 'id':6, 'title':self.config.ticket_title, 'type':'Ticket' } + self.playlist = { 'id':7, + 'code':self.config.playlist_code, + 'type':'Playlist'} class LiveTestBase(TestBase): '''Test base for tests relying on connection to server.''' @@ -236,6 +240,11 @@ def _setup_db(self, config): 'content':'anything'} self.note = _find_or_create_entity(self.sg, 'Note', data, keys) + keys = ['code','project'] + data = {'project':self.project, + 'code':self.config.playlist_code} + self.playlist = _find_or_create_entity(self.sg, 'Playlist', data, keys) + keys = ['code', 'entity_type'] data = {'code': 'wrapper test step', 'entity_type': 'Shot'} @@ -262,7 +271,6 @@ def _setup_db(self, config): 'mac_path':'nowhere', 'windows_path':'nowhere', 'linux_path':'nowhere'} - self.local_storage = _find_or_create_entity(self.sg, 'LocalStorage', data, keys) diff --git a/tests/example_config b/tests/example_config index 43c45deff..794537416 100644 --- a/tests/example_config +++ b/tests/example_config @@ -23,4 +23,5 @@ asset_code : Sg unittest asset version_code : Sg unittest version shot_code : Sg unittest shot task_content : Sg unittest task -ticket_title : Sg unittest ticket +ticket_title : Sg unittest ticket +playlist_code : Sg unittest playlist diff --git a/tests/test_api.py b/tests/test_api.py index 748d38490..afcfe07ae 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -639,7 +639,7 @@ class TestDataTypes(base.LiveTestBase): '''Test fields representing the different data types mapped on the server side. Untested data types: password, percent, pivot_column, serializable, image, currency - multi_entity, system_task_type, timecode, url, uuid, url_template + system_task_type, timecode, url, uuid, url_template ''' def setUp(self): super(TestDataTypes, self).setUp() @@ -739,6 +739,61 @@ def test_set_list(self): self.assertEqual(expected, actual) + def test_set_multi_entity(self): + sg = shotgun_api3.Shotgun( self.config.server_url, + self.config.script_name, + self.config.api_key ) + keys = ['project','user','code'] + data = {'project':self.project, + 'user':self.human_user, + 'code':'Alpha'} + version_1 = base._find_or_create_entity(sg, 'Version', data, keys) + data = {'project':self.project, + 'user':self.human_user, + 'code':'Beta'} + version_2 = base._find_or_create_entity(sg, 'Version', data, keys) + + entity = 'Playlist' + entity_id = self.playlist['id'] + field_name = 'versions' + + # Default set behaviour + pos_values = [[version_1, version_2]] + expected, actual = self.assert_set_field(entity, entity_id, + field_name, pos_values) + self.assertEqual(len(expected), len(actual)) + self.assertEqual( + sorted([x['id'] for x in expected]), + sorted([x['id'] for x in actual]) + ) + + # Multi-entity remove mode + pos_values = [[version_1]] + expected, actual = self.assert_set_field(entity, entity_id, + field_name, pos_values, multi_entity_update_mode='remove') + self.assertEqual(1, len(actual)) + self.assertEqual(len(expected), len(actual)) + self.assertNotEqual(expected[0]['id'],actual[0]['id']) + self.assertEqual(version_2['id'], actual[0]['id']) + + # Multi-entity add mode + pos_values = [[version_1]] + expected, actual = self.assert_set_field(entity, entity_id, + field_name, pos_values, multi_entity_update_mode='add') + self.assertEqual(2, len(actual)) + self.assertTrue(version_1['id'] in [x['id'] for x in actual]) + + # Multi-entity set mode + pos_values = [[version_1, version_2]] + expected, actual = self.assert_set_field(entity, entity_id, + field_name, pos_values, multi_entity_update_mode='set') + self.assertEqual(len(expected), len(actual)) + self.assertEqual( + sorted([x['id'] for x in expected]), + sorted([x['id'] for x in actual]) + ) + + def test_set_number(self): entity = 'Shot' entity_id = self.shot['id'] @@ -805,13 +860,17 @@ def test_set_text_html_entity(self): pos_values) self.assertEqual(expected, actual) - def assert_set_field(self, entity, entity_id, field_name, pos_values): + def assert_set_field(self, entity, entity_id, field_name, pos_values, multi_entity_update_mode=None): query_result = self.sg.find_one(entity, [['id', 'is', entity_id]], [field_name]) initial_value = query_result[field_name] new_value = (initial_value == pos_values[0] and pos_values[1]) or pos_values[0] - self.sg.update(entity, entity_id, {field_name:new_value}) + if multi_entity_update_mode: + self.sg.update(entity, entity_id, {field_name:new_value}, + multi_entity_update_modes={field_name:multi_entity_update_mode}) + else: + self.sg.update(entity, entity_id, {field_name:new_value}) new_values = self.sg.find_one(entity, [['id', 'is', entity_id]], [field_name]) From 475b636218c09b657c5b929be1d3f1f99d2dd0b8 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Mon, 25 Apr 2016 13:10:14 -0700 Subject: [PATCH 134/389] Packaging for the v3.0.30 release --- README.md | 7 +++++-- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8f43f77b2..192064cfb 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,12 @@ Integration and unit tests are provided. ## Changelog -**v3.0.30.dev - TBD** +**v3.0.30 - 2016 Apr 25** - + TBD + + Add option to use add/remove/set modes when updating multi-entity fields + + Add explicit file handler close to download_attachment + + Add basic find() ordering support to mockgun + + Allow for product specific authorization parameters **v3.0.29 - 2016 Mar 7** diff --git a/setup.py b/setup.py index c9124b885..7f98848a3 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.30.dev', + version='3.0.30', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 999e6c91c..55a85d3f8 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.30.dev" +__version__ = "3.0.30" # ---------------------------------------------------------------------------- # Errors From 08ee663c5dfb485c19d2b6a44cc4d8f643e8aee6 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Mon, 25 Apr 2016 13:30:48 -0700 Subject: [PATCH 135/389] Bumping version to v3.0.31.dev --- README.md | 4 ++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 192064cfb..543ef0f8a 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.31.dev - TBD** + + + TBD + **v3.0.30 - 2016 Apr 25** + Add option to use add/remove/set modes when updating multi-entity fields diff --git a/setup.py b/setup.py index 7f98848a3..095aa837e 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.30', + version='3.0.31.dev', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 55a85d3f8..0b9c0dd30 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.30" +__version__ = "3.0.31.dev" # ---------------------------------------------------------------------------- # Errors From 6d30b1323ae6946f0e79b3d0f55ac7f9004bb744 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Tue, 10 May 2016 09:20:33 -0700 Subject: [PATCH 136/389] For #36311: Adding playlist_code to SgTestConfig (#115) --- tests/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/base.py b/tests/base.py index a70d930e2..899f642a5 100644 --- a/tests/base.py +++ b/tests/base.py @@ -309,7 +309,7 @@ def config_keys(self): 'api_key', 'asset_code', 'http_proxy', 'human_login', 'human_name', 'human_password', 'mock', 'project_name', 'script_name', 'server_url', 'session_uuid', 'shot_code', 'task_content', - 'version_code' + 'version_code', 'playlist_code' ] def read_config(self, config_path): From 527bb404b86bbc9cb057ebce2216c78fffbe2ac2 Mon Sep 17 00:00:00 2001 From: daigles Date: Wed, 18 May 2016 17:06:32 -0400 Subject: [PATCH 137/389] #35229: Added support for 'additional_filter_presets' in read requests. (#108) The find and find_one methods now supports an optional 'additional_filter_presets' argument that can be used against any site running Shotgun 7 or newer. --- shotgun_api3/shotgun.py | 55 ++++- tests/test_api.py | 459 ++++++++++++++++++++++++++-------------- 2 files changed, 343 insertions(+), 171 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 0b9c0dd30..04e4ad338 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -186,6 +186,12 @@ def ensure_per_project_customization(self): 'label': 'project parameter' }, True) + def ensure_support_for_additional_filter_presets(self): + """Wrapper for ensure_support""" + return self._ensure_support({ + 'version': (7, 0, 0), + 'label': 'additional_filter_presets parameter' + }, True) def __str__(self): return "ServerCapabilities: host %s, version %s, is_dev %s"\ @@ -528,7 +534,8 @@ def info(self): return self._call_rpc("info", None, include_auth_params=False) def find_one(self, entity_type, filters, fields=None, order=None, - filter_operator=None, retired_only=False, include_archived_projects=True): + filter_operator=None, retired_only=False, include_archived_projects=True, + additional_filter_presets=None): """Calls the find() method and returns the first result, or None. :param entity_type: Required, entity type (string) to find. @@ -553,12 +560,24 @@ def find_one(self, entity_type, filters, fields=None, order=None, :param retired_only: Optional, flag to return only entities that have been retried. Defaults to False which returns only entities which have not been retired. - + + :param additional_filter_presets: Optional list of presets to + further filter the result set, list has the form: + [{"preset_name": , : , ... }] + + Note that these filters are ANDed together and ANDed with the 'filter' + argument. + + For details on supported presets and the format of this parameter, + please consult the API documentation: + https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax + :returns: Dictionary of requested Shotgun fields and values. """ results = self.find(entity_type, filters, fields, order, - filter_operator, 1, retired_only, include_archived_projects=include_archived_projects) + filter_operator, 1, retired_only, include_archived_projects=include_archived_projects, + additional_filter_presets=additional_filter_presets) if results: return results[0] @@ -566,7 +585,7 @@ def find_one(self, entity_type, filters, fields=None, order=None, def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0, - include_archived_projects=True): + include_archived_projects=True, additional_filter_presets=None): """Find entities matching the given filters. :param entity_type: Required, entity type (string) to find. @@ -593,7 +612,18 @@ def find(self, entity_type, filters, fields=None, order=None, have not been retired. :param include_archived_projects: Optional, flag to include entities - whose projects have been archived + whose projects have been archived. + + :param additional_filter_presets: Optional list of presets to + further filter the result set, list has the form: + [{"preset_name": , : , ... }] + + Note that these filters are ANDed together and ANDed with the 'filter' + argument. + + For details on supported presets and the format of this parameter, + please consult the API documentation: + https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax :returns: list of the dicts for each entity with the requested fields, and their id and type. @@ -617,13 +647,16 @@ def find(self, entity_type, filters, fields=None, order=None, # So we only need to check the server version if it is False self.server_caps.ensure_include_archived_projects() + if additional_filter_presets: + self.server_caps.ensure_support_for_additional_filter_presets() params = self._construct_read_parameters(entity_type, fields, filters, retired_only, order, - include_archived_projects) + include_archived_projects, + additional_filter_presets) if limit and limit <= self.config.records_per_page: params["paging"]["entities_per_page"] = limit @@ -667,7 +700,8 @@ def _construct_read_parameters(self, filters, retired_only, order, - include_archived_projects): + include_archived_projects, + additional_filter_presets): params = {} params["type"] = entity_type params["return_fields"] = fields or ["id"] @@ -677,6 +711,9 @@ def _construct_read_parameters(self, params["paging"] = { "entities_per_page": self.config.records_per_page, "current_page": 1 } + if additional_filter_presets: + params["additional_filter_presets"] = additional_filter_presets; + if include_archived_projects is False: # Defaults to True on the server, so only pass it if it's False params["include_archived_projects"] = False @@ -695,7 +732,6 @@ def _construct_read_parameters(self, params['sorts'] = sort_list return params - def _add_project_param(self, params, project_entity): if project_entity and self.server_caps.ensure_per_project_customization(): @@ -1909,8 +1945,7 @@ def text_search(self, text, entity_types, project_ids=None, limit=None): api_entity_types = {} for (entity_type, filter_list) in entity_types.iteritems(): - - + if isinstance(filter_list, (list, tuple)): resolved_filters = _translate_filters(filter_list, filter_operator=None) api_entity_types[entity_type] = resolved_filters diff --git a/tests/test_api.py b/tests/test_api.py index afcfe07ae..68b681d7b 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -14,6 +14,7 @@ import unittest import urlparse import urllib2 +import warnings import shotgun_api3 from shotgun_api3.lib.httplib2 import Http, SSLHandshakeError @@ -196,11 +197,11 @@ def test_upload_download(self): # test invalid requests INVALID_S3_URL = "https://sg-media-usor-01.s3.amazonaws.com/ada3de3ee3873875e1dd44f2eb0882c75ae36a4a/cd31346421dbeef781e0e480f259a3d36652d7f2/IMG_0465.MOV?AWSAccessKeyId=AKIAIQGOBSVN3FSQ5QFA&Expires=1371789959&Signature=SLbzv7DuVlZ8XAoOSQQAiGpF3u8%3D" - self.assertRaises(shotgun_api3.ShotgunFileDownloadError, + self.assertRaises(shotgun_api3.ShotgunFileDownloadError, self.sg.download_attachment, {"url": INVALID_S3_URL}) INVALID_ATTACHMENT_ID = 99999999 - self.assertRaises(shotgun_api3.ShotgunFileDownloadError, + self.assertRaises(shotgun_api3.ShotgunFileDownloadError, self.sg.download_attachment, INVALID_ATTACHMENT_ID) self.assertRaises(TypeError, self.sg.download_attachment, @@ -318,7 +319,7 @@ def test_upload_thumbnail_for_task(self): self.version['id'], {'image': None}) expected_clear_thumbnail = {'id': self.version['id'], 'image': None, 'type': 'Version'} self.assertEqual(expected_clear_thumbnail, response_clear_thumbnail) - + def test_upload_thumbnail_with_upload_function(self): """Upload thumbnail via upload function test""" path = os.path.abspath(os.path.expanduser(os.path.join(os.path.dirname(__file__), "sg_logo.jpg"))) @@ -326,11 +327,11 @@ def test_upload_thumbnail_with_upload_function(self): # upload thumbnail thumb_id = self.sg.upload("Task", self.task['id'], path, 'image') self.assertTrue(isinstance(thumb_id, int)) - + #upload filmstrip thumbnail f_thumb_id = self.sg.upload("Task", self.task['id'], path, 'filmstrip_image') self.assertTrue(isinstance(f_thumb_id, int)) - + def test_linked_thumbnail_url(self): this_dir, _ = os.path.split(__file__) path = os.path.abspath(os.path.expanduser( @@ -475,7 +476,7 @@ def test_summary_values(self): """Test summarize return data""" # create three unique shots - shot_prefix = uuid.uuid4().hex + shot_prefix = uuid.uuid4().hex shots = [] @@ -492,7 +493,7 @@ def test_summary_values(self): "sg_cut_duration": 100, "project": self.project } - + shot_data_3 = { "code": "%s Shot 3" % shot_prefix, "sg_status_list": "fin", @@ -511,14 +512,14 @@ def test_summary_values(self): shots.append(self.sg.create("Shot", shot_data_2)) shots.append(self.sg.create("Shot", shot_data_3)) shots.append(self.sg.create("Shot", shot_data_4)) - + summaries = [{'field': 'id', 'type': 'count'}, {'field': 'sg_cut_duration', 'type': 'sum'}] - grouping = [{'direction': 'asc', - 'field': 'sg_status_list', + grouping = [{'direction': 'asc', + 'field': 'sg_status_list', 'type': 'exact'}] - filters = [['project', 'is', self.project], + filters = [['project', 'is', self.project], ['code', 'starts_with', shot_prefix]] result = self.sg.summarize('Shot', filters=filters, @@ -1448,7 +1449,7 @@ def test_include_archived_projects(self): result = self.sg.find_one('Shot', [['id','is',self.shot['id']]]) self.assertEquals(self.shot['id'], result['id']) - # archive project + # archive project self.sg.update('Project', self.project['id'], {'archived':True}) # setting defaults to True, so we should get result @@ -1468,7 +1469,7 @@ def setUp(self): def test_follow(self): '''Test follow method''' - + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): return @@ -1477,22 +1478,22 @@ def test_follow(self): def test_unfollow(self): '''Test unfollow method''' - + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): return - + result = self.sg.unfollow(self.human_user, self.shot) assert(result['unfollowed']) - + def test_followers(self): '''Test followers method''' - + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): return - + result = self.sg.follow(self.human_user, self.shot) assert(result['followed']) - + result = self.sg.followers(self.shot) self.assertEqual( 1, len(result) ) self.assertEqual( self.human_user['id'], result[0]['id'] ) @@ -1590,7 +1591,7 @@ def test_sha2_error_with_strict(self, mock_request): # save the original state original_env_val = os.environ.pop("SHOTGUN_FORCE_CERTIFICATE_VALIDATION", None) os.environ["SHOTGUN_FORCE_CERTIFICATE_VALIDATION"] = "1" - + # ensure we're starting with the right values self.sg.config.no_ssl_validation = False shotgun_api3.shotgun.NO_SSL_VALIDATION = False @@ -1636,12 +1637,12 @@ def test_sanitized_auth_params(self, mock_open): class TestScriptUserSudoAuth(base.LiveTestBase): def setUp(self): super(TestScriptUserSudoAuth, self).setUp('ApiUser') - + def test_user_is_creator(self): """ Test 'sudo_as_login' option: on create, ensure appropriate user is set in created-by """ - + if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 3, 12): return @@ -1650,7 +1651,7 @@ def test_user_is_creator(self): self.config.api_key, http_proxy=self.config.http_proxy, sudo_as_login=self.config.human_login ) - + data = { 'project': self.project, 'code':'JohnnyApple_Design01_FaceFinal', @@ -1669,7 +1670,7 @@ def test_user_is_creator(self): class TestHumanUserSudoAuth(base.TestBase): def setUp(self): super(TestHumanUserSudoAuth, self).setUp('HumanUser') - + def test_human_user_sudo_auth_fails(self): """ Test 'sudo_as_login' option for HumanUser. @@ -1701,7 +1702,7 @@ class TestHumanUserAuth(base.HumanUserAuthLiveTestBase): """ Testing the username/password authentication method """ - + def test_humanuser_find(self): """Called find, find_one for known entities as human user""" filters = [] @@ -1827,7 +1828,7 @@ def test_logged_in_user(self): login=self.config.human_login, password=self.config.human_password, http_proxy=self.config.http_proxy) - + initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) sg.update_project_last_accessed(self.project) @@ -1847,7 +1848,7 @@ def test_pass_in_user(self): login=self.config.human_login, password=self.config.human_password, http_proxy=self.config.http_proxy ) - + initial = sg.find_one('Project', [['id','is',self.project['id']]], ['last_accessed_by_current_user']) time.sleep(1) @@ -1886,23 +1887,23 @@ class TestActivityStream(base.LiveTestBase): """ Unit tests for the activity_stream_read() method """ - + def setUp(self): super(TestActivityStream, self).setUp() - self._prefix = uuid.uuid4().hex + self._prefix = uuid.uuid4().hex - self._shot = self.sg.create("Shot", {"code": "%s activity stream test" % self._prefix, + self._shot = self.sg.create("Shot", {"code": "%s activity stream test" % self._prefix, "project": self.project}) - - self._note = self.sg.create("Note", {"content": "Test!", - "project": self.project, + + self._note = self.sg.create("Note", {"content": "Test!", + "project": self.project, "note_links": [self._shot]}) # check that if the created_by is a script user, we want to ensure # that event log generation is enabled for this user. If it has been - # disabled, these tests will fail because the activity stream is + # disabled, these tests will fail because the activity stream is # connected to events. In this case, print a warning to the user - d = self.sg.find_one("Shot", + d = self.sg.find_one("Shot", [["id", "is", self._shot["id"] ]], ["created_by.ApiUser.generate_event_log_entries"]) @@ -1912,34 +1913,34 @@ def setUp(self): "tests has got the generate event log entries setting set to " "off. This will cause the activity stream tests to fail. " "Please enable event log generation for the script user.") - + def tearDown(self): batch_data = [] batch_data.append({"request_type": "delete", "entity_type": self._note["type"], "entity_id": self._note["id"] - }) + }) batch_data.append({"request_type": "delete", "entity_type": self._shot["type"], "entity_id": self._shot["id"] }) self.sg.batch(batch_data) - + super(TestActivityStream, self).tearDown() def test_simple(self): """ Test activity stream """ - + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - - result = self.sg.activity_stream_read(self._shot["type"], + + result = self.sg.activity_stream_read(self._shot["type"], self._shot["id"]) - - expected_keys = ["earliest_update_id", + + expected_keys = ["earliest_update_id", "entity_id", "entity_type", "latest_update_id", @@ -1949,20 +1950,20 @@ def test_simple(self): self.assertEqual(len(result["updates"]), 2) self.assertEqual(result["entity_type"], "Shot") self.assertEqual(result["entity_id"], self._shot["id"]) - + def test_limit(self): """ Test limited activity stream """ - + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - - result = self.sg.activity_stream_read(self._shot["type"], - self._shot["id"], + + result = self.sg.activity_stream_read(self._shot["type"], + self._shot["id"], limit=1) - + self.assertEqual(len(result["updates"]), 1) self.assertEqual(result["updates"][0]["update_type"], "create") self.assertEqual(result["updates"][0]["meta"]["entity_type"], "Note") @@ -1972,24 +1973,24 @@ def test_extra_fields(self): """ Test additional fields for activity stream """ - + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - - result = self.sg.activity_stream_read(self._shot["type"], - self._shot["id"], - entity_fields={"Shot": ["created_by.HumanUser.image"], + + result = self.sg.activity_stream_read(self._shot["type"], + self._shot["id"], + entity_fields={"Shot": ["created_by.HumanUser.image"], "Note": ["content"]}) - + self.assertEqual(len(result["updates"]), 2) - self.assertEqual(set(result["updates"][0]["primary_entity"].keys()), + self.assertEqual(set(result["updates"][0]["primary_entity"].keys()), set(["content", "id", "name", "status", "type"])) - - self.assertEqual(set(result["updates"][1]["primary_entity"].keys()), + + self.assertEqual(set(result["updates"][1]["primary_entity"].keys()), set(["created_by.HumanUser.image", "id", "name", @@ -2000,103 +2001,103 @@ class TestNoteThreadRead(base.LiveTestBase): """ Unit tests for the note_thread_read method """ - + def setUp(self): super(TestNoteThreadRead, self).setUp() - + # get path to our std attahcment this_dir, _ = os.path.split(__file__) self._thumbnail_path = os.path.abspath(os.path.join(this_dir, "sg_logo.jpg")) - - + + def _check_note(self, data, note_id, additional_fields): - + # check the expected fields expected_fields = set(["content", "created_at", "created_by", "id", "type"] + additional_fields) - + self.assertEqual(expected_fields, set(data.keys())) - + # check that the data matches the data we get from a find call - note_data = self.sg.find_one("Note", - [["id", "is", note_id]], + note_data = self.sg.find_one("Note", + [["id", "is", note_id]], list(expected_fields)) self.assertEqual(note_data, data) - + def _check_reply(self, data, reply_id, additional_fields): - + # check the expected fields expected_fields = set(["content", "created_at", "user", "id", "type"] + additional_fields) self.assertEqual(expected_fields, set(data.keys())) - + # check that the data matches the data we get from a find call - reply_data = self.sg.find_one("Reply", - [["id", "is", reply_id]], + reply_data = self.sg.find_one("Reply", + [["id", "is", reply_id]], list(expected_fields)) - + # the reply stream adds an image to the user fields in order # to include thumbnails for users, so remove this before we compare # against the shotgun find data. The image is tested elsewhere. del data["user"]["image"] - + self.assertEqual(reply_data, data) - + def _check_attachment(self, data, attachment_id, additional_fields): - - - - + + + + # check the expected fields expected_fields = set(["created_at", "created_by", "id", "type"] + additional_fields) self.assertEqual(expected_fields, set(data.keys())) - + # check that the data matches the data we get from a find call - attachment_data = self.sg.find_one("Attachment", - [["id", "is", attachment_id]], + attachment_data = self.sg.find_one("Attachment", + [["id", "is", attachment_id]], list(expected_fields)) - + self.assertEqual(attachment_data, data) - + def test_simple(self): """ Test note reply thread API call """ if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - + # create note note = self.sg.create( "Note", {"content": "Test!", "project": self.project}) - + # for this test, we check that the replies returned also # contain the thumbnail associated with the user doing the # reply. For this, make sure that there is a thumbnail # associated with the current user - - d = self.sg.find_one("Note", - [["id", "is", note["id"]]], + + d = self.sg.find_one("Note", + [["id", "is", note["id"]]], ["created_by", "created_by.ApiUser.image"]) - + current_thumbnail = d["created_by.ApiUser.image"] - + if current_thumbnail is None: # upload thumbnail - self.sg.upload_thumbnail("ApiUser", - d["created_by"]["id"], + self.sg.upload_thumbnail("ApiUser", + d["created_by"]["id"], self._thumbnail_path) - d = self.sg.find_one("Note", - [["id", "is", note["id"]]], + d = self.sg.find_one("Note", + [["id", "is", note["id"]]], ["created_by", "created_by.ApiUser.image"]) - + current_thumbnail = d["created_by.ApiUser.image"] - + # get thread result = self.sg.note_thread_read(note["id"]) self.assertEqual(len(result), 1) self._check_note(result[0], note["id"], additional_fields=[]) - + # now add a reply reply = self.sg.create( "Reply", {"content": "Reply Content", "entity": note}) - + # get thread result = self.sg.note_thread_read(note["id"]) self.assertEqual(len(result), 2) @@ -2109,198 +2110,334 @@ def test_simple(self): url_obj_b = urlparse.urlparse(reply_thumb) self.assertEqual("%s/%s" % (url_obj_a.netloc, url_obj_a.path), "%s/%s" % (url_obj_b.netloc, url_obj_b.path),) - + # and check ther rest of the data self._check_note(result[0], note["id"], additional_fields=[]) self._check_reply(result[1], reply["id"], additional_fields=[]) - + # now upload an attachment - attachment_id = self.sg.upload(note["type"], note["id"], self._thumbnail_path) - + attachment_id = self.sg.upload(note["type"], note["id"], self._thumbnail_path) + # get thread result = self.sg.note_thread_read(note["id"]) self.assertEqual(len(result), 3) self._check_note(result[0], note["id"], additional_fields=[]) self._check_reply(result[1], reply["id"], additional_fields=[]) self._check_attachment(result[2], attachment_id, additional_fields=[]) - + def test_complex(self): """ Test note reply thread API call with additional params """ - + if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - - additional_fields = { - "Note": ["created_by.HumanUser.image", - "addressings_to", - "playlist", + + additional_fields = { + "Note": ["created_by.HumanUser.image", + "addressings_to", + "playlist", "user" ], - "Reply": ["content"], + "Reply": ["content"], "Attachment": ["this_file"] } - + # create note - note = self.sg.create( "Note", {"content": "Test!", + note = self.sg.create( "Note", {"content": "Test!", "project": self.project, "addressings_to": [self.human_user]}) - + # get thread result = self.sg.note_thread_read(note["id"], additional_fields) - + self.assertEqual(len(result), 1) self._check_note(result[0], note["id"], additional_fields["Note"]) - + # now add a reply reply = self.sg.create( "Reply", {"content": "Reply Content", "entity": note}) - + # get thread - result = self.sg.note_thread_read(note["id"], additional_fields) + result = self.sg.note_thread_read(note["id"], additional_fields) self.assertEqual(len(result), 2) self._check_note(result[0], note["id"], additional_fields["Note"]) self._check_reply(result[1], reply["id"], additional_fields["Reply"]) - + # now upload an attachment attachment_id = self.sg.upload(note["type"], note["id"], self._thumbnail_path) # get thread - result = self.sg.note_thread_read(note["id"], additional_fields) + result = self.sg.note_thread_read(note["id"], additional_fields) self.assertEqual(len(result), 3) self._check_note(result[0], note["id"], additional_fields["Note"]) self._check_reply(result[1], reply["id"], additional_fields["Reply"]) - + self._check_attachment(result[2], attachment_id, additional_fields["Attachment"]) - + class TestTextSearch(base.LiveTestBase): """ Unit tests for the text_search() method """ - + def setUp(self): super(TestTextSearch, self).setUp() - + # create 5 shots and 5 assets to search for - self._prefix = uuid.uuid4().hex - + self._prefix = uuid.uuid4().hex + batch_data = [] for i in range(5): data = { "code":"%s Text Search %s" % (self._prefix, i), "project": self.project } batch_data.append( {"request_type": "create", "entity_type": "Shot", - "data": data} ) + "data": data} ) batch_data.append( {"request_type": "create", "entity_type": "Asset", - "data": data} ) + "data": data} ) data = self.sg.batch(batch_data) - + self._shot_ids = [x["id"] for x in data if x["type"] == "Shot"] self._asset_ids = [x["id"] for x in data if x["type"] == "Asset"] - + def tearDown(self): - + # clean up batch_data = [] for shot_id in self._shot_ids: batch_data.append({"request_type": "delete", "entity_type": "Shot", "entity_id": shot_id - }) + }) for asset_id in self._asset_ids: batch_data.append({"request_type": "delete", "entity_type": "Asset", "entity_id": asset_id }) - self.sg.batch(batch_data) - - super(TestTextSearch, self).tearDown() - + self.sg.batch(batch_data) + + super(TestTextSearch, self).tearDown() + def test_simple(self): """ Test basic global search """ if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - + result = self.sg.text_search("%s Text Search" % self._prefix, {"Shot" : [] } ) - + self.assertEqual(set(["matches", "terms"]), set(result.keys())) self.assertEqual(result["terms"], [self._prefix, "text", "search"]) matches = result["matches"] self.assertEqual(len(matches), 5) - + for match in matches: self.assertTrue(match["id"] in self._shot_ids) self.assertEqual(match["type"], "Shot") self.assertEqual(match["project_id"], self.project["id"]) self.assertEqual(match["image"], None) - + def test_limit(self): """ Test limited global search """ if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - - result = self.sg.text_search("%s Text Search" % self._prefix, {"Shot" : [] }, limit=3 ) + + result = self.sg.text_search("%s Text Search" % self._prefix, {"Shot" : [] }, limit=3 ) matches = result["matches"] self.assertEqual(len(matches), 3) - + def test_entity_filter(self): """ Test basic multi-type global search """ if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - - result = self.sg.text_search("%s Text Search" % self._prefix, + + result = self.sg.text_search("%s Text Search" % self._prefix, {"Shot": [], "Asset": [] } ) - + matches = result["matches"] - + self.assertEqual(set(["matches", "terms"]), set(result.keys())) self.assertEqual(len(matches), 10) - - + + def test_complex_entity_filter(self): """ Test complex multi-type global search """ if not self.sg.server_caps.version or self.sg.server_caps.version < (6, 2, 0): return - - result = self.sg.text_search("%s Text Search" % self._prefix, - {"Shot": [["code", "ends_with", "3"]], + + result = self.sg.text_search("%s Text Search" % self._prefix, + {"Shot": [["code", "ends_with", "3"]], "Asset": [ - {"filter_operator": "any", + {"filter_operator": "any", "filters": [["code", "ends_with", "4"]] } ] }) - + matches = result["matches"] - + self.assertEqual(set(["matches", "terms"]), set(result.keys())) self.assertEqual(len(matches), 2) - + self.assertEqual(matches[0]["type"], "Shot") self.assertEqual(matches[0]["name"], "%s Text Search 3" % self._prefix) self.assertEqual(matches[1]["type"], "Asset") self.assertEqual(matches[1]["name"], "%s Text Search 4" % self._prefix) - - +class TestReadAdditionalFilterPresets(base.LiveTestBase): + """ + Unit tests for the additional_filter_presets read parameter + """ + + def test_simple_case(self): + if self.sg_version < (7, 0, 0): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + filters = [ + ["project", "is", self.project], + ["id", "is", self.version["id"]] + ] + + fields = ["id"] + + additional_filters = [{"preset_name": "LATEST", "latest_by": "ENTITIES_CREATED_AT"}] + + versions = self.sg.find("Version", filters, fields=fields, additional_filter_presets=additional_filters) + version = versions[0] + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version["id"], version["id"]) + + + def test_find_one(self): + if self.sg_version < (7, 0, 0): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + filters = [ + ["project", "is", self.project], + ["id", "is", self.version["id"]] + ] + + fields = ["id"] + + additional_filters = [{"preset_name": "LATEST", "latest_by": "ENTITIES_CREATED_AT"}] + + version = self.sg.find_one("Version", filters, fields=fields, additional_filter_presets=additional_filters) + self.assertEqual("Version", version["type"]) + self.assertEqual(self.version["id"], version["id"]) + + def test_filter_with_no_name(self): + if self.sg_version < (7, 0, 0): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + filters = [ + ["project", "is", self.project], + ["id", "is", self.version["id"]] + ] + + fields = ["id"] + + additional_filters = [{}] + + self.assertRaises(shotgun_api3.Fault, + self.sg.find, + "Version", filters, fields=fields, additional_filter_presets=additional_filters) + + def test_invalid_filter(self): + if self.sg_version < (7, 0, 0): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + + filters = [ + ["project", "is", self.project], + ["id", "is", self.version["id"]] + ] + + fields = ["id"] + + additional_filters = [{"preset_name" : "BAD_FILTER"}] + + self.assertRaises(shotgun_api3.Fault, + self.sg.find, + "Version", filters, fields=fields, additional_filter_presets=additional_filters) + + def test_filter_not_iterable(self): + if self.sg_version < (7, 0, 0): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + filters = [ + ["project", "is", self.project], + ["id", "is", self.version["id"]] + ] + + fields = ["id"] + + additional_filters = 3 + + self.assertRaises(shotgun_api3.Fault, + self.sg.find, + "Version", filters, fields=fields, additional_filter_presets=additional_filters) + + + def test_filter_not_list_of_iterable(self): + if self.sg_version < (7, 0, 0): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + filters = [ + ["project", "is", self.project], + ["id", "is", self.version["id"]] + ] + + fields = ["id"] + + additional_filters = [3] -def _has_unicode(data): + self.assertRaises(shotgun_api3.Fault, + self.sg.find, + "Version", filters, fields=fields, additional_filter_presets=additional_filters) + + + def test_multiple_latest_filters(self): + if self.sg_version < (7, 0, 0): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + filters = [ + ["project", "is", self.project], + ["id", "is", self.version["id"]] + ] + + fields = ["id"] + + additional_filters = ({"preset_name": "LATEST", "latest_by": "ENTITY_CREATED_AT"}, + {"preset_name": "LATEST", "latest_by": "PIPELINE_STEP_NUMBER_AND_ENTITIES_CREATED_AT"}) + + self.assertRaises(shotgun_api3.Fault, + self.sg.find, + "Version", filters, fields=fields, additional_filter_presets=additional_filters) + + +def _has_unicode(data): for k, v in data.items(): - if (isinstance(k, unicode)): + if isinstance(k, unicode): return True - if (isinstance(v, unicode)): + if isinstance(v, unicode): return True return False + def _get_path(url): """Returns path component of a url without the sheme, host, query, anchor, or any other additional elements. From 656898f532c58bd2fa757f4595ca61bab169b00d Mon Sep 17 00:00:00 2001 From: Jeff Beeland Date: Wed, 18 May 2016 14:52:36 -0700 Subject: [PATCH 138/389] Updates README changelog for v3.0.31.dev. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 543ef0f8a..a3e7d855c 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ Integration and unit tests are provided. **v3.0.31.dev - TBD** + + Add optional "additional_filter_presets" argument to find() and find_one() + TBD **v3.0.30 - 2016 Apr 25** From f31336c7682cb720bb1f3d9a75db3d3cc3edad1a Mon Sep 17 00:00:00 2001 From: Jeff Beeland Date: Wed, 18 May 2016 18:41:29 -0700 Subject: [PATCH 139/389] Packaging for the v3.0.31 release. --- README.md | 3 +-- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a3e7d855c..0e9d01c12 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,9 @@ Integration and unit tests are provided. ## Changelog -**v3.0.31.dev - TBD** +**v3.0.31 - 2016 May 18** + Add optional "additional_filter_presets" argument to find() and find_one() - + TBD **v3.0.30 - 2016 Apr 25** diff --git a/setup.py b/setup.py index 095aa837e..2743729c6 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.31.dev', + version='3.0.31', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 04e4ad338..84c1a2afe 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.31.dev" +__version__ = "3.0.31" # ---------------------------------------------------------------------------- # Errors From b82183bb5094fbaaada45cdf685100109c6bbd49 Mon Sep 17 00:00:00 2001 From: Jeff Beeland Date: Thu, 19 May 2016 11:35:52 -0700 Subject: [PATCH 140/389] Bumps version to v3.0.32.dev --- README.md | 4 ++++ shotgun_api3/shotgun.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0e9d01c12..241a851e5 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,10 @@ Integration and unit tests are provided. ## Changelog +**v3.0.32.dev - TBD** + + + TBD + **v3.0.31 - 2016 May 18** + Add optional "additional_filter_presets" argument to find() and find_one() diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 84c1a2afe..587ecc9b3 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -78,7 +78,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.31" +__version__ = "3.0.32.dev" # ---------------------------------------------------------------------------- # Errors From 3a0279a201bd9200ebf2863f17c1219434ef9086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 31 May 2016 07:46:05 -0400 Subject: [PATCH 141/389] For #34163, better import strategy for mimetypes We now always import the bundled mimetypesmodule on versions of Python that are broken. Closes https://github.com/shotgunsoftware/python-api/pull/116 --- shotgun_api3/lib/mimetypes.py | 34 +++++++++++++++++++-------------- shotgun_api3/sg_26.py | 27 ++++++++++++++++++-------- tests/tests_unit.py | 36 +++++++++++++++++++++++++++-------- 3 files changed, 67 insertions(+), 30 deletions(-) diff --git a/shotgun_api3/lib/mimetypes.py b/shotgun_api3/lib/mimetypes.py index 7f28b8965..a39b543c4 100644 --- a/shotgun_api3/lib/mimetypes.py +++ b/shotgun_api3/lib/mimetypes.py @@ -242,28 +242,34 @@ def enum_types(mimedb): i = 0 while True: try: - yield _winreg.EnumKey(mimedb, i) + ctype = _winreg.EnumKey(mimedb, i) except EnvironmentError: break + else: + if '\0' not in ctype: + yield ctype i += 1 + default_encoding = sys.getdefaultencoding() with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr: for subkeyname in enum_types(hkcr): - # Only check file extensions, not all possible classes - if not subkeyname.startswith("."): - continue - - with _winreg.OpenKey(hkcr, subkeyname) as subkey: - # If there is no "Content Type" value, or if it is not - # a simple string, simply skip - try: + try: + with _winreg.OpenKey(hkcr, subkeyname) as subkey: + # Only check file extensions + if not subkeyname.startswith("."): + continue + # raises EnvironmentError if no 'Content Type' value mimetype, datatype = _winreg.QueryValueEx( subkey, 'Content Type') - except EnvironmentError: - continue - if datatype != _winreg.REG_SZ: - continue - self.add_type(mimetype, subkeyname, strict) + if datatype != _winreg.REG_SZ: + continue + try: + mimetype = mimetype.encode(default_encoding) + except UnicodeEncodeError: + continue + self.add_type(mimetype, subkeyname, strict) + except EnvironmentError: + continue def guess_type(url, strict=True): """Guess the type of a file based on its URL. diff --git a/shotgun_api3/sg_26.py b/shotgun_api3/sg_26.py index 544bf069f..2f296fb90 100644 --- a/shotgun_api3/sg_26.py +++ b/shotgun_api3/sg_26.py @@ -26,12 +26,23 @@ sys.path.pop() -import mimetypes # used for attachment upload -try: - mimetypes.add_type('video/webm','.webm') # try adding to test for unicode error -except (UnicodeDecodeError, TypeError): - # Ticket #25579: python bug on windows with unicode - # Ticket #23371: mimetypes initialization fails on Windows because of TypeError - # (http://bugs.python.org/issue23371) - # Use patched version of mimetypes +def _is_mimetypes_broken(): + """ + Checks if this version of Python ships with a broken version of mimetypes + + :returns: True if the version of mimetypes is broken, False otherwise. + """ + # mimetypes is broken on Windows only and for Python 2.7.0 to 2.7.9 inclusively. + # We're bundling the version from 2.7.10. + # See bugs : + # http://bugs.python.org/issue9291 <- Fixed in 2.7.7 + # http://bugs.python.org/issue21652 <- Fixed in 2.7.8 + # http://bugs.python.org/issue22028 <- Fixed in 2.7.10 + return (sys.platform == "win32" and + sys.version_info[0] == 2 and sys.version_info[1] == 7 and + sys.version_info[2] >= 0 and sys.version_info[2] <= 9) + +if _is_mimetypes_broken(): from .lib import mimetypes as mimetypes +else: + import mimetypes diff --git a/tests/tests_unit.py b/tests/tests_unit.py index a16ad9034..2f2a04db2 100755 --- a/tests/tests_unit.py +++ b/tests/tests_unit.py @@ -2,6 +2,7 @@ import unittest from mock import patch, Mock import shotgun_api3 as api +from shotgun_api3.sg_26 import _is_mimetypes_broken class TestShotgunInit(unittest.TestCase): '''Test case for Shotgun.__init__''' @@ -393,13 +394,32 @@ def test_invalid(self): self.assertRaises(api.ShotgunError, api.shotgun._translate_filters, filters, "all") -if __name__ == '__main__': - unittest.main() - - - +class TestMimetypesFix(unittest.TestCase): + """ + Makes sure that the mimetypes fix will be imported. + """ + + @patch('shotgun_api3.sg_26.sys') + def _test_mimetypes_import(self, platform, major, minor, patch, result, mock): + """ + Mocks sys.platform and sys.version_info to test the mimetypes import code. + """ + + mock.version_info = [major, minor, patch] + mock.platform = platform + self.assertEqual(_is_mimetypes_broken(), result) + + def test_correct_mimetypes_imported(self): + """ + Makes sure fix is imported for only for Python 2.7.0 to 2.7.7 on win32 + """ + self._test_mimetypes_import("win32", 2, 6, 9, False) + for patch in range(0, 10): # 0 to 9 inclusively + self._test_mimetypes_import("win32", 2, 7, patch, True) + self._test_mimetypes_import("win32", 2, 7, 10, False) + self._test_mimetypes_import("win32", 3, 0, 0, False) + self._test_mimetypes_import("darwin", 2, 7, 0, False) - - - +if __name__ == '__main__': + unittest.main() From 99e4603ad208eab31297e080aca4014e2dfcdb03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 31 May 2016 08:08:27 -0400 Subject: [PATCH 142/389] [minor] Added release comments --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 241a851e5..c8e66d709 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,8 @@ Integration and unit tests are provided. **v3.0.32.dev - TBD** - + TBD + + Optimized import speed of the API on Python 2.7. + + Integrated the latest fixes to the `mimetypes` module. **v3.0.31 - 2016 May 18** From 65621d906f7b0923b9b0405f2c0726363d56e3c2 Mon Sep 17 00:00:00 2001 From: Josh Tomlinson Date: Thu, 1 Sep 2016 21:56:17 -0400 Subject: [PATCH 143/389] #36383 Adds nav_expand() method to python-api Creating PR for work done by @daigles on nav_expand() endpoint... * Adds method to ensure filter presets are supported * adds optional additional_filter_presets args where needed with links to docs * adds unit test for nav_expand call. --- shotgun_api3/shotgun.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 587ecc9b3..6320019fa 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2049,6 +2049,25 @@ def activity_stream_read(self, entity_type, entity_id, entity_fields=None, result = self._parse_records(record)[0] return result + def nav_expand(self, path, seed_entity_field=None, entity_fields=None): + """ + Expand the navigation hierarchy for the supplied path. + + .. warning:: + + This is an experimental method that is not officially part of the + python-api. Usage of this method is discouraged. This method's name, + arguments, and argument types may change at any point. + + """ + return self._call_rpc( + 'nav_expand', + { + 'path':path, + 'seed_entity_field': seed_entity_field, + 'entity_fields': entity_fields + } + ) def get_session_token(self): """Get the session token associated with the current session. From b5138d601ea48a2b02d4cd59be59335f73df7ea1 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 22 Sep 2016 00:13:58 -0500 Subject: [PATCH 144/389] for #36764: move documentation to sphinx This moves our official documentation to http://developer.shotgunsoftware.com/python-api. The Github wiki pages will be removed and visitors will be pointed to the new docs. This has been a long time coming! - add detailed docstrings to all methods with examples where possible and references to other documentation. - port all existing documentation from the Github wiki. - move changelog to dedicated HISTORY file which can be referenced when building sphinx docs. closes #117 --- HISTORY.rst | 314 +++ README.md | 289 +-- docs/advanced.rst | 16 + docs/advanced/iron_python.rst | 37 + docs/advanced/packaging.rst | 40 + docs/authentication.rst | 65 + docs/changelog.rst | 3 + docs/cookbook.rst | 62 + docs/cookbook/attachments.rst | 325 +++ docs/cookbook/examples/ami_handler.rst | 246 ++ .../examples/ami_version_packager.rst | 257 ++ docs/cookbook/examples/basic_create_shot.rst | 103 + .../basic_create_shot_task_template.rst | 77 + .../basic_create_version_link_shot.rst | 82 + docs/cookbook/examples/basic_delete_shot.rst | 52 + docs/cookbook/examples/basic_find_shot.rst | 76 + docs/cookbook/examples/basic_sg_instance.rst | 26 + docs/cookbook/examples/basic_update_shot.rst | 86 + .../basic_upload_thumbnail_version.rst | 27 + docs/cookbook/examples/svn_integration.rst | 170 ++ docs/cookbook/smart_cut_fields.rst | 53 + docs/cookbook/tasks.rst | 13 + docs/cookbook/tasks/split_tasks.rst | 257 ++ docs/cookbook/tasks/task_dependencies.rst | 339 +++ docs/cookbook/tasks/updating_tasks.rst | 371 +++ docs/cookbook/tutorials.rst | 33 + docs/cookbook/usage_tips.rst | 302 +++ docs/images/scripts_page.png | Bin 0 -> 87417 bytes docs/images/split_tasks_1.png | Bin 0 -> 24333 bytes docs/images/split_tasks_2.png | Bin 0 -> 25008 bytes docs/images/split_tasks_3.png | Bin 0 -> 25580 bytes docs/images/split_tasks_4.png | Bin 0 -> 25652 bytes docs/images/split_tasks_5.png | Bin 0 -> 25409 bytes docs/images/split_tasks_6.png | Bin 0 -> 25346 bytes docs/images/split_tasks_7.png | Bin 0 -> 25067 bytes docs/images/split_tasks_8.png | Bin 0 -> 25409 bytes docs/images/split_tasks_9.png | Bin 0 -> 25022 bytes docs/index.rst | 70 + docs/installation.rst | 57 + docs/reference.rst | 795 +++++++ shotgun_api3/shotgun.py | 2102 +++++++++++------ 41 files changed, 5769 insertions(+), 976 deletions(-) create mode 100644 HISTORY.rst create mode 100644 docs/advanced.rst create mode 100644 docs/advanced/iron_python.rst create mode 100644 docs/advanced/packaging.rst create mode 100644 docs/authentication.rst create mode 100644 docs/changelog.rst create mode 100644 docs/cookbook.rst create mode 100644 docs/cookbook/attachments.rst create mode 100644 docs/cookbook/examples/ami_handler.rst create mode 100644 docs/cookbook/examples/ami_version_packager.rst create mode 100644 docs/cookbook/examples/basic_create_shot.rst create mode 100644 docs/cookbook/examples/basic_create_shot_task_template.rst create mode 100644 docs/cookbook/examples/basic_create_version_link_shot.rst create mode 100644 docs/cookbook/examples/basic_delete_shot.rst create mode 100644 docs/cookbook/examples/basic_find_shot.rst create mode 100644 docs/cookbook/examples/basic_sg_instance.rst create mode 100644 docs/cookbook/examples/basic_update_shot.rst create mode 100644 docs/cookbook/examples/basic_upload_thumbnail_version.rst create mode 100644 docs/cookbook/examples/svn_integration.rst create mode 100644 docs/cookbook/smart_cut_fields.rst create mode 100644 docs/cookbook/tasks.rst create mode 100644 docs/cookbook/tasks/split_tasks.rst create mode 100644 docs/cookbook/tasks/task_dependencies.rst create mode 100644 docs/cookbook/tasks/updating_tasks.rst create mode 100644 docs/cookbook/tutorials.rst create mode 100644 docs/cookbook/usage_tips.rst create mode 100644 docs/images/scripts_page.png create mode 100644 docs/images/split_tasks_1.png create mode 100644 docs/images/split_tasks_2.png create mode 100644 docs/images/split_tasks_3.png create mode 100644 docs/images/split_tasks_4.png create mode 100644 docs/images/split_tasks_5.png create mode 100644 docs/images/split_tasks_6.png create mode 100644 docs/images/split_tasks_7.png create mode 100644 docs/images/split_tasks_8.png create mode 100644 docs/images/split_tasks_9.png create mode 100644 docs/index.rst create mode 100644 docs/installation.rst create mode 100644 docs/reference.rst diff --git a/HISTORY.rst b/HISTORY.rst new file mode 100644 index 000000000..526ccf752 --- /dev/null +++ b/HISTORY.rst @@ -0,0 +1,314 @@ +**************************** +Shotgun Python API Changelog +**************************** + +Here you can see the full list of changes between each Python API release. + +v3.0.32.dev (TBD) +================= + +- Optimized import speed of the API on Python 2.7. +- Integrated the latest fixes to the ``mimetypes`` module. + +v3.0.31 (2016 May 18) +===================== + +- Add optional ``additional_filter_presets`` argument to :meth:`find` and :meth:`find_one` + +v3.0.30 (2016 Apr 25) +===================== + +- Add option to use add/remove/set modes when updating multi-entity fields. +- Add explicit file handler close to download_attachment. +- Add basic :meth:`find` ordering support to mockgun. +- Allow for product specific authorization parameters. + +v3.0.29 (2016 Mar 7) +==================== + +- Reverted the change to the default field names for image uploading. + +v3.0.28 (2016 Mar 3) +==================== + +- Refactored nested classing of ``sgtimezone`` library to allow for serializable timestamps. + +v3.0.27 (2016 Feb 18) +===================== + +- Make sure HTTP proxy authentication works with the ``@`` character in a password. +- Make sure sudo authentication test works with Shotgun versions after v6.3.10. +- Smarter uploading of thumbnails and filmstrips with the :meth:`upload` method. +- Improve Travis build integration of the Python-API to run the full suite of + API tests instead of just the unit and client tests. + +v3.0.26 (2016 Feb 1) +==================== + +- Updating testing framework to use environment variables inconjunction with existing + ``example_config`` file so that commits and pull requests are automatically run on travis-ci. +- Fix to prevent stripping out case-sensitivity of a URL if the user passes their credentials to + ``config.server`` as an authorization header. + +v3.0.25 (2016 Jan 12) +===================== + +- Add handling for Python versions incompatible with SHA-2 (see `this blog post + `_). +- Add ``SHOTGUN_FORCE_CERTIFICATE_VALIDATION`` environment variable to prevent disabling certficate + validation when SHA-2 validation is not available. +- Add SSL info to user-agent header. + +v3.0.24 (2016 Jan 08) +===================== + +- Not released. + +v3.0.23 (2015 Oct 26) +===================== + +- Fix for `python bug #23371 `_ on Windows loading mimetypes + module (thanks `@patrickwolf `_). +- Fix for tests on older versions of python. +- Sanitize authentication values before raising error. + +v3.0.22 (2015 Sept 9) +===================== + +- Added method :meth:`text_search` which allows an API client to access the Shotgun global search + and auto completer. +- Added method :meth:`activity_stream_read` which allows an API client to access the activity + stream for a given Shotgun entity. +- Added method :meth:`note_thread_read` which allows an API client to download an entire Note + conversation, including Replies and Attachments, using a single API call. +- Added an experimental ``mockgun`` module which can be used to emulate the Shotgun API, for + example inside unit test rigs. +- [minor] Improved docstrings. + +v3.0.21 (2015 Aug 13) +===================== + +- Update bundled ``httplib2`` module to latest v0.9.1 - fixes some bugs + +v3.0.20 (2015 Jun 10) +===================== + +- Add authentication support for Shotgun servers with two-factor authentication turned on. + +v3.0.19 (2015 Mar 25) +===================== + +- Add ability to authenticate with Shotgun using ``session_token``. +- Add :meth:`get_session_token` method for obtaining token to authenticate with. +- Add new ``AuthenticationFault`` exception type to indicate when server communication has failed + due to authentication reasons. +- Add support for ``SHOTGUN_API_CACERTS`` environment variable to provide location of external + SSL certificates file. +- Fixes and updates to various tests. + +v3.0.18 (2015 Mar 13) +===================== + +- Add ability to query the per-project visibility status for entities, fields and statuses. + (requires Shotgun server >= v5.4.4) + +v3.0.17 (2014 Jul 10) +===================== + +- Add ability to update ``last_accessed_by_current_user`` on Project. +- Add workaround for `bug #9291 in Python 2.7 `_ affecting + mimetypes library on Windows. +- Add platform and Python version to user-agent (eg. ``shotgun-json (3.0.17); Python 2.7 (Mac)``) + +v3.0.16 (2014 May 23) +===================== + +- Add flag to ignore entities from archived Projects. +- Add support for differentiating between zero and ``None`` for number fields. +- Add ability to act as a different user. + +v3.0.15 (2014 Mar 6) +==================== + +- Fixed bug which allowed a value of ``None`` for password parameter in + :meth:`authenticate_human_user` +- Add :meth:`follow`, :meth:`unfollow` and :meth:`followers` methods. +- Add ability to login as HumanUser. +- Ensure that webm/mp4 mime types are always available. +- Updated link to video tour in README. +- Fixes and updates to various tests. + +v3.0.14 (2013 Jun 26) +===================== + +- added: additional tests for thumbnails. +- added: support for downloading from s3 in :meth:`download_attachment`. Accepts an Attachment + entity dict as a parameter (is still backwards compatible with passing in an Attachment id). +- added: optional ``file_path`` parameter to :meth:`download_attachment` to write data directly to + disk instead of loading into memory. (thanks to Adam Goforth `@aag `_) + +v3.0.13 (2013 Apr 11) +===================== + +- fixed: #20856 :meth:`authenticate_human_user` login was sticky and would be used for permissions + and logging. + +v3.0.12 (2013 Feb 22) +===================== +*no tag* + +- added: #18171 New ``ca_certs`` argument to the :class:`Shotgun` constructor to specify the + certificates to use in SSL validation. +- added: ``setup.py`` doesn't compress the installed ``.egg`` file which makes the + ``cacerts.txt`` file accessible. + +v3.0.11 (2013 Jan 31) +===================== + +- added: nested filter syntax (see :ref:`filter_syntax`) + +v3.0.10 (2013 Jan 25) +===================== + +- added: :meth:`add_user_agent()` and :meth:`reset_user_agent` methods to allow client code to add + strings to track. +- added: Changed default ``user-agent`` to include API version. +- updated: advanced summarize filter support. +- fixed: #19830 :meth:`share_thumbnail` errors when source has no thumbnail. + +v3.0.9 (2012 Dec 05) +==================== + +- added: :meth:`share_thumbnail` method to share the same thumbnail record and media between + entities. +- added: proxy handling to methods that transfer binary data (ie. :meth:`upload`, + :meth:`upload_thumbnail`, etc.). +- updated: default logging level to WARN. +- updated: documentation for :meth:`summarize()` method, previously released but without + documentation. +- fixed: unicode strings not always being encoded correctly. +- fixed: :meth:`create()` generates error when ``return_fields`` is None. +- fixed: clearing thumbnail by setting ``image`` value to ``None`` not working as expected. +- fixed: some html entities being returned sanitized via API. +- improved: ``simplejson`` fallback now uses relative imports to match other bundled packages. +- improved: various error messages are now clearer and more informative. +- installation is now ``pip`` compatible. + +v3.0.9.beta2 (2012 Mar 19) +========================== + +- use relative imports for included libraries when using Python v2.5 or later. +- replace sideband request for ``image`` (thumbnail) field with native support (requires Shotgun + server >= v3.3.0. Request will still work on older versions but fallback to slow sideband + method). +- allow setting ``image`` and ``filmstrip_thumbnail`` in data dict on :meth:`create` and + :meth:`update` (thanks `@hughmacdonald `_). +- fixed bug causing ``Attachment.tag_list`` to be set to ``"None"`` (str) for uploads. + +v3.0.9.beta1 (2012 Feb 23) +========================== + +- added support for access to WorkDayRules (requires Shotgun server >= v3.2.0). +- added support for filmstrip thumbnails (requires Shotgun server >= v3.1.0). +- fixed :meth:`download_attachment` pointing to incorrect url. +- fixed some issues with module import paths. + +v3.0.8 (2011 Oct 7) +=================== + +- now uses JSON as a transport rather than XML-RPC. This provides as much as a 40% speed boost. +- added the :meth:`summarize` method. +- refactored single file into package. +- tests added (Thanks to Aaron Morton `@amorton `_). +- return all strings as ascii for backwards compatibility, added ``ensure_ascii`` parameter to + enable returning unicode. + +v3.0.7 (2011 Apr 04) +==================== + +- fix: :meth:`update()` method should return a ``dict`` object not a ``list``. + +v3.0.6 (2010 Jan 25) +==================== + +- optimization: don't request ``paging_info`` unless required (and server support is available). + +v3.0.5 (2010 Dec 20) +==================== + +- officially remove support for old ``api3_preview`` controller. +- :meth:`find`: allow requesting a specific page of results instead of returning them all at once. +- add support for ``session_uuid`` parameter for communicating with a web browser session. + +v3.0.4 (2010 Nov 22) +==================== + +- fix for issue where :meth:`create` method was returning list type instead of dictionary. +- support new style classes (thanks to Alex Schworer `@schworer `_). + +v3.0.3 (2010 Nov 12) +==================== + +- add support for local files. Injects convenience info into returned hash for local file links. +- add support for authentication through http proxy server. + +v3.0.2 (2010 Aug 27) +==================== + +- add :meth:`revive` method to revive deleted entities. + +v3.0.1 (2010 May 10) +==================== + +- :meth:`find`: default sorting to ascending, if not set (instead of requiring + ascending/descending). +- :meth:`upload` and :meth:`upload_thumbnail`: pass auth info through. + +v3.0 (2010 May 5) +================= + +- non-beta! +- add :meth:`batch` method to do multiple :meth:`create`, :meth:`update`, and :meth:`delete` + operations in one request to the server (requires Shotgun server to be v1.13.0 or higher). + +v3.0b8 (2010 Feb 19) +==================== + +- fix python gotcha about using lists / dictionaries as defaults (`see this page for more info `_). +- add :meth:`schema_read` method. + +v3.0b7 (2009 Nov 30) +==================== + +- add additional retries for connection errors and a catch for broken pipe exceptions. + +v3.0b6 (2009 Oct 20) +==================== + +- add support for ``HTTP/1.1 keepalive``, which greatly improves performance for multiple + requests. +- add more helpful error if server entered is not ``http`` or ``https`` +- add support assigning tags to file uploads (for Shotgun version >= 1.10.6). + +v3.0b5 (2009 Sept 29) +===================== + +- fixed deprecation warnings to raise ``Exception`` class for python 2.5. + +v3.0b4 (2009 July 3) +==================== + +- made :meth:`upload` and :meth:`upload_thumbnail` methods more backwards compatible. +- changes to :meth:`find_one`: now defaults to no ``filter_operator``. + +v3.0b3 (2009 June 24) +===================== + +- fixed :meth:`upload` and :meth:`upload_thumbnail` methods. +- added :meth:`download_attachment` method. +- added ``schema_*`` methods for accessing entities and fields. +- added support for http proxy servers. +- added ``__version__`` string. +- removed ``RECORDS_PER_PAGE`` global (can just set ``records_per_page`` on the Shotgun object + after initializing it). +- removed ``api_ver`` from the constructor, as this class is only designed to work with API v3. \ No newline at end of file diff --git a/README.md b/README.md index c8e66d709..a55c42bad 100644 --- a/README.md +++ b/README.md @@ -6,40 +6,28 @@ The latest version can always be found at http://github.com/shotgunsoftware/pyth ## Minimum Requirements -* Shotgun server v2.4.12 or higher. (Earlier builds of 2.4 will work, but have buggy support for float field types) +* Shotgun server v2.4.12+. * Python v2.4 - v2.7. ## High Performance Requirements -* For Python 2.4 and 2.5, install simplejson 2.0.9: http://pypi.python.org/pypi/simplejson/2.0.9 -* For Python 2.6 and higher, install simplejson 2.1.6: http://pypi.python.org/pypi/simplejson/2.1.6 +* For Python 2.4 and 2.5, install [simplejson 2.0.9](http://pypi.python.org/pypi/simplejson/2.0.9) +* For Python 2.6 and higher, install [simplejson 2.1.6](http://pypi.python.org/pypi/simplejson/2.1.6) -## Installing -To use Shotgun's Python API module, you need to place the package shotgun_api3 in one of the directories specified by the environment variable PYTHONPATH. For more information on PYTHONPATH and using modules in Python, see http://docs.python.org/tutorial/modules.html - -### Installing with `pip` - -#### Master -If you wish to install the current master, use the following command (Note that master contains the latest revisions and is largely considered "stable" but it is not an official packaged release. If you want the latest packaged release, use the latest tag number): -`pip install git+git://github.com/shotgunsoftware/python-api.git` +## Documentation +Tutorials and detailed documentation about the Python API are available at http://developer.shotgunsoftware.com/python-api). -#### Specific Versions -To install a specific version of the package with `pip` (recommended), run the following command -(This example installs the v3.0.9 tag. Replace the version tag with the one you want): -`pip install git+git://github.com/shotgunsoftware/python-api.git@v3.0.9` +Some useful direct links: -#### requirements.txt -If you're using pip with `requirements.txt`, add the following line: -`git+git://github.com/shotgunsoftware/python-api.git` +* [Installing](http://developer.shotgunsoftware.com/python-api/installation.html) +* [Tutorials](http://developer.shotgunsoftware.com/python-api/cookbok/tutorials.html) +* [API Reference](http://developer.shotgunsoftware.com/python-api/reference.html) +* [Data Types](http://developer.shotgunsoftware.com/python-api/reference.html#data-types) +* [Filter Syntax](http://developer.shotgunsoftware.com/python-api/reference.html#filter-syntax) -## Documentation -Tutorials and detailed documentation about the Python API are available on the [Python API Wiki](https://github.com/shotgunsoftware/python-api/wiki). There is also some additional related documentation on the [Shotgun Support Website](https://support.shotgunsoftware.com/forums/48807-developer-api-info). -Some useful direct links in each are below: +## Changelog -* [Introduction and Video Tour](https://www.youtube.com/watch?v=QdL5E9XbdJQ) -* [Reference: Methods](https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Methods) -* [Reference: Data Types](https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Data-Types) -* [Reference: Filter Syntax](https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax) +You can see the [full history of the Python API on the documentation site](http://developer.shotgunsoftware.com/python-api/changelog.html). ## Tests @@ -47,256 +35,13 @@ Integration and unit tests are provided. [![Build Status](https://secure.travis-ci.org/shotgunsoftware/python-api.png?branch=master)](http://travis-ci.org/shotgunsoftware/python-api) -- All tests require the "nose" unit testing tools (http://nose.readthedocs.org), and a "tests/config" file (copy from "tests/example_config"). +- All tests require the [nose unit testing tools](http://nose.readthedocs.org), and a `tests/config` file (you can copy an example from `tests/example_config`). - Tests can be run individually like this: `nosetest tests/test_client.py` -- test_client and tests_unit use mock server interaction and do not require a shotgun instance to be available (no modifacations to tests/config necessary). -- test_api and test_api_long do require a shotgun instance, with a script key available for the tests. The server and script user values must be supplied in the tests/config file. The tests will set up test data on the server based on the data set forth in the config. This data will be manipulated by the tests, and should not be used for other purposes. -- To run all of the tests, use the shell script run-tests. - -## Changelog - -**v3.0.32.dev - TBD** - - + Optimized import speed of the API on Python 2.7. - + Integrated the latest fixes to the `mimetypes` module. - -**v3.0.31 - 2016 May 18** - - + Add optional "additional_filter_presets" argument to find() and find_one() - -**v3.0.30 - 2016 Apr 25** - - + Add option to use add/remove/set modes when updating multi-entity fields - + Add explicit file handler close to download_attachment - + Add basic find() ordering support to mockgun - + Allow for product specific authorization parameters - -**v3.0.29 - 2016 Mar 7** - - + Reverted the change to the default field names for image uploading. - -**v3.0.28 - 2016 Mar 3** - - + Refactored nested classing of sgtimezone library to allow for serializable timestamps. - -**v3.0.27 - 2016 Feb 18** - - + Make sure HTTP proxy authentication works with the @ character in a password. - + Make sure sudo authentication test works with Shotgun versions after 6.3.10 - + Smarter uploading of thumbnails and filmstrips with the upload() method. - + Improve Travis build integration of the Python-API to run the full suite of - API tests instead of just the unit and client tests. - -**v3.0.26 - 2016 Feb 1** - - + Updating testing framework to use environment variables inconjunction with existing example_config file so that commits and pull requests are automatically run on travis-ci. - + Fix to prevent stripping out case-sensitivity of a URL if the user passes their credentials to config.server as an authrization header. - -**v3.0.25 - 2016 Jan 12** - - + Add handling for Python versions incompatible with SHA-2 (see http://blog.shotgunsoftware.com/2016/01/important-ssl-certificate-renewal-and.html). - + Add SHOTGUN_FORCE_CERTIFICATE_VALIDATION environment variable to prevent disabling certficate validation when SHA-2 validation is not available. - + Add SSL info to user-agent header. - -**v3.0.24 - 2016 Jan 08** - - + Not released. - -**v3.0.23 - 2015 Oct 26** - - + Fix for python bug on Windows loading mimetypes module (http://bugs.python.org/issue23371) thanks to @patrickwolf. - + Fix for tests on older versions of python. - + Sanitize authentication values before raising error. - -**v3.0.22 - 2015 Sept 9** - - + Added method `text_search()` which allows an API client to access - the Shotgun global search and auto completer. - + Added method `activity_stream_read()` which allows an API client - to access the activity stream for a given Shotgun entity. - + Added method `note_thread_read()` which allows an API client to - download an entire note conversation, including replies and - attachments, using a single API call. - + Added an experimental `mockgun` module which can be used to emulate - the Shotgun API, for example inside unit test rigs. - + [minor] Improved docstrings. - -**v3.0.21 - 2015 Aug 13** - - + Update bundled httplib2 module to latest v0.9.1 - fixes some bugs - -**v3.0.20 - 2015 Jun 10** - - + Add authentication support for Shotgun servers with two-factor authentication turned on. - -**v3.0.19 - 2015 Mar 25** - - + Add ability to authenticate with Shotgun using `session_token`. - + Add `get_session_token()` method for obtaining token to authenticate with. - + Add new `AuthenticationFault` exception type to indicate when server communication has failed due to authentication reasons. - + Add support for `SHOTGUN_API_CACERTS` environment variable to provide location of external SSL certificates file. - + Fixes and updates to various tests - -**v3.0.18 - 2015 Mar 13** - - + Add ability to query the per-project visibility status for entities, fields and statuses. (requires Shotgun server >= v5.4.4) - -**v3.0.17 - 2014 Jul 10** - - + Add ability to update last_accessed_by_current_user on Project. - + Add workaround for bug in Python 2.7 mimetypes library on Windows (http://bugs.python.org/issue9291) - + Add platform and Python version to user-agent (eg. "shotgun-json (3.0.17); Python 2.7 (Mac)") - -**v3.0.16 - 2014 May 23** - - + Add flag to ignore entities from archived projects. - + Add support for differentiating between zero and None for number fields. - + Add ability to act as a different user. - -**v3.0.15 - 2014 Mar 6** - - + Fixed bug which allowed a value of None for password parameter in authenticate_human_user - + Add follow, unfollow and followers methods - + Add ability to login as human user - + Ensure that webm/mp4 mime types are always available - + Updated link to video tour in README - + Fixes and updates to various tests - -**v3.0.14 - 2013 Jun 26** - - + added: additional tests for thumbnails - + added: support for downloading from s3 in download_attachment(). Accepts an Attachment entity dict as a parameter (is still backwards compatible with passing in an Attachment id). - + added: optional file_path parameter to download_attachment() to write data directly to disk instead of loading into memory. (thanks to Adam Goforth https://github.com/aag) - -**v3.0.13 - 2013 Apr 11** - - + fixed: #20856 authenticate_human_user login was sticky and would be used for permissions and logging - -**v3.0.12 - 2013 Feb 22** (no tag) - - + added: #18171 New ca_certs argument to the Shotgun() constructor to specify the certificates to use in SSL validation - + added: setup.py doesn't compress the installed .egg file which makes the cacerts.txt file accessible - -**v3.0.11 - 2013 Jan 31** - - + added: nested filter syntax, see https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax - -**v3.0.10 - 2013 Jan 25** - - + added: add_user_agent() and reset_user_agent methods to allow client code to add strings to track. - + added: Changed default user-agent to include api version. - + updated: advanced summarize filter support. - + fixed: #19830 share_thumbnail() errors when source has no thumbnail. - -**v3.0.9 - 2012 Dec 05** - - + added: share_thumbnail() method to share the same thumbnail record and media between entities - + added: proxy handling to methods that transfer binary data (ie. upload, upload_thumbnail, etc.) - + updated: default logging level to WARN - + updated: documentation for summarize() method, previously released but without documentation - + fixed: unicode strings not always being encoded correctly - + fixed: create() generates error when return_fields is None - + fixed: clearing thumbnail by setting 'image' value to None not working as expected - + fixed: some html entities being returned sanitized via API. - + improved: simplejson fallback now uses relative imports to match other bundled packages - + improved: various error messages are now clearer and more informative - + installation is now pip compatible - -**v3.0.9.beta2 - 2012 Mar 19** - - + use relative imports for included libraries when using Python v2.5 or later - + replace sideband request for 'image' (thumbnail) field with native support (requires Shotgun server >= v3.3.0. Request will still work on older versions but fallback to slow sideband method) - + allow setting image and filmstrip_thumbnail in data dict on create() and update() (thanks to Hugh Macdonald https://github.com/HughMacdonald) - + fixed bug causing Attachment.tag_list to be set to "None" (str) for uploads - -**v3.0.9.beta1 - 2012 Feb 23** - - + added support for access to WorkDayRules (requires Shotgun server >= v3.2.0) - + added support for filmstrip thumbnails (requires Shotgun server >= v3.1.0) - + fixed download_attachment() pointing to incorrect url - + fixed some issues with module import paths - -**v3.0.8 - 2011 Oct 7** - - + now uses JSON as a transport rather than XML-RPC. This provides as much as a 40% speed boost - + added the summarize method - + refactored single file into package - + tests added (Thanks to Aaron Morton https://github.com/amorton) - + return all strings as ascii for backwards compatibility, added ensure_ascii parameter to enable returning unicode - -**v3.0.7 - 2011 Apr 04** - - + fix: update() method should return a dict object not a list - -**v3.0.6 - 2010 Jan 25** - - + optimization: don't request paging_info unless required (and server support is available) - -**v3.0.5 - 2010 Dec 20** - - + officially remove support for old api3_preview controller - + find(): allow requesting a specific page of results instead of returning them all at once - + add support for "session_uuid" parameter for communicating with a web browser session. - -**v3.0.4 - 2010 Nov 22** - - + fix for issue where create() method was returning list type instead of dictionary - + support new style classes (thanks to Alex Schworer https://github.com/schworer) - -**v3.0.3 - 2010 Nov 12** - - + add support for local files. Injects convenience info into returned hash for local file links - + add support for authentication through http proxy server - -**v3.0.2 - 2010 Aug 27** - - + add revive() method to revive deleted entities - -**v3.0.1 - 2010 May 10** - - + find(): default sorting to ascending, if not set (instead of requiring ascending/descending) - + upload() and upload_thumbnail(): pass auth info through - -**v3.0 - 2010 May 5** - - + non-beta! - + add batch() method to do multiple create, update, and delete requests in one - request to the server (requires Shotgun server to be v1.13.0 or higher) - -**v3.0b8 - 2010 Feb 19** - - + fix python gotcha about using lists / dictionaries as defaults. - See: http://www.ferg.org/projects/python_gotchas.html#contents_item_6 - + add schema_read method - -**v3.0b7 - 2009 Nov 30** - - + add additional retries for connection errors and a catch for broken pipe exceptions - -**v3.0b6 - 2009 Oct 20** - - + add support for HTTP/1.1 keepalive, which greatly improves performance for multiple requests - + add more helpful error if server entered is not http or https - + add support assigning tags to file uploads (for Shotgun version >= 1.10.6) - -**v3.0b5 - 2009 Sept 29** - - + fixed deprecation warnings to raise Exception class for python 2.5 - -**v3.0b4 - 2009 July 3** +- `test_client` and `tests_unit` use mock server interaction and do not require a Shotgun instance to be available (no modifications to `tests/config` are necessary). +- `test_api` and `test_api_long` *do* require a Shotgun instance, with a script key available for the tests. The server and script user values must be supplied in the `tests/config` file. The tests will add test data to your server based on information in your config. This data will be manipulated by the tests, and should not be used for other purposes. +- To run all of the tests, use the shell script `run-tests`. - + made upload() and upload_thumbnail() methods more backwards compatible - + changes to find_one(): - + now defaults to no filter_operator -**v3.0b3 - 2009 June 24** - + fixed upload() and upload_thumbnail() methods - + added download_attchment() method - + added schema_* methods for accessing entities and fields - + added support for http proxy servers - + added __version__ string - + removed RECORDS_PER_PAGE global (can just set records_per_page on the Shotgun object after initializing it) - + removed api_ver from the constructor, as this class is only designed to work with api v3 diff --git a/docs/advanced.rst b/docs/advanced.rst new file mode 100644 index 000000000..4c7e4a2bf --- /dev/null +++ b/docs/advanced.rst @@ -0,0 +1,16 @@ +.. _advanced_topics: + +############### +Advanced Topics +############### + +Below are some more advanced topics regarding usage of the Python API. If you would like to see +something that's missing here, please feel free to contact support at support@shotgunsoftware.com +with your suggestions and we'll get it added! + +.. toctree:: + :maxdepth: 1 + + advanced/packaging + advanced/iron_python + changelog diff --git a/docs/advanced/iron_python.rst b/docs/advanced/iron_python.rst new file mode 100644 index 000000000..6aac0a6a9 --- /dev/null +++ b/docs/advanced/iron_python.rst @@ -0,0 +1,37 @@ +********** +IronPython +********** + +We do not test against IronPython and cannot be sure that we won't introduce breaking changes or +that we will be compatible with future releases of IronPython. While we don't officially support +IronPython, we certainly will do our best to figure out any issues that come up while using it and +how to avoid them. + +As of July 9, 2015 you can look at this fork of the repo to see what changes were needed as of that +date to make things work. The original fork was as of v3.0.20 of the API. Big thanks to our awesome +clients Pixomondo for making their work public and letting us refer to it: + +https://github.com/Pixomondo/python-api/tree/v3.0.20.ipy + +v3.0.20 can be used with IronPython with a little bit of added work: + +- The Python API uses the zlib module to handle decompressing the gzipped response from the server. + There's no built-in zlib module in IronPython, but there's a potential solution from Jeff Hardy at + https://bitbucket.org/jdhardy/ironpythonzlib/src/. And the blog post about it here + http://blog.jdhardy.ca/2008/12/solving-zlib-problem-ironpythonzlib.html + +- If you encounter any SSL errors like + ``unknown field: SERIALNUMBER=0123456789`` or ``:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed``. + For now you can workaround this problem by disabling ssl certificate validation which we've + encountered some intermittent issues with. Set ``NO_SSL_VALIDATION = True`` for either case. + See :const:`shotgun_api3.shotgun.NO_SSL_VALIDATION` + +- If you encounter ``LookupError: unknown encoding: idna``, you can force utf-8 by changing + iri2uri.py ~ln 71 from ``authority = authority.encode('idna')`` to + ``authority = authority.encode('utf-8')`` + +- If you encounter an SSL error such as ``SSL3_READ_BYTES:sslv3 alert handshake failure``, then the + lower level SSL library backing python's network infrastructure is attempting to connect to our + servers via SSLv3, which is no longer supported. You can use the code from this gist to force the + SSL connections to use a specific protocol. The forked repo linked above has an example of how to + do that to force the use of TLSv1. \ No newline at end of file diff --git a/docs/advanced/packaging.rst b/docs/advanced/packaging.rst new file mode 100644 index 000000000..a09e159ad --- /dev/null +++ b/docs/advanced/packaging.rst @@ -0,0 +1,40 @@ +.. _packaging: + +################################################ +Packaging an application with py2app (or py2exe) +################################################ + +You can create standalone applications with Python scripts by using +`py2app `_ on OS X or `py2exe `_ on +Windows. This is often done to more easily distribute applications that have a GUI based on +toolkits like Tk, Qt or others. + +There are caveats you need to be aware of when creating such an app. + +******************************** +HTTPS Validation and cacerts.txt +******************************** +When creating the connection to Shotgun a file is used to validate the Shotgun certificate. This +file is located at ``shotgun_api3/lib/httplib2/cacerts.txt``. Because this file is not a Python +file imported by your application, py2app will not know to include it in your package, it will +need to be explicitly specified in your ``setup.py`` file (edit the path based on the location +where your ``shotgun_api3`` package is located):: + + DATA_FILES = [ + ('shotgun_api3', ['/shotgun/src/python-api/shotgun_api3/lib/httplib2/cacerts.txt']) + ] + +Once you create your py2app package its contents should include two files (among others) in the +following structure:: + + ./Contents/Resources/shotgun_api3/cacerts.txt + ./Contents/Resources/my_script.py + +Where in ``my_script.py`` you can access the ``cacerts.txt`` file using a relative path to pass it +into the Shotgun connection's constructor:: + + ca_certs = os.path.join(os.path.dirname(__file__), 'shotgun_api3', 'cacerts.txt') + sg = shotgun_api3.Shotgun('https://yoursite.shotgunstudio.com', 'script_name', 'script_key', + ca_certs=ca_certs) + +The process for py2exe should be similar. \ No newline at end of file diff --git a/docs/authentication.rst b/docs/authentication.rst new file mode 100644 index 000000000..7708ad026 --- /dev/null +++ b/docs/authentication.rst @@ -0,0 +1,65 @@ +############## +Authentication +############## + +In order to communicate with your Shotgun server via the API, you must provide valid authentication credentials. The API allows you to authenticate with user-based, or script-based credentials. + +************************* +User-based Authentication +************************* +When authenticating as a user, you provide your normal login and password when instantiating your :class:`shotgun_api3.Shotgun` object. The actions performed by this instance will be limited to your permission level just as they are in the Shotgun web application. :: + + sg = shotgun_api3.Shotgun("https://piedpiper.shotgunstudio.com", + login="rhendriks", + password="c0mPre$Hi0n") + + +*************************** +Script-based Authentication +*************************** +In order to authenticate as a script, your script must be :ref:`registered with Shotgun and have a valid API key `. When creating your :class:`shotgun_api3.Shotgun` object, provide the ``script_name`` and ``api_key``.:: + + sg = shotgun_api3.Shotgun("https://piedpiper.shotgunstudio.com", + script_name="compress", + api_key="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") + +.. note:: When using script-based authentication, we **strongly** recommend you register each script separately with Shotgun and have individual API keys for each. This allows you to track down each of your scripts and the actions they are performing much more accurately in the event logs. + + +.. _setting_up_shotgun: + +Adding Script Users +=================== +If you'll be using script-based authentication, you need to create a Script entity in Shotgun. To create a new key, click the + button on the "Scripts" page in the Admin section and give your script a useful name. It's a good idea to add any other relevant information that be be helpful to your other friendly Shotgun users such as a description of what the script does that is using this key, the email address of the maintainer, etc.: + +.. image:: images/scripts_page.png + +Once you save your new Script entity, Shotgun will automatically generate an application key which will act as the script's password. The key will look something like this: ``0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef``. + +Why have different application keys for different scripts? +========================================================== +We recommend you create a new Script entity (and application key) for each script that is using script-based authentication so you can accurately log what scripts are doing what in case one of them causes problems. This will also allow you to better see what scripts are performing what actions in the EventLog. We've found that even though you may *think* you'll probably never need to know, the extra 2 minutes of setup now can prevent hours of headache in the future. + +Event Logging +============= +By default, events generated by scripts using an script-based authentication are logged in Shotgun's event log. You can turn this off by un-checking the "Generate Events" checkbox either in the script detail page or from the main Scripts admin page in Shotgun. + +.. note:: Turning off event logging will also prevent any email notifications from being triggered by your scripts since the email notifier relies on the event log to find events to notify for. + +Scripts using user-based authentication will generate events similarly to if you were performing the same actions in the Shotgun web application, though there is some additional metadata stored in the ``EventLogEntry`` that identifies the event as created from a script acting on behalf of the user. + +Why would you want to turn event logging off for scripts? +--------------------------------------------------------- +It is an optimization that is not used often, but some users have integration scripts that are pushing data into Shotgun just for reference, like publishes from their asset management system. This publish data is never changed later, so the data itself has the entire history, and the events would just clutter the event log. The event log can grow very large. So if you have no need to audit the history of what your script does, and it's generating an large amount of event log entries, you may find it's not necessary to create these events. + +*********** +Permissions +*********** +Users and scripts are both bound by the restrictions of their permission role in Shotgun. The permission role is assigned by the **Permission Role** field for each entity type. + +For Scripts, the default permission role is "API Admin User" which allows full access to create, update, and delete entities and fields, including editing the "date created" audit field and creating event log entries. If you have other permission roles for ApiUsers, you can set the default role that will be assigned when a new script is created, in your Shotgun site preferences. + +When using user-based authentication in your script, it will be bound by the permission role assigned to you in Shotgun. For example, if you don't have access to edit the status field on Shots, your script won't be able to either. Attempting to perform actions that are prohibited by permissions will raise an appropriate exception. + +.. seealso:: `Shotgun Support: Permissions `_ + diff --git a/docs/changelog.rst b/docs/changelog.rst new file mode 100644 index 000000000..f07fa1f9c --- /dev/null +++ b/docs/changelog.rst @@ -0,0 +1,3 @@ +.. currentmodule:: shotgun_api3.shotgun.Shotgun + +.. include:: ../HISTORY.rst \ No newline at end of file diff --git a/docs/cookbook.rst b/docs/cookbook.rst new file mode 100644 index 000000000..5c4c1be78 --- /dev/null +++ b/docs/cookbook.rst @@ -0,0 +1,62 @@ +************ +API Cookbook +************ + +Here we have a collection of useful information you can use for reference when writing your API +scripts. From usage tips and gotchas to deeper examples of working with entities like Tasks and +Files, there's a lot of example code in here for you to play with. + +.. rubric:: Usage Tips + +These are some best-practices and good guidelines to follow when developing your scripts. +You'll also find some gotchas you can avoid. + +.. toctree:: + :maxdepth: 2 + + cookbook/usage_tips + +.. rubric:: Examples + +Some basic example scripts that we walk you through from beginning to end. Feel free to copy +and paste any of these into your own scripts. + +.. toctree:: + :maxdepth: 3 + + cookbook/tutorials + +.. rubric:: Working With Files + +You'll probably be doing some work with files at your studio. This is a deep dive into some of +the inners of how Shotgun handles files (also called Attachments) and the different ways to link +to them. + +.. toctree:: + :maxdepth: 2 + + cookbook/attachments + +.. rubric:: Working With Tasks + +Scheduling is a complex beast. Shotgun can handle lots of different types of functionality around +scheduling like split tasks, dependencies, and more. These docs walk you through the details of +how Shotgun thinks when it's handling Task changes and how you can make your scripts do what you +need to do. + +.. toctree:: + :maxdepth: 2 + + cookbook/tasks + +.. rubric:: Smart Cut Fields + +Smart Cut Fields are deprecated in favor of the +`new cut support added in Shotgun v7.0 `_. +This documentation remains only to support studios who may not have upgraded to the new cut support +features. + +.. toctree:: + :maxdepth: 2 + + cookbook/smart_cut_fields \ No newline at end of file diff --git a/docs/cookbook/attachments.rst b/docs/cookbook/attachments.rst new file mode 100644 index 000000000..5988e9041 --- /dev/null +++ b/docs/cookbook/attachments.rst @@ -0,0 +1,325 @@ +.. _attachments: + +################################ +Details About Working With Files +################################ + +The Shotgun web application stores Files as Attachment entities. You can see these on a Files page, +or a Files tab on a detail page, for example. You can access Attachments via the API to create and +modify uploaded files, url links, and local files, and link them to other entities (Shots, +Versions, etc). This entity works a lot like other entity types within Shotgun with a few +exceptions which are detailed below. + +.. note:: + If you are simply looking for information about how to upload and link things in Shotgun, this + doc is not for you. Instead look at the :meth:`~shotgun_api3.Shotgun.upload` and + :meth:`~shotgun_api3.Shotgun.upload_thumbnail` methods. + + This doc describes the detailed structure of the Attachment entities that represent files + in Shotgun and how to interact with them. If that sounds cool too, then read on! + +.. versionadded:: 3.0.3 + Requires Shotgun Server v2.2.0+ + +***************** +Default structure +***************** +The following is a list of the default fields that Shotgun creates for Attachments. Your server +instance may look slightly different depending on your own customizations. Many of these fields are +optional and some are automatically filled in. These exceptions are listed below in the +descriptions of each field. + +- **description** (:obj:`str`): + Optional field to provide descriptive text about the file. + +- **this_file** (:obj:`dict`): + The actual file reference. Within the dictionary is a ``link_type`` key which designates the + Attachment as an uploaded file, a url link, or a local file. There are additional keys + returned for :ref:`local_files`. You cannot modify this field after you have created an + Attachment. See below for examples of this field. + +- **filename** (:obj:`str`): + For uploaded files only. This is automatically assigned when the file is uploaded and stores + the filename of the file. + +- **file_size** (:obj:`int`): + For uploaded files only. This is automatically assigned when the file is uploaded and stores + the size of the file in bytes. + +- **id** (:obj:`int`): + The internal Shotgun id for this Attachment entity. + +- **attachment_links** (:obj:`list`): + A list of entity dictionaries used for linking Attachments to multiple entities. + +- **open_notes** (:obj:`list`): + A List of Note entities linked to the current Attachment that have a status that does not + equal 'clsd'. *Read-only* + +- **open_notes_count** (:obj:`int`): + An integer count of the list of Note entities linked to the current Attachment that have a + status that does not equal 'clsd'. *(Read-only)* + +- **project** (:obj:`dict`): + *(Required)* The Project entity that this Attachment belongs to. This must be assigned when + creating an Attachment. + +- **attachment_reference_links** (:obj:`list`): + Similar to ``attachment_links`` but used specifically for linking files to multiple entities as + reference. + +- **sg_status_list** (:obj:`str`): + Status value returned as the short code. + +- **tag_list** (:obj:`list`): + List of tags (as strings) that are currently assigned to the Attachment. + +- **image** (:obj:`str`): + The url location of the thumbnail image assigned to this Attachment. For uploads, Shotgun + automatically tries to create a thumbnail from the file. Alternatively, you can assign your + own thumbnail to an Attachment using the :meth:`~shotgun_api3.Shotgun.upload_thumbnail` method. + +- **sg_type** (:obj:`str`): + An optional field for designating different types of Attachments + + +File type structures (``this_file``) +==================================== + +Depending on the type of file the Attachment entity is representing, the value of ``this_file`` +will vary. + +- **Uploads** + Designated by ``link_type: 'upload'``, this represents a file that was uploaded to Shotgun. + Uploading files to Shotgun can be done using the :meth:`~shotgun_api3.Shotgun.upload` method. + You cannot create an Attachment with an uploaded file directly. + + :: + + {'content_type': 'image/jpeg', + 'link_type': 'upload', + 'name': 'western1FULL.jpg', + 'url': 'https://superdeathcarracer.shotgunstudio.com/file_serve/attachment/538'} + +- **Web links** + Designated by ``link_type: 'web'``, this is represents a url link. Examples include an + ``http://`` link to another server or a custom protocol used to launch a local application + like ``rvlink://`` or ``cinesync://`` + :: + + {'content_type': None, + 'link_type': 'web', + 'name': 'Join GUN12158', + 'url': 'cinesync://session/GUN12158'} + +- **Local Files** + Designated by ``link_type: 'local'``, this is represents a local file link. Additional keys + are provided in order to give access to the relative path information on other platforms. + + .. seealso:: :ref:`local_files` + + :: + + { 'content_type': 'video/quicktime', + 'link_type': 'local', + 'name': 'my_test_movie.mov', + 'local_path': '/Users/kp/Movies/testing/test_movie_002.mov' + 'local_path_linux': '/home/users/macusers/kp/Movies/testing/test_movie_002.mov' + 'local_path_mac': '/Users/kp/Movies/testing/test_movie_002.mov' + 'local_path_windows': 'M:\\macusers\kp\Movies\testing\test_movie_002.mov' + 'local_storage': {'id': 1, + 'name': 'Dailies Directories', + 'type': 'LocalStorage'}, + 'url': 'file:///Users/kp/Movies/testing/test_movie_002.mov'} + + +******************** +Creating Attachments +******************** + +Web Links +========= +:: + + myurl = { + 'url': 'http://apple.com/itunes', + 'name': 'Apple: iTunes' + } + data = { + 'this_file': myurl, + 'project': {'type':'Project','id':64} + } + result = sg.create('Attachment', data) + + +Uploads +======= +Uploads cannot be created directly on Attachments. Instead, you need to use the +:meth:`~shotgun_api3.Shotgun.upload` method. + +Local Files +=========== +See :ref:`creating_local_files`. + +******************** +Updating Attachments +******************** +You cannot modify the ``this_file`` field after you create an Attachment. If you need to provide a +different file, you will have to create a new Attachment entity. Otherwise, the process for +updating Attachments is exactly like updating other entity types in Shotgun and is the same for all +Attachment types. See :meth:`~shotgun_api3.Shotgun.update` for more info. + + +******************** +Deleting Attachments +******************** +The process of deleting an Attachment is just like other entities in Shotgun. See +:meth:`~shotgun_api3.Shotgun.delete` for more info. + +.. _local_files: + +***************************** +Working With Local File Types +***************************** + +We added support for linking to local files in the UI in Shotgun Server v2.1. This doc covers how +to work with these local file links using the API. + +Requirements +============ + +- Python API v3.0.3+ +- Shotgun Server v2.1.10+ + +Structure of Local File Values +============================== + +There is a key in the dictionary that represents file/link fields called ``link_type`` which can be +one of ``local``, ``upload``, ``web``. This is used to determine what type of link the field value +contains. For local files this value is always ``local`` and there are additional keys that +are available: + +- **content_type** (:obj:`str`): + The mime-type of the associated local file. This is assigned + automatically using a best-guess based on the file extension. You can override this by setting + this explicitly. + +- **link_type** (:obj:`str`) *read-only*: + Always 'local' for local files. + +- **name** (:obj:`str`): + the display name of the local file. This is set to the filename by + default but can be overridden by setting this explicitly. + +- **local_path** (:obj:`str`): + The full path to the file on the current platform. The Python API tries to determine the + platform it is currently running on and then copies the value from the corresponding key above + to this field for convenience. + +- **local_path_linux** (:obj:`str`) *read-only*: + Full path to file on Linux as defined by the LocalStorage (or ``None`` if no Linux path is set) + +- **local_path_mac** (:obj:`str`) *read-only*: + Full path to file on Mac OS X as defined by the LocalStorage (or ``None`` if no Mac path is set) + +- **local_path_windows** (:obj:`str`) *read-only*: + Full path to file on Windows as defined by the LocalStorage (or ``None`` if no Windows path + is set) + +- **local_storage** (:obj:`dict`) *read-only*: + A dictionary representing which LocalStorage entity is applied for this local file link. + +- **url** (:obj:`str`) *read-only*: + A file:// link provided for convenience pointing to the value in the ``local_path`` + +Reading Local File Fields +========================= + +:: + + fields = ['sg_uploaded_movie'] + result = sg.find('Version', [['id', 'is', 123]], fields) + +Returns:: + + {'id':123, + 'sg_uploaded_movie': { 'content_type': None, + 'link_type': 'local', + 'name': 'my_test_movie.mov', + 'local_path': '/Users/kp/Movies/testing/test_movie_001_.mov' + 'local_path_linux': '/home/users/macusers/kp/Movies/testing/test_movie_001_.mov' + 'local_path_mac': '/Users/kp/Movies/testing/test_movie_001_.mov' + 'local_path_windows': 'M:\\macusers\kp\Movies\testing\test_movie_001_.mov' + 'local_storage': {'id': 1, + 'name': 'Dailies Directories', + 'type': 'LocalStorage'}, + 'url': 'file:///Users/kp/Movies/testing/test_movie_001_.mov'}, + 'type': 'Version'} + +.. note:: + When viewing results that include file/link fields with local file link values, all of the + keys will be returned regardless of whether there are values in them. So in the above example, + if there was no Windows path set for the local storage, ``local_path_windows`` would be + ``None``. + +.. _creating_local_files: + +Creating & Updating Local file Fields +===================================== + +When setting a file/link field value to a local file, only the ``local_path`` is mandatory. Shotgun +will automatically select the appropriate matching local storage for your file based on the path. +You can optionally specify the ``name`` and ``content_type`` fields if you wish to override their +defaults. Any other keys that are provided will be ignored. + +* **content_type** :obj:`str`: + Optionally set the mime-type of the associated local file. This is assigned automatically + using a best-guess based on the file extension. + + +* **name** :obj:`str`: + Optional display name of the local file. This is set to the filename by default. + +* **local_path** :obj:`str`: + The full local path to the file. Shotgun will find the LocalStorage + that has the most specific match to this path and automatically assign that LocalStorage to + the file. + +:: + + data = {'sg_uploaded_movie': {'local_path': '/Users/kp/Movies/testing/test_movie_002.mov', + 'name': 'Better Movie'} + result = sg.update('Version', 123, data) + +Returns:: + + {'id':123, + 'sg_uploaded_movie': { 'content_type': 'video/quicktime', + 'link_type': 'local', + 'name': 'my_test_movie.mov', + 'local_path': '/Users/kp/Movies/testing/test_movie_002.mov' + 'local_path_linux': '/home/users/macusers/kp/Movies/testing/test_movie_002.mov' + 'local_path_mac': '/Users/kp/Movies/testing/test_movie_002.mov' + 'local_path_windows': 'M:\\macusers\kp\Movies\testing\test_movie_002.mov' + 'local_storage': {'id': 1, + 'name': 'Dailies Directories', + 'type': 'LocalStorage'}, + 'url': 'file:///Users/kp/Movies/testing/test_movie_002.mov'}, + 'type': 'Version'}] + +The ``content_type`` was assigned a best-guess value based on the file extension. Shotgun selected +the most appropriate specific LocalStorage match and assigned it to local_storage automatically. + +Un-setting local file field values +================================== + +Removing a a local file field value is simple. Just set the value to ``None``:: + + data = {'sg_uploaded_movie': None} + result = sg.update('Version', 123, data) + +Returns:: + + {'id':123, + 'sg_uploaded_movie': None, + 'type': 'Version'}] diff --git a/docs/cookbook/examples/ami_handler.rst b/docs/cookbook/examples/ami_handler.rst new file mode 100644 index 000000000..d4b88f006 --- /dev/null +++ b/docs/cookbook/examples/ami_handler.rst @@ -0,0 +1,246 @@ +.. _ami_handler: + +############################### +Handling Action Menu Item Calls +############################### + +This is an example ActionMenu Python class to handle the ``GET`` request sent from an +ActionMenuItem. It doesn't manage dispatching custom protocols but rather takes the arguments +from any ``GET`` data and parses them into the easily accessible and correctly typed instance +variables for your Python scripts. + +Available as a Gist at https://gist.github.com/3253287 + +.. seealso:: + Our `support site has more information about Action Menu Items + `_. + +************ +GET vs. POST +************ + +Action Menu Items that open a url via `http` or `https` to another web server send their data +via ``POST``. If you're using a custom protocol the data is sent via ``GET``. + +.. note:: + Browsers limit the length of a ``GET`` request. If you exceed this limit by attempting to + select a lot of rows and launch your custom protocol, you may encounter + "Failed to load resource" errors in your console. + +.. seealso:: + This `Stack Overflow article "What is the maximum length of a URL in different browsers?" + `_ + +:: + + #!/usr/bin/env python + # encoding: utf-8 + + # --------------------------------------------------------------------------------------------- + # Description + # --------------------------------------------------------------------------------------------- + """ + The values sent by the Action Menu Item are in the form of a GET request that is similar to the + format: myCoolProtocol://doSomethingCool?user_id=24&user_login=shotgun&title=All%20Versions&... + + In a more human-readable state that would translate to something like this: + { + 'project_name': 'Demo Project', + 'user_id': '24', + 'title': 'All Versions', + 'user_login': 'shotgun', + 'sort_column': 'created_at', + 'entity_type': 'Version', + 'cols': 'created_at', + 'ids': '5,2', + 'selected_ids': '2,5', + 'sort_direction': 'desc', + 'project_id': '4', + 'session_uuid': 'd8592bd6-fc41-11e1-b2c5-000c297a5f50', + 'column_display_names': + [ + 'Version Name', + 'Thumbnail', + 'Link', + 'Artist', + 'Description', + 'Status', + 'Path to frames', + 'QT', + 'Date Created' + ] + } + + This simple class parses the url into easy to access types variables from the parameters, + action, and protocol sections of the url. This example url + myCoolProtocol://doSomethingCool?user_id=123&user_login=miled&title=All%20Versions&... + would be parsed like this: + + (string) protocol: myCoolProtocol + (string) action: doSomethingCool + (dict) params: user_id=123&user_login=miled&title=All%20Versions&... + + The parameters variable will be returned as a dictionary of string key/value pairs. Here's + how to instantiate: + + sa = ShotgunAction(sys.argv[1]) # sys.argv[1] + + sa.params['user_login'] # returns 'miled' + sa.params['user_id'] # returns 123 + sa.protocol # returns 'myCoolProtocol' + """ + + + # --------------------------------------------------------------------------------------------- + # Imports + # --------------------------------------------------------------------------------------------- + import sys, os + import urllib + import logging as logger + + from pprint import pprint + + # --------------------------------------------------------------------------------------------- + # Variables + # --------------------------------------------------------------------------------------------- + # location to write logfile for this script + # logging is a bit of overkill for this class, but can still be useful. + logfile = os.path.dirname(sys.argv[0])+"/shotgun_action.log" + + + # ---------------------------------------------- + # Generic ShotgunAction Exception Class + # ---------------------------------------------- + class ShotgunActionException(Exception): + pass + + + # ---------------------------------------------- + # ShotgunAction Class to manage ActionMenuItem call + # ---------------------------------------------- + class ShotgunAction(): + + def __init__(self, url): + self.logger = self._init_log(logfile) + self.url = url + self.protocol, self.action, self.params = self._parse_url() + + # entity type that the page was displaying + self.entity_type = self.params['entity_type'] + + # Project info (if the ActionMenuItem was launched from a page not belonging + # to a Project (Global Page, My Page, etc.), this will be blank + if 'project_id' in self.params: + self.project = { 'id':int(self.params['project_id']), 'name':self.params['project_name'] } + else: + self.project = None + + # Internal column names currently displayed on the page + self.columns = self.params['cols'] + + # Human readable names of the columns currently displayed on the page + self.column_display_names = self.params['column_display_names'] + + # All ids of the entities returned by the query (not just those visible on the page) + self.ids = [] + if len(self.params['ids']) > 0: + ids = self.params['ids'].split(',') + self.ids = [int(id) for id in ids] + + # All ids of the entities returned by the query in filter format ready + # to use in a find() query + self.ids_filter = self._convert_ids_to_filter(self.ids) + + # ids of entities that were currently selected + self.selected_ids = [] + if len(self.params['selected_ids']) > 0: + sids = self.params['selected_ids'].split(',') + self.selected_ids = [int(id) for id in sids] + + # All selected ids of the entities returned by the query in filter format ready + # to use in a find() query + self.selected_ids_filter = self._convert_ids_to_filter(self.selected_ids) + + # sort values for the page + # (we don't allow no sort anymore, but not sure if there's legacy here) + if 'sort_column' in self.params: + self.sort = { 'column':self.params['sort_column'], 'direction':self.params['sort_direction'] } + else: + self.sort = None + + # title of the page + self.title = self.params['title'] + + # user info who launched the ActionMenuItem + self.user = { 'id':self.params['user_id'], 'login':self.params['user_login']} + + # session_uuid + self.session_uuid = self.params['session_uuid'] + + # ---------------------------------------------- + # Set up logging + # ---------------------------------------------- + def _init_log(self, filename="shotgun_action.log"): + try: + logger.basicConfig(level=logger.DEBUG, + format='%(asctime)s %(levelname)-8s %(message)s', + datefmt='%Y-%b-%d %H:%M:%S', + filename=filename, + filemode='w+') + except IOError, e: + raise ShotgunActionException ("Unable to open logfile for writing: %s" % e) + logger.info("ShotgunAction logging started.") + return logger + + + # ---------------------------------------------- + # Parse ActionMenuItem call into protocol, action and params + # ---------------------------------------------- + def _parse_url(self): + logger.info("Parsing full url received: %s" % self.url) + + # get the protocol used + protocol, path = self.url.split(":", 1) + logger.info("protocol: %s" % protocol) + + # extract the action + action, params = path.split("?", 1) + action = action.strip("/") + logger.info("action: %s" % action) + + # extract the parameters + # 'column_display_names' and 'cols' occurs once for each column displayed so we store it as a list + params = params.split("&") + p = {'column_display_names':[], 'cols':[]} + for arg in params: + key, value = map(urllib.unquote, arg.split("=", 1)) + if key == 'column_display_names' or key == 'cols' : + p[key].append(value) + else: + p[key] = value + params = p + logger.info("params: %s" % params) + return (protocol, action, params) + + + # ---------------------------------------------- + # Convert IDs to filter format to us in find() queries + # ---------------------------------------------- + def _convert_ids_to_filter(self, ids): + filter = [] + for id in ids: + filter.append(['id','is',id]) + logger.debug("parsed ids into: %s" % filter) + return filter + + + # ---------------------------------------------- + # Main Block + # ---------------------------------------------- + if __name__ == "__main__": + try: + sa = ShotgunAction(sys.argv[1]) + logger.info("ShotgunAction: Firing... %s" % (sys.argv[1]) ) + except IndexError, e: + raise ShotgunActionException("Missing GET arguments") + logger.info("ShotgunAction process finished.") diff --git a/docs/cookbook/examples/ami_version_packager.rst b/docs/cookbook/examples/ami_version_packager.rst new file mode 100644 index 000000000..f0b08b942 --- /dev/null +++ b/docs/cookbook/examples/ami_version_packager.rst @@ -0,0 +1,257 @@ +.. _ami_version_packager: + +######################################################## +Using an ActionMenuItem to Package Versions for a Client +######################################################## + +This is an example script to demonstrate how you can use an ActionMenuItem to launch a local +script to package up files for a client. It performs the following: + +- Downloads Attachments from a specified field for all selected entities. +- Creates an archive. +- Copies the archive to a specified directory. + +It is intended to be used in conjunction with the script dicussed in :ref:`ami_handler`. + +:: + + #!/usr/bin/env python + # encoding: utf-8 + """ + version_packager.py + + This example script is meant to be run from an ActionMenuItem in Shotgun. The menu item uses a custom + protocol in order to launch this script, and is followed by the action 'package4client'. So the full + url would be something like launchme://package4client?.... See: + http://support.shotgunsoftware.com/hc/en-us/articles/219031318-Creating-custom-Action-Menu-Items + + It uses the example ActionMenu Python class also located in our docs for parsing the ActionMenuItem + POST variables. For more information about it and accessing the variables in the ActionMenuItem POST request, + See: http://developer.shotgunsoftware.com/python-api/examples/ami_handler + + The purpose of this script is to download attachment files from Shotgun, create an archive of them + and copy them to a specified directory. You can invoke it with the following minimal example to connect + to Shotgun, download any file that exists in the specified field ('sg_qt') for each selected_id passed from the + ActionMenu. Then it will create a single archive of the files and move it to the specified directory + ('/path/where/i/want/to/put/the/archive/'). The archive is named with the Project Name, timestamp, and user + login who ran the ActionMenuItem ('Demo_Project_2010-04-29-172210_kp.tar.gz'): + + sa = ShotgunAction(sys.argv[1]) + sg = shotgun_connect() + if sa.action == 'package4client': + r = packageFilesForClient('sg_qt','/path/where/i/want/to/put/the/archive/') + + """ + + # --------------------------------------------------------------------------------------------- + # Imports + # --------------------------------------------------------------------------------------------- + import sys, os + import logging as logger + import subprocess + import re + from datetime import datetime + + from shotgun_api3 import Shotgun + from shotgun_action import ShotgunAction + from pprint import pprint + + # --------------------------------------------------------------------------------------------- + # Variables + # --------------------------------------------------------------------------------------------- + # Shotgun server auth info + shotgun_conf = { + 'url':'https://YOURSTUDIO.shotgunstudio.com', + 'name':'YOUR_SCRIPT_NAME_HERE', + 'key':'YOUR_SCRIPT_KEY_HERE' + } + + # location to write logfile for this script + logfile = os.path.dirname(sys.argv[0])+"/version_packager.log" + + # temporary directory to download movie files to and create thumbnail files in + file_dir = os.path.dirname(sys.argv[0])+"/tmp" + + # compress command + # tar czf /home/user/backup_www.tar.gz -C / var/www/html + compress_cmd = "tar czf %s -C / %s" + + + + # ---------------------------------------------- + # Generic Shotgun Exception Class + # ---------------------------------------------- + class ShotgunException(Exception): + pass + + + + # ---------------------------------------------- + # Set up logging + # ---------------------------------------------- + def init_log(filename="version_packager.log"): + try: + logger.basicConfig(level=logger.DEBUG, + format='%(asctime)s %(levelname)-8s %(message)s', + datefmt='%Y-%b-%d %H:%M:%s', + filename=filename, + filemode='w+') + except IOError, e: + raise ShotgunException ("Unable to open logfile for writing: %s" % e) + logger.info("Version Packager logging started.") + return logger + + + # ---------------------------------------------- + # Extract Attachment id from entity field + # ---------------------------------------------- + def extract_attachment_id(attachment): + # extract the Attachment id from the url location + attachment_id = attachment['url'].rsplit('/',1)[1] + try: + attachment_id = int(attachment_id) + except: + # not an integer. + return None + # raise ShotgunException("invalid Attachment id returned. Expected an integer: %s "% attachment_id) + + return attachment_id + + + # ---------------------------------------------- + # Download Movie to Disk + # ---------------------------------------------- + def download_attachment_to_disk(attachment,destination_filename): + attachment_id = extract_attachment_id(attachment) + if type(attachment_id) != int: + return None + # download the attachment file from Shotgun and write it to local disk + logger.info("Downloading Attachment #%s" % (attachment_id)) + stream = sg.download_attachment(attachment_id) + try: + file = open(destination_filename, 'w') + file.write(stream) + file.close() + logger.info("Downloaded attachment %s" % (destination_filename)) + return True + except e: + raise ShotgunException("unable to write attachment to disk: %s"% e) + + + # ---------------------------------------------- + # Compress files + # ---------------------------------------------- + def compress_files(files,destination_filename): + destination_filename += ".tar.gz" + files = [path.lstrip("/") for path in files] + squish_me = compress_cmd % (destination_filename, " ".join(files) ) + logger.info("Compressing %s files..." % len(files)) + logger.info("Running command: %s" % squish_me) + try: + output = subprocess.Popen(squish_me, shell=True, stdout=subprocess.PIPE).stdout.read() + logger.info('tar/gzip command returned: %s' % output) + except e: + raise ShotgunException("unable compress files: %s"% e) + logger.info("compressed files to: %s" % destination_filename) + return destination_filename + + + # ---------------------------------------------- + # Remove downloaded files + # ---------------------------------------------- + def remove_downloaded_files(files): + remove_me = 'rm %s' % ( " ".join(files) ) + logger.info("Removing %s files..." % len(files)) + logger.info("Running command: %s" % remove_me) + try: + output = subprocess.Popen(remove_me, shell=True, stdout=subprocess.PIPE).stdout.read() + logger.info('rm command returned: %s' % output) + logger.info("removed downloaded files") + return True + except e: + logger.error("unable remove files: %s"% e) + return False + + + # ---------------------------------------------- + # Copy files + # ---------------------------------------------- + def copy_files(files,destination_directory): + if type(files) == list: + files = " ".join(files) + copy_me_args = "%s %s" % (files, destination_directory) + logger.info("Running command: mv %s" % copy_me_args) + try: + result = subprocess.Popen("mv " + copy_me_args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # 0 = success, 1 = recoverable issues + if result.returncode > 0: + response = result.stderr.read() + logger.error("Copy failed: %s"% response) + raise ShotgunException("Copy failed: %s"% response) + except OSError, e: + raise ShotgunException("unable copy files: %s"% e) + + logger.info("copied files to: %s" % destination_directory) + return destination_directory + + + + def packageFilesForClient(file_field,destination_dir): + + # get entities matching the selected ids + logger.info("Querying Shotgun for %s %ss" % (len(sa.selected_ids_filter), sa.params['entity_type'])) + entities = sg.find(sa.params['entity_type'],sa.selected_ids_filter,['id','code',file_field],filter_operator='any') + + # download the attachments for each entity, zip them, and copy to destination directory + files = [] + for e in entities: + if not e[file_field]: + logger.info("%s #%s: No file exists. Skippinsa." % (sa.params['entity_type'], e['id'])) + else: + logger.info("%s #%s: %s" % (sa.params['entity_type'], e['id'], e[file_field])) + path_to_file = file_dir+"/"+re.sub(r"\s+", '_', e[file_field]['name']) + result = download_attachment_to_disk(e[file_field], path_to_file ) + + # only include attachments. urls won't return true + if result: + files.append(path_to_file) + + # compress files + # create a nice valid destination filename + project_name = '' + if 'project_name' in sa.params: + project_name = re.sub(r"\s+", '_', sa.params['project_name'])+'_' + dest_filename = project_name+datetime.today().strftime('%Y-%m-%d-%H%M%S')+"_"+sa.params['user_login'] + archive = compress_files(files,file_dir+"/"+dest_filename) + + # now that we have the archive, remove the downloads + r = remove_downloaded_files(files) + + # copy to directory + result = copy_files([archive],destination_dir) + + return True + + + # ---------------------------------------------- + # Main Block + # ---------------------------------------------- + if __name__ == "__main__": + init_log(logfile) + + try: + sa = ShotgunAction(sys.argv[1]) + logger.info("Firing... %s" % (sys.argv[1]) ) + except IndexError, e: + raise ShotgunException("Missing POST arguments") + + sg = Shotgun(shotgun_conf['url'], shotgun_conf['name'], shotgun_conf['key'],convert_datetimes_to_utc=convert_tz) + + if sa.action == 'package4client': + result = packageFilesForClient('sg_qt','/Users/kp/Documents/shotgun/dev/api/files/') + else: + raise ShotgunException("Unknown action... :%s" % sa.action) + + + print "\nVersion Packager done!" + diff --git a/docs/cookbook/examples/basic_create_shot.rst b/docs/cookbook/examples/basic_create_shot.rst new file mode 100644 index 000000000..0bd376b69 --- /dev/null +++ b/docs/cookbook/examples/basic_create_shot.rst @@ -0,0 +1,103 @@ +.. _example_create_shot: + +Create A Shot +============= + +Building the data and calling :meth:`~shotgun_api3.Shotgun.create` +------------------------------------------------------------------ +To create a Shot, you need to provide the following values: + +- ``project`` is a link to the Project the Shot belongs to. It should be a dictionary like + ``{"type": "Project", "id": 123}`` where ``id`` is the ``id`` of the Project. +- ``code`` (this is the field that stores the name Shot) +- optionally any other info you want to provide + +Example:: + + data = { + 'project': {"type":"Project","id": 4}, + 'code': '100_010', + 'description': 'Open on a beautiful field with fuzzy bunnies', + 'sg_status_list': 'ip' + } + result = sg.create('Shot', data) + + +This will create a new Shot named "100_010" in the Project "Gunslinger" (which has an ``id`` of 4). + +- ``data`` is a list of key/value pairs where the key is the column name to update and the value + is the the value to set. +- ``sg`` is the Shotgun API instance you created in :ref:`example_sg_instance`. +- ``create()`` is the :meth:`shotgun_api3.Shotgun.create` API method we are calling. We pass in the + entity type we're searching for and the data we're setting. + +.. rubric:: Result + +The variable ``result`` now contains a dictionary hash with the Shot information you created.:: + + { + 'code': '100_010', + 'description': 'Open on a beautiful field with fuzzy bunnies', + 'id': 40435, + 'project': {'id': 4, 'name': 'Demo Project', 'type': 'Project'}, + 'sg_status_list': 'ip', + 'type': 'Shot' + } + +In addition, Shotgun has returned the ``id`` that it has assigned to the Shot, as well as a +``type`` value. ``type`` is provided for convenience simply to help you identify what entity type +this dictionary represents. It does not correspond to any field in Shotgun. + +Shotgun will *always* return the ``id`` and ``type`` keys in the dictionary when there are results +representing an entity. + +The Complete Example +-------------------- +:: + + #!/usr/bin/env python + + # -------------------------------------- + # Imports + # -------------------------------------- + import shotgun_api3 + from pprint import pprint # useful for debugging + + # -------------------------------------- + # Globals + # -------------------------------------- + # make sure to change this to match your Shotgun server and auth credentials. + SERVER_PATH = "https://mystudio.shotgunstudio.com" + SCRIPT_NAME = 'my_script' + SCRIPT_KEY = '27b65d7063f46b82e670fe807bd2b6f3fd1676c1' + + # -------------------------------------- + # Main + # -------------------------------------- + if __name__ == '__main__': + + sg = shotgun_api3.Shotgun(SERVER_PATH, SCRIPT_NAME, SCRIPT_KEY) + + # -------------------------------------- + # Create a Shot with data + # -------------------------------------- + data = { + 'project': {"type":"Project","id": 4}, + 'code': '100_010', + 'description': 'Open on a beautiful field with fuzzy bunnies', + 'sg_status_list': 'ip' + } + result = sg.create('Shot', data) + pprint(result) + print "The id of the %s is %d." % (result['type'], result['id']) + +And here is the output:: + + {'code': '100_010', + 'description': 'Open on a beautiful field with fuzzy bunnies', + 'id': 40435, + 'project': {'id': 4, 'name': 'Demo Project', 'type': 'Project'}, + 'sg_status_list': 'ip', + 'type': 'Shot'} + The id of the Shot is 40435. + diff --git a/docs/cookbook/examples/basic_create_shot_task_template.rst b/docs/cookbook/examples/basic_create_shot_task_template.rst new file mode 100644 index 000000000..76eb169e8 --- /dev/null +++ b/docs/cookbook/examples/basic_create_shot_task_template.rst @@ -0,0 +1,77 @@ +Create a Shot with a Task Template +================================== +Creating a new Shot with a Task Template is just like linking it to another entity, but Shotgun will apply the Task Template in the background and create the appropriate Tasks on the Shot for you. + +Find the Task Template +---------------------- +First we need to find the Task Template we're going to apply. We'll assume you know the name of the Task Template you want to use. +:: + + filters = [['code','is', '3D Shot Template' ]] + template = sg.find_one('TaskTemplate', filters) + + +The Resulting Task Template +--------------------------- + +Assuming the task template was found, we will now have something like this in our ``template`` +variable:: + + {'type': 'TaskTemplate', 'id': 12} + +Create the Shot +--------------- +Now we can create the Shot with the link to the ``TaskTemplate`` to apply. +:: + + data = {'project': {'type': 'Project','id': 4}, + 'code': '100_010', + 'description': 'dark shot with wicked cool ninjas', + 'task_template': template } + result = sg.create('Shot', data) + +This will create a new Shot named "100_010" linked to the TaskTemplate "3D Shot Template" and +Shotgun will then create the Tasks defined in the template and link them to the Shot you just +created. + +- ``data`` is a list of key/value pairs where the key is the column name to update and the value is + the value. +- ``project`` and `code` are required +- ``description`` is just a text field that you might want to update as well +- ``task_template`` is another entity column where we set the Task Template which has the Tasks we + wish to create by default on this Shot. We found the specific template we wanted to assign in the + previous block by searching + +Result +------ +The variable ``result`` now contains the dictionary of the new Shot that was created. +:: + + { + 'code': '010_010', + 'description': 'dark shot with wicked cool ninjas', + 'id': 2345, + 'project': {'id': 4, 'name': 'Gunslinger', 'type': 'Project'}, + 'task_template': {'id': 12, + 'name': '3D Shot Template', + 'type': 'TaskTemplate'}, + 'type': 'Shot' + } + + +If we now search for the Tasks linked to the Shot, we'll find the Tasks that match our +``TaskTemplate``:: + + tasks = sg.find('Task', filters=[['entity', 'is', result]]) + +.. note:: You can use an entity dictionary that was returned from the API in a filter as we have + done above. Shotgun will only look at the ``id`` and ``type`` keys and will ignore the rest. + This is a handy way to pass around entity dictionaries without having to reformat them. + +Now the ``tasks`` variable contains the following:: + + [{'id': 3253, 'type': 'Task'}, + {'id': 3254, 'type': 'Task'}, + {'id': 3255, 'type': 'Task'}, + {'id': 3256, 'type': 'Task'}, + {'id': 3257, 'type': 'Task'}] diff --git a/docs/cookbook/examples/basic_create_version_link_shot.rst b/docs/cookbook/examples/basic_create_version_link_shot.rst new file mode 100644 index 000000000..d93983ebb --- /dev/null +++ b/docs/cookbook/examples/basic_create_version_link_shot.rst @@ -0,0 +1,82 @@ +Create a Version Linked to a Shot +================================= +You've just created a sweet new Version of your shot. Now you want to update Shotgun and create a +new ``Version`` entity linked to the Shot. + +Find the Shot +------------- +First we need to find the Shot since we'll need to know know its ``id`` in order to link our Version +to it. +:: + + filters = [ ['project', 'is', {'type': 'Project', 'id': 4}], + ['code', 'is', '100_010'] ] + shot = sg.find_one('Shot', filters) + + +Find the Task +------------- +Now we find the Task that the Version relates to, again so we can use the ``id`` to link it to the +Version we're creating. For this search we'll use the Shot ``id`` (which we have now in the ``shot`` +variable from the previous search) and the Task Name, which maps to the ``content`` field. +:: + + filters = [ ['project', 'is', {'type': 'Project', 'id': 4}], + ['entity', 'is',{'type':'Shot', 'id': shot['id']}], + ['content', 'is', 'Animation'] ] + task = sg.find_one('Task', filters) + +.. note:: Linking a Task to the Version is good practice. By doing so it is easy for users to see + at what stage a particular Version was created, and opens up other possibilities for tracking + in Shotgun. We highly recommend doing this whenever possible. + +Create the Version +------------------ +Now we can create the Version with the link to the Shot and the Task:: + + data = { 'project': {'type': 'Project','id': 4}, + 'code': '100_010_anim_v1', + 'description': 'first pass at opening shot with bunnies', + 'sg_path_to_frames': '/v1/gun/s100/010/frames/anim/100_010_animv1_jack.#.jpg', + 'sg_status_list': 'rev', + 'entity': {'type': 'Shot', 'id': shot['id']}, + 'sg_task': {'type': 'Task', 'id': task['id']}, + 'user': {'type': 'HumanUser', 'id': 165} } + result = sg.create('Version', data) + +This will create a new Version named '100_010_anim_v1' linked to the 'Animation' Task for Shot +'100_010' in the Project 'Gunslinger'. + +- ``data`` is a list of key/value pairs where the key is the column name to update and the value is + the value to set. +- ``project`` and ``code`` are required +- ``description`` and ``sg_path_to_frames`` are just text fields that you might want to update as + well +- ``sg_status_list`` is the status column for the Version. Here we are setting it to "rev" (Pending + Review) so that it will get reviewed in the next dailies session and people will "ooh" and "aaah". +- ``entity`` is where we link this version to the Shot. Entity columns are always handled with this + format. You must provide the entity ``type`` and its ``id``. +- ``sg_task`` is another entity link field specifically for the Version's Task link. This uses the + same entity format as the Shot link, but pointing to the Task entity this time. +- ``user`` is another entity column where we set the artist responsible for this masterpiece. In + this example, I know the 'id' that corresponds to this user, but if you don't know the id you can + look it up by searching on any of the fields, similar to what we did for the Shot above, like:: + + filters = [['login', 'is', 'jschmoe']] + user = sg.find('HumanUser', filters) + +The ``result`` variable now contains the ``id`` of the new Version that was created:: + + 214 + + +Upload a movie for review in Screening Room +------------------------------------------- +If Screening Room's transcoding feature is enabled on your site (hosted sites have this by +default), then you can use the :meth:`~shotgun_api3.Shotgun.upload` method to upload a QuickTime +movie, PDF, still image, etc. to the ``sg_uploaded_movie`` field on a Version. Once the movie is +uploaded, it will automatically be queued for transcoding. When transcoding is complete, the +Version will be playable in the Screening Room app, or in the Overlay player by clicking on the +Play button that will appear on the Version's thumbnail. + +.. note:: Transcoding also generates a thumbnail and filmstrip thumbnail automatically. \ No newline at end of file diff --git a/docs/cookbook/examples/basic_delete_shot.rst b/docs/cookbook/examples/basic_delete_shot.rst new file mode 100644 index 000000000..779fc9659 --- /dev/null +++ b/docs/cookbook/examples/basic_delete_shot.rst @@ -0,0 +1,52 @@ +Delete A Shot +============= + +Calling :meth:`~shotgun_api3.Shotgun.delete` +-------------------------------------------- +Deleting an entity in Shotgun is pretty straight-forward. No extraneous steps required.:: + + result = sg.delete("Shot", 40435) + +Result +------ +If the Shot was deleted successfully ``result`` will contain:: + + True + +The Complete Example +-------------------- +:: + + #!/usr/bin/env python + + # -------------------------------------- + # Imports + # -------------------------------------- + import shotgun_api3 + from pprint import pprint # useful for debugging + + # -------------------------------------- + # Globals + # -------------------------------------- + # make sure to change this to match your Shotgun server and auth credentials. + SERVER_PATH = "https://mystudio.shotgunstudio.com" + SCRIPT_NAME = 'my_script' + SCRIPT_KEY = '27b65d7063f46b82e670fe807bd2b6f3fd1676c1' + + # -------------------------------------- + # Main + # -------------------------------------- + if __name__ == '__main__': + + sg = shotgun_api3.Shotgun(SERVER_PATH, SCRIPT_NAME, SCRIPT_KEY) + + # -------------------------------------- + # Delete a Shot by id + # -------------------------------------- + result = sg.delete("Shot", 40435) + pprint(result) + +And here is the output:: + + True + diff --git a/docs/cookbook/examples/basic_find_shot.rst b/docs/cookbook/examples/basic_find_shot.rst new file mode 100644 index 000000000..ee223c89b --- /dev/null +++ b/docs/cookbook/examples/basic_find_shot.rst @@ -0,0 +1,76 @@ +.. _example_find_shot: + +Find a Shot +=========== + +Building the Query +------------------ +We are going to assume we know the 'id' of the Shot we're looking for in this example.:: + + filters = [['id', 'is', 40435]] + result = sg.find_one('Shot', filters) + +Pretty simple right? Well here's a little more insight into what's going on. + +- ``filters`` is an list of filter conditions. In this example we are filtering for Shots where + the ``id`` column is **40435**. +- ``sg`` is the Shotgun API instance. +- ``find_one()`` is the :meth:`~shotgun_api3.Shotgun.find_one` API method we are calling. We + provide it with the entity type we're searching for and our filters. + + +Seeing the Result +----------------- +So what does this return? The variable result now contains:: + + {'type': 'Shot','id': 40435} + +By default, :meth:`~shotgun_api3.Shotgun.find_one` returns a single dictionary object with +the ``type`` and ``id`` fields. So in this example, we found a Shot matching that id, and Shotgun +returned it as a dictionary object with ``type`` and ``id`` keys . + +How do we know that result contains the Shot dictionary object? You can trust us... but just to be +sure, the :mod:`pprint` (PrettyPrint) module from the Python standard library is a really good tool +to help with debugging. It will print out objects in a nicely formatted way that makes things +easier to read. So we'll add that to the import section of our script.:: + + import shotgun_api3 + from pprint import pprint # useful for debugging + +The Complete Example +-------------------- +:: + + #!/usr/bin/env python + + # -------------------------------------- + # Imports + # -------------------------------------- + import shotgun_api3 + from pprint import pprint # useful for debugging + + # -------------------------------------- + # Globals + # -------------------------------------- + # make sure to change this to match your Shotgun server and auth credentials. + SERVER_PATH = "https://mystudio.shotgunstudio.com" + SCRIPT_NAME = 'my_script' + SCRIPT_KEY = '27b65d7063f46b82e670fe807bd2b6f3fd1676c1' + + # -------------------------------------- + # Main + # -------------------------------------- + if __name__ == '__main__': + + sg = shotgun_api3.Shotgun(SERVER_PATH, SCRIPT_NAME, SCRIPT_KEY) + + # -------------------------------------- + # Find a Shot by id + # -------------------------------------- + filters = [['id', 'is', 40435]] + result = sg.find_one('Shot', filters) + pprint(result) + +And here is the output:: + + {'type': 'Shot','id': 40435} diff --git a/docs/cookbook/examples/basic_sg_instance.rst b/docs/cookbook/examples/basic_sg_instance.rst new file mode 100644 index 000000000..6d2d1dd08 --- /dev/null +++ b/docs/cookbook/examples/basic_sg_instance.rst @@ -0,0 +1,26 @@ +.. _example_sg_instance: + +Create a Shotgun API instance +============================= + +This example shows you how to establish your initial connection to Shotgun using script-based +authentication. ``sg`` represents your Shotgun API instance. Be sure you've read +:ref:`Setting Up Shotgun for API Access `. +:: + + import pprint # Useful for debugging + + import shotgun_api3 + + SERVER_PATH = "https://your_site.shotgunstudio.com" + SCRIPT_NAME = 'my_script' + SCRIPT_KEY = '27b65d7063f46b82e670fe807bd2b6f3fd1676c1' + + sg = shotgun_api3.Shotgun(SERVER_PATH, SCRIPT_NAME, SCRIPT_KEY) + + # Just for demo purposes, this will print out property and method names available on the + # sg connection object + pprint.pprint([symbol for symbol in sorted(dir(sg)) if not symbol.startswith('_')]) + +For further information on what you can do with this Shotgun object you can read the +:ref:`API reference `. \ No newline at end of file diff --git a/docs/cookbook/examples/basic_update_shot.rst b/docs/cookbook/examples/basic_update_shot.rst new file mode 100644 index 000000000..555114578 --- /dev/null +++ b/docs/cookbook/examples/basic_update_shot.rst @@ -0,0 +1,86 @@ +Update A Shot +============= + +Building the data and calling :meth:`~shotgun_api3.Shotgun.update` +------------------------------------------------------------------ +To update a Shot, you need to provide the ``id`` of the Shot and a list of fields you want to +update.:: + + data = { + 'description': 'Open on a beautiful field with fuzzy bunnies', + 'sg_status_list': 'ip' + } + result = sg.update('Shot', 40435, data) + +This will update the ``description`` and the ``sg_status_list`` fields for the Shot with ``id`` of +**40435**. + +- ``data`` is a list of key/value pairs where the key is the field name to update and the value to + update it to. +- ``sg`` is the Shotgun API instance. +- ``update()`` is the :meth:`shotgun_api3.Shotgun.update` API method we are calling. We provide it + with the entity type we're updating, the ``id`` of the entity, and the data we're updating it + with. + +Result +------ +The variable ``result`` now contains the Shot object that with the updated values.:: + + { + 'description': 'Opening establishing shot with titles and fuzzy bunnies', + 'sg_status_list': 'ip', + 'type': 'Shot', + 'id': 40435 + } + +In addition, Shotgun has returned the ``id`` for the Shot, as well as a ``type`` value. ``type`` +is provided for convenience simply to help you identify what entity type this dictionary represents. +It does not correspond to any field in Shotgun. + +Shotgun will *always* return the ``id`` and ``type`` keys in the dictionary when there are results +representing an entity. + +The Complete Example +-------------------- +:: + + #!/usr/bin/env python + + # -------------------------------------- + # Imports + # -------------------------------------- + import shotgun_api3 + from pprint import pprint # useful for debugging + + # -------------------------------------- + # Globals + # -------------------------------------- + # make sure to change this to match your Shotgun server and auth credentials. + SERVER_PATH = "https://mystudio.shotgunstudio.com" + SCRIPT_NAME = 'my_script' + SCRIPT_KEY = '27b65d7063f46b82e670fe807bd2b6f3fd1676c1' + + # -------------------------------------- + # Main + # -------------------------------------- + if __name__ == '__main__': + + sg = shotgun_api3.Shotgun(SERVER_PATH, SCRIPT_NAME, SCRIPT_KEY) + + # -------------------------------------- + # Update Shot with data + # -------------------------------------- + data = { + 'description': 'Open on a beautiful field with fuzzy bunnies', + 'sg_status_list': 'ip' + } + result = sg.update('Shot', 40435, data) + pprint(result) + +And here is the output:: + + {'description': 'Opening establishing shot with titles and fuzzy bunnies', + 'id': 40435, + 'sg_status_list': 'ip', + 'type': 'Shot'} + diff --git a/docs/cookbook/examples/basic_upload_thumbnail_version.rst b/docs/cookbook/examples/basic_upload_thumbnail_version.rst new file mode 100644 index 000000000..62713aa90 --- /dev/null +++ b/docs/cookbook/examples/basic_upload_thumbnail_version.rst @@ -0,0 +1,27 @@ +Upload a Thumbnail for a Version +================================ + +So you've created a new Version of a Shot, and you've updated Shotgun, but now you want to upload a +beauty frame to display as the thumbnail for your Version. We'll assume you already have the image +made (located on your machine at ``/v1/gun/s100/010/beauties/anim/100_010_animv1.jpg``) . And since +you've just created your Version in Shotgun, you know its ``id`` is **214**. + +.. note:: If you upload a movie file or image to the ``sg_uploaded_movie`` field and you have + transcoding enabled on your server (the default for hosted sites), a thumbnail will be + generated automatically as well as a filmstrip thumbnail (if possible). But this example is + provided just to show the basic process of uploading a thumbnail manually where is may be + necessary. + +Upload the Image using :meth:`~shotgun_api3.Shotgun.upload_thumbnail` +--------------------------------------------------------------------- +:: + + sg.upload_thumbnail("Version", 214, "/v1/gun/s100/010/beauties/anim/100_010_animv1.jpg") + + +Shotgun will take care of resizing the thumbnail for you. If something does go wrong, an exception +will be thrown and you'll see the error details. + +.. note:: The result returned by :meth:`~shotgun_api3.Shotgun.upload_thumbnail` is an integer + representing the id of a special ``Attachment`` entity in Shotgun. Working with Attachments + is beyond the scope of this example. :) \ No newline at end of file diff --git a/docs/cookbook/examples/svn_integration.rst b/docs/cookbook/examples/svn_integration.rst new file mode 100644 index 000000000..ade057af6 --- /dev/null +++ b/docs/cookbook/examples/svn_integration.rst @@ -0,0 +1,170 @@ +.. _svn_integration: + +############################ +Subversion (SVN) Integration +############################ + +Integrating Shotgun with Subversion consists of two basic parts: + +- Setup a post-commit hook in Subversion. +- Create a Shotgun API script to create the Revision in Shotgun. This script will be called by + the post-commit hook. + +**************** +Post-Commit Hook +**************** + +To setup the post-commit hook: + +- Locate the ``post-commit.tmpl`` file, which is found inside the ``hooks`` folder in your + repository directory. This is a template script that has lots of useful comments and can serve + as a starting point for the real thing. +- Create your very own executable script, and save it in the same ``hooks`` folder, name it + ``post-commit``, and give it executable permission. +- In your ``post-commit`` script, invoke your Shotgun API script. + +If this is entirely new to you, we highly suggest reading up on the topic. O'Reilly has `a free +online guide for Subversion 1.5 and 1.6 +`_ + +Here's an example of a post-commit hook that we've made for Subversion 1.6 using an executable +Unix shell script. The last line invokes "shotgun_api_script.py" which is our Python script that +will do all the heavy lifting. Lines 4 thru 8 queue up some objects that we'll use later on. + +.. code-block:: sh + :linenos: + + #!/bin/sh + # POST-COMMIT HOOK + + REPOS="$1" + REV="$2" + + export AUTHOR="$(svnlook author $REPOS --revision $REV)" + export COMMENT="$(svnlook log $REPOS --revision $REV)" + + /Absolute/path/to/shotgun_api_script.py + +Explanation of selected lines +============================= + +- lines ``4-5``: After the commit, Subversion leaves us two string objects in the environment: + ``REPOS`` and ``REV`` (the repository path and the revision number, respectively). +- lines ``7-8``: Here we use the shell command ``export`` to create two more string objects in the + environment: ``AUTHOR`` and ``COMMENT``. To get each value, we use the ``svnlook`` command with + our ``REPOS`` and ``REV`` values, first with the ``author``, and then with ``log`` subcommand. + These are actually the first two original lines of code - everything else to this point was + pre-written already in the ``post-commit.tmpl`` file. nice :) +- line ``10``: This is the absolute path to our Shotgun API Script. + +****************** +Shotgun API Script +****************** + +This script will create the Revision and populate it with some metadata using the Shotgun Python +API. It will create our Revision in Shotgun along with the author, comment, and because we use +Trac (a web-based interface for Subversion), it will also populate a URL field with a clickable +link to the Revision. + +.. code-block:: python + :linenos: + + + #!/usr/bin/env python + # --------------------------------------------------------------------------------------------- + + # --------------------------------------------------------------------------------------------- + # Imports + # --------------------------------------------------------------------------------------------- + import sys + from shotgun_api3_preview import Shotgun + import os + + # --------------------------------------------------------------------------------------------- + # Globals - update all of these values to those of your studio + # --------------------------------------------------------------------------------------------- + SERVER_PATH = 'https ://studio_name.shotgunstudio.com' # or http: + SCRIPT_USER = 'script_name' + SCRIPT_KEY = '3333333333333333333333333333333333333333' + REVISIONS_PATH = 'https ://serveraddress/trac/changeset/' # or other web-based UI + PROJECT = {'type':'Project', 'id':27} + + # --------------------------------------------------------------------------------------------- + # Main + # --------------------------------------------------------------------------------------------- + if __name__ == '__main__': + + sg = Shotgun(SERVER_PATH, SCRIPT_USER, SCRIPT_KEY) + + # Set Python variables from the environment objects + revision_code = os.environ['REV'] + repository = os.environ['REPOS'] + description = os.environ['COMMENT'] + author = os.environ['AUTHOR'] + + # Set the Trac path for this specific revision + revision_url = REVISIONS_PATH + revision_code + + # Validate that author is a valid Shotgun HumanUser + result = sg.find_one("HumanUser", [['login', 'is', author]]) + if result: + # Create Revision + url = {'content_type':'http_url', 'url':revision_url, 'name':'Trac'} + parameters = {'project':PROJECT, + 'code':str(revision_code), + 'description':description, + 'attachment':url, + 'created_by':{"type":"HumanUser", "id":result['id']} + } + revision = sg.create("Revision", parameters) + print "created Revision #"+str(revision_code) + + # Send error message if valid HumanUser is not found + else: + print "Unable to find valid Shotgun User with login: "+author+", Revision not created in Shotgun." + + + +Explanation of selected lines: +============================== + +- line ``14``: This should be the URL to your instance of Shotgun. +- lines ``15-16``: Make sure you get these values from the "Scripts" page in the Admin section of + the Shotgun web application. If you're not sure how to do this, check out :doc:`authentication`. +- line ``17``: This is the address of Trac, our web-based interface that we use with Subversion. + You may use a different interface, or none at all, so feel free to adjust this line or ignore it + as your case may be. +- line ``18``: Every Revision in Shotgun must have a Project, which is passed to the API as a + dictionary with two keys, the ``type`` and the ``id``. Of course the ``type`` value will always + remain ``Project`` (case sensitive), but the ``id`` will change by Project. To find out the + ``id`` of your Project, go to the Projects page in the Shotgun web application, locate the + Project where you want your Revisions created, and then locate its ``id`` field (which you may + need to display - if you don't see it, right click on any column header then select + "Insert Column" > "Id"). Note that for this example we assume that all Revisions in this + Subversion repository will belong to the same Project. +- lines ``28-31``: Grab the values from the objects that were left for us in the environment. +- line ``34``: Add the Revision number to complete the path of our Trac url. +- line ``37``: Make sure that a valid User exists in Shotgun. In our example, we assume that our + Users' Shotgun logins match their Subversion names. If the user exists in Shotgun, that + user's ``id`` will be returned as ``result['id']``, which we will need later on in line 46. +- lines ``40-48``: Use all the meta data we've gathered to create a Revision in Shotgun. If none + of these lines make any sense, check out more on the :meth:`~shotgun_api3.Shotgun.create` method + here. Line 41 deserves special mention: notice that we define a dictionary called ``url`` that + has three important keys: ``content_type``, ``url``, and ``name``, and we then pass this in as + the value for the ``attachment`` field when we create the Revision. If you're even in doubt, + double check the syntax and requirements for the different field types here. + +*************** +Troubleshooting +*************** + +My post-commit script is simply not running. I can run it manually, but commits are not triggering it. +====================================================================================================== + +Make sure that the script is has explicitly been made executable and that all users who will +invoke it have appropriate permissions for the script and that folders going back to root. + +My Shotgun API script is not getting called by the post-commit hook. +==================================================================== + +Make sure that the script is called using its absolute path. diff --git a/docs/cookbook/smart_cut_fields.rst b/docs/cookbook/smart_cut_fields.rst new file mode 100644 index 000000000..9dd7fcae1 --- /dev/null +++ b/docs/cookbook/smart_cut_fields.rst @@ -0,0 +1,53 @@ +.. _smart_cut_fields: + +################ +Smart Cut Fields +################ + +.. warning:: + Smart Cut Fields should be considered deprecated. Shotgun v7.0, introduced a new version of + cut support. `Read the Cut Support Documentation here `_. + +If you want to work with 'smart' cut fields through the API, your script should use a corresponding +'raw' fields for all updates. The 'smart_cut_fields' are primarily for display in the UI, the real +data is stored in a set of 'raw' fields that have different names. + +************ +Smart Fields +************ + +In the UI these fields attempt to calculate values based on data entered into the various fields. +These fields can be queried via the API using the find() method, but not updated. Note that we are +deprecating this feature and recommend creating your own cut fields from scratch, which will not +contain any calculations which have proven to be too magical at times. + +- ``smart_cut_duration`` +- ``smart_cut_in`` +- ``smart_cut_out`` +- ``smart_cut_summary_display`` * +- ``smart_cut_duration_display`` * +- ``smart_head_duration`` +- ``smart_head_in`` +- ``smart_head_out`` +- ``smart_tail_duration`` +- ``smart_tail_in`` +- ``smart_tail_out`` +- ``smart_working_duration`` * + +.. note:: \* these are special summary fields that have no corresponding "raw" field. + +********** +Raw Fields +********** + +These are the "raw" fields that can be queried and updated through the API: + +- ``cut_duration`` +- ``cut_in`` +- ``cut_out`` +- ``head_duration`` +- ``head_in`` +- ``head_out`` +- ``tail_duration`` +- ``tail_in`` +- ``tail_out`` diff --git a/docs/cookbook/tasks.rst b/docs/cookbook/tasks.rst new file mode 100644 index 000000000..0acb5f5e7 --- /dev/null +++ b/docs/cookbook/tasks.rst @@ -0,0 +1,13 @@ +################## +Working With Tasks +################## + +Tasks have various special functionality available in the UI that can also be queried and +manipulated through the API. The sections below cover these topics. + +.. toctree:: + :maxdepth: 2 + + tasks/updating_tasks + tasks/task_dependencies + tasks/split_tasks diff --git a/docs/cookbook/tasks/split_tasks.rst b/docs/cookbook/tasks/split_tasks.rst new file mode 100644 index 000000000..c8628c0f9 --- /dev/null +++ b/docs/cookbook/tasks/split_tasks.rst @@ -0,0 +1,257 @@ +.. _split_tasks: + +########### +Split Tasks +########### + +Split tasks can be created and edited via the API but must comply to some rules. Before going +further, a good understanding of :ref:`how Shotgun handles task dates is useful `. + +******** +Overview +******** + +The Task entity has a field called ``splits`` which is a list of dictionaries. Each dictionary +in the list has two string keys, ``start`` and ``end``, who's values are strings representing dates +in the ``YYYY-mm-dd`` format. + +:: + + [{'start': '2012-12-11', 'end': '2012-12-12'}, {'start': '2012-12-18', 'end': '2012-12-19'}] + +- Splits should be ordered from eldest to newest. +- There should be gaps between each split. + + - Gaps are defined as at least one working day. Non-workdays such as weekends and holidays + are not gaps. + +If there are multiple splits but there between two or more splits there is no gap, an error will be +raised. For example:: + + >>> sg.update('Task', 2088, {'splits':[{'start':'2012-12-10', 'end':'2012-12-11'}, {'start':'2012-12-12', 'end':'2012-12-14'}, {'start':'2012-12-19', 'end':'2012-12-20'}]}) + Traceback (most recent call last): + File "", line 1, in + File "/shotgun/src/python-api/shotgun_api3/shotgun.py", line 600, in update + record = self._call_rpc("update", params) + File "/shotgun/src/python-api/shotgun_api3/shotgun.py", line 1239, in _call_rpc + self._response_errors(response) + File "/shotgun/src/python-api/shotgun_api3/shotgun.py", line 1435, in _response_errors + "Unknown Error")) + shotgun_api3.shotgun.Fault: API update() CRUD ERROR #5: Update failed for [Task.splits]: (task.rb) The start date in split segment 2 is only one calendar day away from the end date of the previous segment. There must be calendar days between split segments. + +Alternately, a split value can be set to ``None`` to remove splits (you can also use an empty list). +This will preserve the ``start_date`` and ``due_date`` values but recalculate the ``duration`` value +while appropriately considering all workday rules in effect. + +******************************************************** +How Do Splits Influence Dates And Dates Influence Splits +******************************************************** + +- If splits are specified the supplied ``start_date``, ``due_date`` and ``duration`` fields will be ignored. +- The ``start_date`` will be inferred from the earliest split. +- The ``due_date`` will be inferred from the last split. +- If the ``start_date`` is changed on a task that has splits the first split will be moved to start + on the new ``start_date`` and all further splits will be moved while maintaining gap lengths + between splits and respecting workday rules. +- If the ``due_date`` is changed on a task that has splits the last split will be moved to end on + the new ``due_date`` and all prior splits will be moved while maintaining gap lengths between + splits and respecting workday rules. +- If the ``duration`` is changed two scenarios are possible + + - In the case of a longer duration, additional days will be added to the end of the last split + - In the case of a shorter duration splits, starting with the latest ones, will be either + removed or shortened until the new duration is met. + +Examples +======== +Throughout the following examples, each successive one will build on the previous. + +start_date, due_date and duration being ignored +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + sg.update('Task', 2088, { + 'start_date': '2012-12-06', + 'due_date': '2012-12-23', + 'duration': 3600, + 'splits': [ + {'start': '2012-12-11', 'end': '2012-12-12'}, + {'start': '2012-12-18', 'end': '2012-12-19'} + ] + }) + + # Task = { + # 'start_date': '2012-12-11', + # 'due_date': '2012-12-19', + # 'duration': 2400, + # 'splits': [ + # {'start': '2012-12-11', 'end': '2012-12-12'}, + # {'start': '2012-12-18', 'end': '2012-12-19'} + # ] + # } + +Result: + +.. image:: /images/split_tasks_1.png + +Moving the start_date of a split task +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + sg.update('Task', 2088, { + 'start_date': '2012-12-10' + }) + + # Task = { + # 'start_date': '2012-12-10', + # 'due_date': '2012-12-18', + # 'splits': [ + # {'start': '2012-12-10', 'end': '2012-12-11'}, + # {'start': '2012-12-14', 'end': '2012-12-18'} + # ] + # } + +Result: + +.. image:: /images/split_tasks_2.png + +Moving the due_date of a split task +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + sg.update('Task', 2088, { + 'due_date': '2012-12-19' + }) + + # Task = { + # 'start_date': '2012-12-10', + # 'due_date': '2012-12-19', + # 'splits': [ + # {'start': '2012-12-10', 'end': '2012-12-11'}, + # {'start': '2012-12-14', 'end': '2012-12-19'} + # ] + # } + +Result: + +.. image:: /images/split_tasks_3.png + +Setting a longer duration +~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + sg.update('Task', 2088, { + 'duration': 4200 + }) + + # Task = { + # 'start_date': '2012-12-10', + # 'due_date': '2012-12-21', + # 'duration': 4200, + # 'splits': [ + # {'start': '2012-12-10', 'end': '2012-12-11'}, + # {'start': '2012-12-14', 'end': '2012-12-21'} + # ] + # } + +Result: + +.. image:: /images/split_tasks_4.png + +Setting a shorter duration +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + sg.update('Task', 2088, { + 'duration': 2400 + }) + + # Task = { + # 'start_date': '2012-12-10', + # 'due_date': '2012-12-18', + # 'duration': 2400, + # 'splits': [ + # {'start': '2012-12-10', 'end': '2012-12-11'}, + # {'start': '2012-12-14', 'end': '2012-12-18'} + # ] + # } + +Result: + +.. image:: /images/split_tasks_5.png + +Another example of shorter duration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +We won't be using the previous result for this example but rather, the following: + +.. image:: /images/split_tasks_6.png + +who's duration we will shorten past the last split. + +:: + + sg.update('Task', 2088, { + 'duration': 1800 + }) + + # Task = { + # 'start_date': '2012-12-10', + # 'due_date': '2012-12-18', + # 'duration': 2400, + # 'splits': [ + # {'start': '2012-12-10', 'end': '2012-12-11'}, + # {'start': '2012-12-14', 'end': '2012-12-18'} + # ] + # } + +Result: + +.. image:: /images/split_tasks_7.png + +Setting the due_date in a gap +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When a due date is set in a gap later splits are removed and the day of the due date is considered +a day when work will be done. + +For this example let's assume as a starting point the result of the 5th example: + +.. image:: /images/split_tasks_8.png + +:: + + sg.update('Task', 2088, { + 'due_date': '2012-12-13' + }) + + # Task = { + # 'start_date': '2012-12-10', + # 'due_date': '2012-12-13', + # 'duration': 1800, + # 'splits': [ + # {'start': '2012-12-10', 'end': '2012-12-11'}, + # {'start': '2012-12-13', 'end': '2012-12-13'} + # ] + # } + +Result: + +.. image:: /images/split_tasks_9.png + + + + + + + + + + + + + diff --git a/docs/cookbook/tasks/task_dependencies.rst b/docs/cookbook/tasks/task_dependencies.rst new file mode 100644 index 000000000..fde003783 --- /dev/null +++ b/docs/cookbook/tasks/task_dependencies.rst @@ -0,0 +1,339 @@ +.. _task_dependencies: + +################# +Task Dependencies +################# + +Task dependencies work the same way in the API as they do in the UI. You can filter and sort on +any of the fields. For information about Task Dependencies in Shotgun, check out the `main +documentation page on our support site +`_ + +************ +Create Tasks +************ + +Let's create a couple of Tasks and create dependencies between them. First we'll create a "Layout" +Task for our Shot:: + + data = { + 'project': {'type':'Project', 'id':65}, + 'content': 'Layout', + 'start_date': '2010-04-28', + 'due_date': '2010-05-05', + 'entity': {'type':'Shot', 'id':860} + } + result = sg.create(Task, data) + + +Returns:: + + {'content': 'Layout', + 'due_date': '2010-05-05', + 'entity': {'id': 860, 'name': 'bunny_010_0010', 'type': 'Shot'}, + 'id': 556, + 'project': {'id': 65, 'name': 'Demo Animation Project', 'type': 'Project'}, + 'start_date': '2010-04-28', + 'type': 'Task'} + + +Now let's create an "Anm" Task for our Shot:: + + data = { + 'project': {'type':'Project', 'id':65}, + 'content': 'Anm', + 'start_date': '2010-05-06', + 'due_date': '2010-05-12', + 'entity': {'type':'Shot', 'id':860} + } + result = sg.create(Task, data) + +Returns:: + + {'content': 'Anm', + 'due_date': '2010-05-12', + 'entity': {'id': 860, 'name': 'bunny_010_0010', 'type': 'Shot'}, + 'id': 557, + 'project': {'id': 65, 'name': 'Demo Animation Project', 'type': 'Project'}, + 'start_date': '2010-05-06, + 'type': 'Task'} + + +******************* +Create A Dependency +******************* + +Tasks each have an ``upstream_tasks`` field and a ``downstream_tasks`` field. Each field is a +list ``[]`` type and can contain zero, one, or multiple Task entity dictionaries representing the +dependent Tasks. Here is how to create a dependency between our "Layout" and "Anim" Tasks:: + + # make 'Layout' and upstream Task to 'Anm'. (aka, make 'Anm' dependent on 'Layout') + result = sg.update('Task', 557, {'upstream_tasks':[{'type':'Task','id':556}]}) + +Returns:: + + [{'id': 557, + 'type': 'Task', + 'upstream_tasks': [{'id': 556, 'name': 'Layout', 'type': 'Task'}]}] + +This will also automatically update the `downstream_tasks` field on 'Layout' to include the 'Anm' Task. + +********************************** +Query Tasks with Dependency Fields +********************************** + +So now lets look at the Tasks we've created and their dependency-related fields:: + + filters = [ + ['entity', 'is', {'type':'Shot', 'id':860}] + ] + fields = [ + 'content', + 'start_date', + 'due_date', + 'upstream_tasks', + 'downstream_tasks', + 'dependency_violation', + 'pinned' + ] + result = sg.find("Task", filters, fields) + +Returns:: + + [{'content': 'Layout', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'Anm', 'id': 557}], + 'due_date': '2010-05-05', + 'id': 556, + 'pinned': False, + 'start_date': '2010-04-28', + 'type': 'Task', + 'upstream_tasks': []}, + {'content': 'Anm', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'FX', 'id': 558}], + 'due_date': '2010-05-12', + 'id': 557, + 'pinned': False, + 'start_date': '2010-05-06', + 'type': 'Task', + 'upstream_tasks': [{'type': 'Task', 'name': 'Layout', 'id': 556}]}, + ... + +*Note that we have also created additional Tasks for this Shot but we're going to focus on these +first two for simplicity.* + +***************************************************************** +Updating the End Date on a Task with Downstream Task Dependencies +***************************************************************** + +If we update the ``due_date`` field on our "Layout" Task, we'll see that the "Anm" Task dates +will automatically get pushed back to keep the dependency satisfied:: + + result = sg.update('Task', 556, {'due_date': '2010-05-07'}) + +Returns:: + + [{'due_date': '2010-05-07', 'type': 'Task', 'id': 556}] + +Our Tasks now look like this (notice the new dates on the "Anm" Task):: + + [{'content': 'Layout', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'Anm', 'id': 557}], + 'due_date': '2010-05-07', + 'id': 556, + 'pinned': False, + 'start_date': '2010-04-28', + 'type': 'Task', + 'upstream_tasks': []}, + {'content': 'Anm', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'FX', 'id': 558}], + 'due_date': '2010-05-14', + 'id': 557, + 'pinned': False, + 'start_date': '2010-05-10', + 'type': 'Task', + 'upstream_tasks': [{'type': 'Task', 'name': 'Layout', 'id': 556}]}, + ... + + +********************************************************** +Creating a Dependency Violation by pushing up a Start Date +********************************************************** + +Task Dependencies can work nicely if you are pushing out an end date for a Task as it will just +recalculate the dates for all of the dependent Tasks. But what if we push up the Start Date of our +"Anm" Task to start before our "Layout" Task is scheduled to end? + +:: + + result = sg.update('Task', 557, {'start_date': '2010-05-06'}) + +Returns:: + + [{'type': 'Task', 'start_date': '2010-05-06', 'id': 557}] + +Our Tasks now look like this:: + + [{'content': 'Layout', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'Anm', 'id': 557}], + 'due_date': '2010-05-07', + 'id': 556, + 'pinned': False, + 'start_date': '2010-04-28', + 'type': 'Task', + 'upstream_tasks': []}, + {'content': 'Anm', + 'dependency_violation': True, + 'downstream_tasks': [{'type': 'Task', 'name': 'FX', 'id': 558}], + 'due_date': '2010-05-12', + 'id': 557, + 'pinned': True, + 'start_date': '2010-05-06', + 'type': 'Task', + 'upstream_tasks': [{'type': 'Task', 'name': 'Layout', 'id': 556}]}, + ... + +Because the "Anm" Task ``start_date`` depends on the ``due_date`` of the "Layout" Task, this +change creates a dependency violation. The update succeeds, but Shotgun has also set the +``dependency_violation`` field to ``True`` and has also updated the ``pinned`` field to ``True``. + +The ``pinned`` field simply means that if the upstream Task(s) are moved, the "Anm" Task will no +longer get moved with it. The dependency is still there (in ``upstream_tasks``) but the Task is +now "pinned" to those dates until the Dependency Violation is resolved. + +*********************************************************** +Resolving a Dependency Violation by updating the Start Date +*********************************************************** + +We don't want that violation there. Let's revert that change so the Start Date for "Anm" is after +the End Date of "Layout":: + + result = sg.update('Task', 557, {'start_date': '2010-05-10'}) + +Returns:: + + [{'type': 'Task', 'start_date': '2010-05-10', 'id': 557}] + +Our Tasks now look like this:: + + [{'content': 'Layout', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'Anm', 'id': 557}], + 'due_date': '2010-05-07', + 'id': 556, + 'pinned': False, + 'start_date': '2010-04-28', + 'type': 'Task', + 'upstream_tasks': []}, + {'content': 'Anm', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'FX', 'id': 558}], + 'due_date': '2010-05-14', + 'id': 557, + 'pinned': True, + 'start_date': '2010-05-10', + 'type': 'Task', + 'upstream_tasks': [{'type': 'Task', 'name': 'Layout', 'id': 556}]}, + ... + +The ``dependency_violation`` field has now been set back to ``False`` since there is no longer +a violation. But notice that the ``pinned`` field is still ``True``. We will have to manually +update that if we want the Task to travel with its dependencies again:: + + result = sg.update('Task', 557, {'pinned': False}) + +Returns:: + + [{'pinned': False, 'type': 'Task', 'id': 557}] + +Our Tasks now look like this:: + + [{'content': 'Layout', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'Anm', 'id': 557}], + 'due_date': '2010-05-07', + 'id': 556, + 'pinned': False, + 'start_date': '2010-04-28', + 'type': 'Task', + 'upstream_tasks': []}, + {'content': 'Anm', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'FX', 'id': 558}], + 'due_date': '2010-05-14', + 'id': 557, + 'pinned': False, + 'start_date': '2010-05-10', + 'type': 'Task', + 'upstream_tasks': [{'type': 'Task', 'name': 'Layout', 'id': 556}]}, + ... + +Looks great. But that's an annoying manual process. What if we want to just reset a Task so that +it automatically gets updated so that the Start Date is after its dependent Tasks? + +******************************************************************* +Updating the ``pinned`` field on a Task with a Dependency Violation +******************************************************************* + +Let's go back a couple of steps to where our "Anm" Task had a Dependency Violation because we had +moved the Start Date up before the "Layout" Task End Date. Remember that the ``pinned`` field +was also ``True``. If we simply update the ``pinned`` field to be ``False``, Shotgun will also +automatically update the Task dates to satisfy the upstream dependencies and reset the +``dependency_violation`` value to ``False``:: + + result = sg.update('Task', 557, {'pinned': False}) + +Returns:: + + [{'pinned': False, 'type': 'Task', 'id': 557}] + + +Our Tasks now look like this:: + + [{'content': 'Layout', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'Anm', 'id': 557}], + 'due_date': '2010-05-07', + 'id': 556, + 'pinned': False, + 'start_date': '2010-04-28', + 'type': 'Task', + 'upstream_tasks': []}, + {'content': 'Anm', + 'dependency_violation': False, + 'downstream_tasks': [{'type': 'Task', 'name': 'FX', 'id': 558}], + 'due_date': '2010-05-14', + 'id': 557, + 'pinned': False, + 'start_date': '2010-05-10', + 'type': 'Task', + 'upstream_tasks': [{'type': 'Task', 'name': 'Layout', 'id': 556}]}, + ... + + +Notice by updating ``pinned`` to ``False``, Shotgun also updated the ``start_date`` and +``due_date`` fields of our "Anm" Task so it will satisfy the upstream Task dependencies. And since +that succeeded, the ``dependency_violation`` field has also been set to ``False`` + +******************************************* +``dependency_violation`` field is read-only +******************************************* + +The ``dependency_violation`` field is the only dependency-related field that is read-only. Trying +to modify it will generate a Fault:: + + result = sg.update('Task', 557, {'dependency_violation': False}) + +Returns:: + + # -------------------------------------------------------------------------------- + # XMLRPC Fault 103: + # API update() Task.dependency_violation is read only: + # {"value"=>false, "field_name"=>"dependency_violation"} + # -------------------------------------------------------------------------------- + # Traceback (most recent call last): + # ... diff --git a/docs/cookbook/tasks/updating_tasks.rst b/docs/cookbook/tasks/updating_tasks.rst new file mode 100644 index 000000000..b7c57a051 --- /dev/null +++ b/docs/cookbook/tasks/updating_tasks.rst @@ -0,0 +1,371 @@ +.. _updating_tasks: + +####################################### +Updating Task Dates: How Shotgun Thinks +####################################### + +When updating Task dates in an API update() request, there is no specified order to the values that +are passed in. Shotgun also does automatic calculation of the``start_date``,``due_date``, and ``duration`` fields for convenience. In order to clarify how updates are handled by Shotgun we are +providing some general rules below and examples of what will happen when you make updates to your +Tasks. + +************** +General Rules +************** + +- Updating the ``start_date`` automatically updates the ``due_date`` (``duration`` remains constant) +- Updating the ``due_date`` automatically updates the ``duration`` (``start_date`` remains constant) +- Updating the ``duration`` automatically updates the ``due_date`` (``start_date`` remains constant) +- When updating Task values, Shotgun sets schedule fields (``milestone``, ``duration``, + ``start_date``, ``due_date``) after all other fields, because the Project and Task Assignees + affect schedule calculations. +- If ``start_date`` and ``due_date`` are both set, ``duration`` is ignored (``duration`` can often + be wrong since it's easy to calculate scheduling incorrectly). +- If both ``start_date`` and ``due_date`` are provided, Shotgun sets ``start_date`` before + ``due_date``. +- Set ``milestone`` before other schedule fields (because ``start_date``, ``due_date``, and + ``duration`` get lost if ``milestone`` is not set to ``False`` first) +- If ``milestone`` is being set to ``True``, ``duration`` is ignored. +- If ``milestone`` is set to ``True`` and ``start_date`` and ``due_date`` are also being set to + conflicting values, an Exception is raised. +- If ``due_date`` and ``duration`` are set together (without ``start_date``), ``duration`` is set + first, then ``due_date`` (otherwise setting ``duration`` will change ``due_date`` after it is + set). + +******** +Examples +******** + +The following examples show what the resulting Task object will look like after being run on the +initial Task object listed under the header of each section. + +The ``duration`` values in the following examples assume your Shotgun instance is set to +10-hour work days. If your server is configured with a different setting, the ``duration`` values +will vary. + +.. note:: The ``duration`` field stores ``duration`` values in minutes + +Universal +========= +Regardless of current values on the Task, this behavior rules:: + + Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +Update start_date and due_date +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``duration`` is ignored if also provided. It is instead set automatically as (``due_date`` - +``start_date``) + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-25', 'due_date':'2011-05-30', 'duration':1200}) + # Task = {'start_date': '2011-05-25', 'due_date': '2011-05-30', 'duration': 2400, 'id':123} + +- ``start_date`` is updated. +- ``due_date`` is updated. +- ``duration`` is calculated as (``due_date`` - ``start_date``) + +.. note:: The value provided in the update() is ignored (and in this case was also incorrect). + +Update start_date and duration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-25', 'duration':3600}) + # Task = {'start_date': '2011-05-25', 'due_date': '2011-06-01', 'duration': 3600, 'id':123} + +- ``start_date`` is updated. +- ``duration`` is updated. +- ``due_date`` is updated to (``start_date`` + ``duration``). + +Update due_date and duration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date': '2011-05-20', 'duration':3600}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-20', 'duration': 600, 'id':123} + +- ``duration`` is updated. +- ``due_date`` is updated. +- ``duration`` is calculated as (``due_date`` - ``start_date``) + +.. note:: This means the ``duration`` provided is overwritten. + +Task has start_date only +======================== + +:: + + Task = {'start_date': '2011-05-20', 'due_date': None, 'duration': None, 'id':123} + +Update start_date +~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-25'}) + # Task = {'start_date': '2011-05-25', 'due_date': None, 'duration': None, 'id':123} + +- Only ``start_date`` is updated. + +Update due_date +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date':'2011-05-25'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +- ``due_date`` is updated. +- ``duration`` is updated to (``due_date`` - ``start_date``). + +Update duration +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'duration':2400}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +- ``duration`` is updated. +- ``due_date`` is set to (``start_date`` + ``duration``) + +Task has due_date only +====================== + +:: + + # Task = {'start_date': None, 'due_date': '2011-05-25', 'duration': None, 'id':123} + +Update start_date +~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-20'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +- ``start_date`` is updated. +- ``duration`` is updated to (``due_date`` - ``start_date``). + +Update due_date +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date':'2011-05-20'}) + # Task = {'start_date': None, 'due_date': '2011-05-20', 'duration': None, 'id':123} + +- only ``due_date`` is updated. + +Update duration +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'duration':2400}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +- ``duration`` is updated. +- ``start_date`` is set to (``due_date`` - ``duration``) + +Task has duration only +====================== + +:: + + # Task = {'start_date': None, 'due_date': None, 'duration': 2400, 'id':123} + +Update start_date +~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-20'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +- ``start_date`` is updated. +- ``due_date`` is updated to (``start_date`` + ``duration``). + +Update due_date +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date':'2011-05-25'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +- ``due_date`` is updated. +- ``start_date`` is updated to (``due_date`` - ``duration``) + +Update duration +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'duration':3600}) + # Task = {'start_date': None, 'due_date': None, 'duration': 3600, 'id':123} + +- only ``duration`` is updated. + +Task has start_date and due_date (no duration) +============================================== + +:: + + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': None, 'id':123} + +Update start_date +~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-25'}) + # Task = {'start_date': '2011-05-25', 'due_date': '2011-05-25', 'duration': 600, 'id':123} + +- ``start_date`` is updated. +- ``duration`` is updated to (``due_date`` - ``start_date``). + +Update due_date +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date':'2011-05-30'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-30', 'duration': 4200, 'id':123} + +- ``due_date`` is updated. +- ``duration`` is updated to (``due_date`` - ``start_date``) + +Update duration +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'duration':3600}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-27', 'duration': 3600, 'id':123} + +- ``duration`` is updated. +- ``due_date`` is updated to (``start_date`` + ``duration``) + +Task has start_date and duration (no due_date) +============================================== + +:: + + # Task = {'start_date': '2011-05-20', 'due_date': None, 'duration': 2400, 'id':123} + +Update start_date +~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-25'}) + # Task = {'start_date': '2011-05-25', 'due_date': '2011-05-30', 'duration': 2400, 'id':123} + +- ``start_date`` is updated. +- ``due_date`` is updated to (``start_date`` +``duration``). + +Update due_date +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date':'2011-05-30'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-30', 'duration': 4200, 'id':123} + +- ``due_date`` is updated. +- ``duration`` is updated to (``due_date`` - ``start_date``). + +Update duration +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'duration':3600}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-27', 'duration': 3600, 'id':123} + +- ``duration`` is updated. +- ``due_date`` is updated to (``start_date`` + ``duration``) + +Task has due_date and duration (no start_date) +============================================== + +:: + + # Task = {'start_date': None, 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +Update start_date +~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-25'}) + # Task = {'start_date': '2011-05-25', 'due_date': '2011-05-30', 'duration': 2400, 'id':123} + +- ``start_date`` is updated. +- ``due_date`` is updated to (``start_date`` + ``duration``). + +Update due_date +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date':'2011-05-30'}) + # Task = {'start_date': '2011-05-25', 'due_date': '2011-05-30', 'duration': 2400, 'id':123} + +- ``due_date`` is updated. +- ``start_date`` is updated to (``due_date`` - ``duration``). + +Update duration +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'duration':3600}) + # Task = {'start_date': '2011-05-18', 'due_date': '2011-05-25', 'duration': 3600, 'id':123} + +- ``duration`` is updated. +- ``start_date`` is updated to (``due_date`` - ``duration``) + +Task has start_date ,due_date, and duration +=========================================== + +:: + + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} + +Update start_date +~~~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'start_date':'2011-05-25'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-30', 'duration': 2400, 'id':123} + +- ``start_date`` is updated. +- ``due_date`` is updated to (``start_date`` + ``duration``). + +Update due_date +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'due_date':'2011-05-30'}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-30', 'duration': 4200, 'id':123} + +- ``due_date`` is updated. +- ``duration`` is updated to (``due_date`` - ``start_date``) + +Update duration +~~~~~~~~~~~~~~~ + +:: + + sg.update ('Task', 123, {'duration':3600}) + # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-27', 'duration': 3600, 'id':123} + +- ``duration`` is updated. +- ``due_date`` is updated to (``start_date`` + ``duration``) \ No newline at end of file diff --git a/docs/cookbook/tutorials.rst b/docs/cookbook/tutorials.rst new file mode 100644 index 000000000..2eb2e0d4d --- /dev/null +++ b/docs/cookbook/tutorials.rst @@ -0,0 +1,33 @@ +######## +Examples +######## + +Here's a list of various simple tutorials to walk through that should provide you with a good base +understanding of how to use the Shotgun API and what you can do with it. + +***** +Basic +***** + +.. toctree:: + :maxdepth: 1 + + examples/basic_sg_instance + examples/basic_create_shot + examples/basic_find_shot + examples/basic_update_shot + examples/basic_delete_shot + examples/basic_create_shot_task_template + examples/basic_create_version_link_shot + examples/basic_upload_thumbnail_version + +******** +Advanced +******** + +.. toctree:: + :maxdepth: 1 + + examples/ami_handler + examples/ami_version_packager + examples/svn_integration diff --git a/docs/cookbook/usage_tips.rst b/docs/cookbook/usage_tips.rst new file mode 100644 index 000000000..8a909f7fc --- /dev/null +++ b/docs/cookbook/usage_tips.rst @@ -0,0 +1,302 @@ +############## +API Usage Tips +############## + +Below is a list of helpful tips when using the Shotgun API. We have tried to make the API very +simple to use with predictable results while remaining a powerful tool to integrate with your +pipeline. However, there's always a couple of things that crop up that our users might not be +aware of. Those are the types of things you'll find below. We'll be adding to this document over +time as new questions come up from our users that exhibit these types of cases. + +********* +Importing +********* + +We strongly recommend you import the entire `shotgun_api3` module instead of just importing the +:class:`shotgun_api3.Shotgun` class from the module. There is other important functionality that +is managed at the module level which may not work as expected if you only import the +:class:`shotgun_api3.Shotgun` object. + +Do:: + + import shotgun_api3 + +Don't:: + + from shotgun_api3 import Shotgun + +*************** +Multi-threading +*************** +The Shotgun API is not thread-safe. If you want to do threading we strongly suggest that you use +one connection object per thread and not share the connection. + +************* +Entity Fields +************* + +When you do a :meth:`~shotgun_api3.Shotgun.find` call that returns a field of type entity or +multi-entity (for example the 'assets' column on Shot), the entities are returned in a standard +dictionary:: + + {'type': 'Asset', 'name': 'redBall', 'id': 1} + +For each entity returned, you will get a ``type``, ``name``, and ``id`` key. This does not mean +there are fields named ``type`` and ``name`` on the Asset. These are only used to provide a +consistent way to represent entities returned via the API. + +- ``type``: the entity type (CamelCase) +- ``name``: the display name of the entity. For most entity types this is the value of the ``code`` + field but not always. For example, on the Ticket and Delivery entities the ``name`` key would + contain the value of the ``title`` field. + +.. _custom_entities: + +************** +CustomEntities +************** +Entity types are always referenced by their original names. So if you enable CustomEntity01 and +call it **Widget**. When you access it via the API, you'll still use CustomEntity01 as the +``entity_type``. + +If you want to be able to remember what all of your CustomEntities represent in a way where you +don't need to go look it up all the time when you're writing a new script, we'd suggest creating +a mapping table or something similar and dumping it in a shared module that your studio uses. +Something like the following:: + + # studio_globals.py + + entity_type_map = { + 'Widget': 'CustomEntity01', + 'Foobar': 'CustomEntity02', + 'Baz': 'CustomNonProjectEntity01, + } + + # or even simpler, you could use a global like this + ENTITY_WIDGET = 'CustomEntity01' + ENTITY_FOOBAR = 'CustomEntity02' + ENTITY_BAZ = 'CustomNonProjectEntity01' + +Then when you're writing scripts, you don't need to worry about remembering which Custom Entity +"Foobars" are, you just use your global:: + + import shotgun_api3 + import studio_globals + + sg = Shotgun('https://mystudio.shotgunstudio.com', 'script_name', '0123456789abcdef0123456789abcdef0123456') + result = sg.find(studio_globals.ENTITY_WIDGET, + filters=[['sg_status_list', 'is', 'ip']], + fields=['code', 'sg_shot']) + +.. _connection_entities: + +****************** +ConnectionEntities +****************** + +Connection entities exist behind the scenes for any many-to-many relationship. Most of the time +you won't need to pay any attention to them. But in some cases, you may need to track information +on the instance of one entity's relationship to another. + +For example, when viewing a list of Versions on a Playlist, the Sort Order (``sg_sort_order``) field is an +example of a field that resides on the connection entity between Playlists and Versions. This +connection entity is appropriately called `PlaylistVersionConnection`. Because any Version can +exist in multiple Playlists, the sort order isn't specific to the Version, it's specific to +each _instance_ of the Version in a Playlist. These instances are tracked using connection +entities in Shtogun and are accessible just like any other entity type in Shotgun. + +To find information about your Versions in the Playlist "Director Review" (let's say it has an +``id`` of 4). We'd run a query like so:: + + filters = [['playlist', 'is', {'type':'Playlist', 'id':4}]] + fields = ['playlist.Playlist.code', 'sg_sort_order', 'version.Version.code', 'version.Version.user', 'version.Version.entity'] + order=[{'column':'sg_sort_order','direction':'asc'}] + result = sg.find('PlaylistVersionConnection', filters, fields, order) + + +Which returns the following:: + + [{'id': 28, + 'playlist.Playlist.code': 'Director Review', + 'sg_sort_order': 1.0, + 'type': 'PlaylistVersionConnection', + 'version.Version.code': 'bunny_020_0010_comp_v003', + 'version.Version.entity': {'id': 880, + 'name': 'bunny_020_0010', + 'type': 'Shot'}, + 'version.Version.user': {'id': 19, 'name': 'Artist 1', 'type': 'HumanUser'}}, + {'id': 29, + 'playlist.Playlist.code': 'Director Review', + 'sg_sort_order': 2.0, + 'type': 'PlaylistVersionConnection', + 'version.Version.code': 'bunny_020_0020_comp_v003', + 'version.Version.entity': {'id': 881, + 'name': 'bunny_020_0020', + 'type': 'Shot'}, + 'version.Version.user': {'id': 12, 'name': 'Artist 8', 'type': 'HumanUser'}}, + {'id': 30, + 'playlist.Playlist.code': 'Director Review', + 'sg_sort_order': 3.0, + 'type': 'PlaylistVersionConnection', + 'version.Version.code': 'bunny_020_0030_comp_v003', + 'version.Version.entity': {'id': 882, + 'name': 'bunny_020_0030', + 'type': 'Shot'}, + 'version.Version.user': {'id': 33, 'name': 'Admin 5', 'type': 'HumanUser'}}, + {'id': 31, + 'playlist.Playlist.code': 'Director Review', + 'sg_sort_order': 4.0, + 'type': 'PlaylistVersionConnection', + 'version.Version.code': 'bunny_020_0040_comp_v003', + 'version.Version.entity': {'id': 883, + 'name': 'bunny_020_0040', + 'type': 'Shot'}, + 'version.Version.user': {'id': 18, 'name': 'Artist 2', 'type': 'HumanUser'}}, + {'id': 32, + 'playlist.Playlist.code': 'Director Review', + 'sg_sort_order': 5.0, + 'type': 'PlaylistVersionConnection', + 'version.Version.code': 'bunny_020_0050_comp_v003', + 'version.Version.entity': {'id': 884, + 'name': 'bunny_020_0050', + 'type': 'Shot'}, + 'version.Version.user': {'id': 15, 'name': 'Artist 5', 'type': 'HumanUser'}}] + + +- ``version`` is the Version record for this connection instance. +- ``playlist`` is the Playlist record for this connection instance. +- ``sg_sort_order`` is the sort order field on the connection instance. + +We can pull in field values from the linked Playlist and Version entities using dot notation like +``version.Version.code``. The syntax is ``fieldname.EntityType.fieldname``. In this example, +``PlaylistVersionConnection`` has a field named ``version``. That field contains a ``Version`` +entity. The field we are interested on the Version is ``code``. Put those together with our f +riend the dot and we have ``version.Version.code``. + +******************************************* +Shotgun UI fields not available via the API +******************************************* + +Summary type fields like Query Fields and Pipeline Step summary fields are currently only available +via the UI. Some other fields may not work as expected through the API because they are "display +only" fields made available for convenience and are only available in the browser UI. + +HumanUser +========= + +- ``name``: This is a UI-only field that is a combination of the ``firstname`` + ``' '`` + + ``lastname``. + +Shot +==== + +**Smart Cut Fields**: These fields are available only in the browser UI. You can read more about +smart cut fields and the API in the :ref:`Smart Cut Fields doc `:: + + smart_cut_in + smart_cut_out + smart_cut_duration + smart_cut_summary_display + smart_duration_summary_display + smart_head_in + smart_head_out + smart_head_duration + smart_tail_in + smart_tail_out + smart_tail_duration + smart_working_duration + + +Pipeline Step summary fields on entities +======================================== + +The Pipeline Step summary fields on entities that have Tasks aren't currently available via the API +and are calculated on the client side in the UI. These fields are like ``step_0``, or ``step_13``. +Note that the Pipeline Step entity itself is available via the API as the entity type ``Step``. + +Query Fields +============ + +Query fields are also summary fields like Pipeline Steps, the query is run from the client side UI +and therefore is not currently supported in the API. + +************ +Audit Fields +************ +You can set the ``created_by`` and ``created_at`` fields via the API at creation time. This is +often useful for when you're importing or migrating data from another source and want to keep the +history in tact. However, you cannot set the ``updated_by`` and ``updated_at`` fields. These are +automatically set whenever an entity is created or updated. + +.. _logging: + +***************************** +Logging Messages from the API +***************************** + +The API uses standard python logging but does not define a handler. + +To see the logging output in stdout, define a streamhandler in your script:: + + import logging + import shotgun_api3 as shotgun + logging.basicConfig(level=logging.DEBUG) + +To write logging output from the shotgun API to a file, define a file handler in your script:: + + import logging + import shotgun_api3 as shotgun + logging.basicConfig(level=logging.DEBUG, filename='/path/to/your/log') + +To suppress the logging output from the API in a script which uses logging, set the level of the +Shotgun logger to a higher level:: + + import logging + import shotgun_api3 as shotgun + sg_log = logging.getLogger('shotgun_api3') + sg_log.setLevel(logging.ERROR) + +************* +Optimizations +************* + +Combining Related Queries +========================= +Reducing round-trips for data via the API can significantly improve the speed of your application. +Much like "Bubble Fields" / "Field Hopping" in the UI, we can poll Shotgun for data on the fields +of entities linked to our main query, both as a part of the query parameters as well as in the +data returned. + +Starting with a simple and common example, many queries require knowing what project your data is +associated with. Without using "field hopping" in an API call, you would first get the project and +then use that data for your follow up query, like so:: + + # Get the project + project_name = 'Big Buck Bunny' + sg_project = sg.find("Project", [['name', 'is', project_name]]) + + # Use project result to get associated shots + sg_shots = sg.find("Shot", [['project', 'is', sg_project]], ['code']) + +With "field hopping" you can combine these queries into:: + + # Get all shots on 'Big Buck Bunny' project + project_name = 'Big Buck Bunny' + sg_shots = sg.find("Shot", [['project.Project.name', 'is', project_name]], ['code']) + +As you can see above, the syntax is to use "``.``" dot notation, joining field names to entity +types in a chain. In this example we start with the field ``project`` on the Shot entity, then +specify we're looking for the "name" field on the Project entity by specifying ``Project.name``. + +Now that we've demonstrated querying using dot notation, let's take a look at returning linked data +by adding the status of each Sequence entity associated with each Shot in our previous query:: + + # Get shot codes and sequence status all in one query + project_name = 'Big Buck Bunny' + sg_shots = sg.find("Shot", [['project.Project.name', 'is', project_name]], + ['code', 'sg_sequence.Sequence.sg_status_list']) + +.. note:: + Due to performance concerns with deep linking, we only support using dot syntax chains for + single-entity relationships. This means that if you try to pull data through a multi-entity + field you will not get the desired result. \ No newline at end of file diff --git a/docs/images/scripts_page.png b/docs/images/scripts_page.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d915a589251995017bbded43a53445be982990 GIT binary patch literal 87417 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∈%qd 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 Xdqx@5P{Rg{xd*ACw3N$`79sx!_Nt%{ literal 0 HcmV?d00001 diff --git a/docs/images/split_tasks_2.png b/docs/images/split_tasks_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf860430e1b1834c811eb2165f82c3ea2f2cb65 GIT binary patch literal 25008 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 Fe*i_|`X>MY literal 0 HcmV?d00001 diff --git a/docs/images/split_tasks_3.png b/docs/images/split_tasks_3.png new file mode 100644 index 0000000000000000000000000000000000000000..59c88c27c8919c5ca0b2b9fecad80bf0348746af GIT binary patch literal 25580 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 literal 0 HcmV?d00001 diff --git a/docs/images/split_tasks_6.png b/docs/images/split_tasks_6.png new file mode 100644 index 0000000000000000000000000000000000000000..de76532ff5c4cb4c87a1ec6e9fed23b9bc9cb534 GIT binary patch literal 25346 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 Ee-rE=RsaA1 literal 0 HcmV?d00001 diff --git a/docs/images/split_tasks_8.png b/docs/images/split_tasks_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f35e0e2cdf3b7e6573c74056b5f433992fae4c7 GIT binary patch literal 25409 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 literal 0 HcmV?d00001 diff --git a/docs/images/split_tasks_9.png b/docs/images/split_tasks_9.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b0b4e9af319b345359ff5ac111fc98e44b87e7 GIT binary patch literal 25022 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 qefqP?`) + +.. image:: https://img.shields.io/badge/shotgun-api-blue.svg?style=flat-square +.. image:: https://img.shields.io/travis/shotgunsoftware/python-api.svg?style=flat-square + + + +Shotgun provides a simple Python-based API for accessing Shotgun and integrating with other tools. +The Shotgun API allows users to integrate their tools with Shotgun very easily. Using this simple +but powerful python module , you can quickly get your scripts integrated with Shotgun's CRUD-based +API. + +Because the needs of every studio can prove to be very different, we don't include a lot of +"automation" or "smarts" in our API. We have kept it pretty low-level and leave most of those +decisions to you. The API is powerful enough you can write your own "smarts" in a wrapper on top +of the Shotgun API. + +In addition to basic metadata, the API contains methods for managing media including thumbnails, +filmstrip thumbnails, images, uploaded, and both locally and remotely linked media like +Quicktimes, etc. + +**Example**:: + + sg = shotgun_api3.Shotgun("https://piedpiper.shotgunstudio.com", + login="rhendriks", + password="c0mPre$Hi0n") + sg.find("Shot", filters=[["sg_status_list", "is", "ip"]], fields=["code", "sg_status_list]) + +**Output**:: + + [{'code': 'bunny_020_0170', + 'id': 896, + 'sg_sequence': {'id': 5, 'name': 'bunny_020', 'type': 'Sequence'}, + 'sg_status_list': 'ip', + 'type': 'Shot'}, + {'code': 'bunny_020_0200', + 'id': 899, + 'sg_sequence': {'id': 5, 'name': 'bunny_020', 'type': 'Sequence'}, + 'sg_status_list': 'ip', + 'type': 'Shot'}, + {'code': 'bunny_030_0080', + 'id': 907, + 'sg_sequence': {'id': 6, 'name': 'bunny_030', 'type': 'Sequence'}, + 'sg_status_list': 'ip', + 'type': 'Shot'}] + + +********** +User Guide +********** +.. toctree:: + :maxdepth: 2 + + installation + authentication + reference + cookbook + advanced + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 000000000..b6659ec25 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,57 @@ +############ +Installation +############ + +******************** +Minimum Requirements +******************** + +- Shotgun server v5.4.14 or higher for API v3.0.16+. +- Shotgun server v2.4.12 or higher for API v3.0.8. +- Shotgun server v1.8 or higher for API v3.0.7. +- Python v2.4 - v2.7. (We do not currently support Python 3) + +.. note:: + Some features of the API are only supported by more recent versions of the Shotgun server. + These features are added to the Python API in a backwards compatible way so that existing + scripts will continue to function as expected. Accessing a method that is not supported for + your version of Shotgun will raise an appropriate exception. In general, we attempt to + document these where possible. + + +******************* +Installing manually +******************* +You can `download the latest release from Github `_ +or `clone the repo `_ to your local filesystem. +You'll need to save it somewhere your local Python installation can find it. + +.. seealso:: For more information on ``PYTHONPATH`` and using modules in Python, see + http://docs.python.org/tutorial/modules.html + +*********************** +Installing with ``pip`` +*********************** + +Installing the Master Branch From Github +======================================== +If you wish to install the current master, use the following command:: + + pip install git+git://github.com/shotgunsoftware/python-api.git + +.. note:: The master branch contains the latest revisions and while largely considered "stable" it + is not an official packaged release. + +Installing A specific Version From Github +========================================= +To install a specific version of the package from Github, run the following command. This example +installs the v3.0.26 tag, replace the version tag with the one you want:: + + pip install git+git://github.com/shotgunsoftware/python-api.git@v3.0.26 + + +requirements.txt +~~~~~~~~~~~~~~~~ +If you're using pip with `requirements.txt`, add the following line:: + + git+git://github.com/shotgunsoftware/python-api.git diff --git a/docs/reference.rst b/docs/reference.rst new file mode 100644 index 000000000..d6456af2e --- /dev/null +++ b/docs/reference.rst @@ -0,0 +1,795 @@ +.. currentmodule:: shotgun_api3 + +.. _apireference: + +############# +API Reference +############# + + +***************************** +``shotgun`` Module Attributes +***************************** + +The :mod:`~shotgun_api3.shotgun` module is a container for the :class:`~shotgun.Shotgun` +class. There are a couple of useful attributes to note. + +.. automodule:: shotgun_api3.shotgun + :members: NO_SSL_VALIDATION, LOG + :private-members: + :special-members: + +*************** +Shotgun Methods +*************** + +The majority of functionality is contained within the :class:`~shotgun_api3.Shotgun` class. +The documentation for all of the methods you'll need in your scripts lives in here. + +.. autoclass:: Shotgun + :show-inheritance: + +Connection & Authentication +=========================== + +These methods are used for connecting and authenticating with your Shotgun server. Most of +this is done automatically when you instantiate your instance. But if you need finer-grain +control, these methods are available. + +.. automethod:: Shotgun.connect +.. automethod:: Shotgun.close +.. automethod:: Shotgun.authenticate_human_user +.. automethod:: Shotgun.get_session_token +.. automethod:: Shotgun.set_up_auth_cookie +.. automethod:: Shotgun.add_user_agent +.. automethod:: Shotgun.reset_user_agent +.. automethod:: Shotgun.set_session_uuid +.. automethod:: Shotgun.info + +CRUD Methods +============ + +These are the main methods for creating, reading, updating, and deleting information. There are +also some specialized convenience methods for accessing particular types of information. + +.. automethod:: Shotgun.create +.. automethod:: Shotgun.find +.. automethod:: Shotgun.find_one +.. automethod:: Shotgun.update +.. automethod:: Shotgun.delete +.. automethod:: Shotgun.revive +.. automethod:: Shotgun.batch +.. automethod:: Shotgun.summarize +.. automethod:: Shotgun.note_thread_read +.. automethod:: Shotgun.text_search +.. automethod:: Shotgun.update_project_last_accessed +.. automethod:: Shotgun.work_schedule_read +.. automethod:: Shotgun.work_schedule_update + +Working With Files +================== + +Methods that handle uploading and downloading files including thumbnails. + +.. seealso:: :ref:`attachments` + +.. automethod:: Shotgun.upload +.. automethod:: Shotgun.upload_thumbnail +.. automethod:: Shotgun.upload_filmstrip_thumbnail +.. automethod:: Shotgun.download_attachment +.. automethod:: Shotgun.get_attachment_download_url +.. automethod:: Shotgun.share_thumbnail + +Activity Stream +=============== + +Methods that relate to the activity stream and following of entities in Shotgun. + +.. automethod:: Shotgun.activity_stream_read +.. automethod:: Shotgun.follow +.. automethod:: Shotgun.unfollow +.. automethod:: Shotgun.followers + +Working with the Shotgun Schema +=============================== + +Methods allow you to introspect and modify the Shotgun schema. + +.. automethod:: Shotgun.schema_entity_read +.. automethod:: Shotgun.schema_field_read +.. automethod:: Shotgun.schema_field_create +.. automethod:: Shotgun.schema_field_update +.. automethod:: Shotgun.schema_field_delete +.. automethod:: Shotgun.schema_read +.. automethod:: Shotgun.schema +.. automethod:: Shotgun.entity_types + +********** +Exceptions +********** + +These are the various exceptions that the Shotgun API will raise. + +.. autoclass:: shotgun_api3.ShotgunError + :show-inheritance: + :inherited-members: + :members: + +.. autoclass:: shotgun_api3.ShotgunFileDownloadError + :show-inheritance: + :inherited-members: + :members: + +.. autoclass:: shotgun_api3.Fault + :show-inheritance: + :inherited-members: + :members: + +.. autoclass:: shotgun_api3.AuthenticationFault + :show-inheritance: + :inherited-members: + :members: + +.. autoclass:: shotgun_api3.MissingTwoFactorAuthenticationFault + :show-inheritance: + :inherited-members: + :members: + + +.. _filter_syntax: + +************* +Filter Syntax +************* + +Basic Filters +============= + +Filters are represented as a list of conditions that will be combined using the supplied +filter_operator (``any`` or ``all``). Each condition follows the basic simple form:: + + [, , ] + +Basic Example +------------- +Using the default filter_operator ``"all"``, the following filters will return all Shots whose status +is "ip" AND is linked to Asset #9:: + + filters = [ + ["sg_status_list", "is", "ip"], + ["assets", "is", {"type": "Asset", "id": 9}] + ] + result = sg.find("Shot", filters) + + +Complex Filters +=============== + +.. versionadded::3.0.11 + +Complex filters can be a dictionary that represents a complex sub-condition of the form:: + + {"filter_operator": "any", "filters": []} + +Complex Example +--------------- +Using the default filter_operator ``"all"``, the following filters will return all Shots whose status +is "ip" AND is linked to either Asset #9 OR Asset #23:: + + filters = [ + ["sg_status_list", "is", "ip"], + { + "filter_operator": "any", + "filters": [ + ["assets", "is", {"type": "Asset", "id": 9}], + ["assets", "is", {"type": "Asset", "id": 23}] + ] + } + ] + result = sg.find("Shot", filters) + + +Operators and Arguments +======================= + +:: + + Operator Arguments + -------- --------- + 'is' [field_value] | None + 'is_not' [field_value] | None + 'less_than' [field_value] | None + 'greater_than' [field_value] | None + 'contains' [field_value] | None + 'not_contains' [field_value] | None + 'starts_with' [string] + 'ends_with' [string] + 'between' [[field_value] | None, [field_value] | None] + 'not_between' [[field_value] | None, [field_value] | None] + 'in_last' [[int], 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'YEAR'] + # note that brackets are not literal (eg. ['start_date', 'in_last', 1, 'DAY']) + 'in_next' [[int], 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'YEAR'] + # note that brackets are not literal (eg. ['start_date', 'in_next', 1, 'DAY']) + 'in' [[field_value] | None, ...] # Array of field values + 'type_is' [string] | None # Shotgun entity type + 'type_is_not' [string] | None # Shotgun entity type + 'in_calendar_day' [int] # Offset (e.g. 0 = today, 1 = tomorrow, + # -1 = yesterday) + 'in_calendar_week' [int] # Offset (e.g. 0 = this week, 1 = next week, + # -1 = last week) + 'in_calendar_month' [int] # Offset (e.g. 0 = this month, 1 = next month, + # -1 = last month) + 'name_contains' [string] + 'name_not_contains' [string] + 'name_starts_with' [string] + 'name_ends_with' [string] + + +Valid Operators By Data Type +============================ + +:: + + addressing 'is' + 'is_not' + 'contains' + 'not_contains' + 'in' + 'type_is' + 'type_is_not' + 'name_contains' + 'name_not_contains' + 'name_starts_with' + 'name_ends_with' + + checkbox 'is' + 'is_not' + + currency 'is' + 'is_not' + 'less_than' + 'greater_than' + 'between' + 'not_between' + 'in' + 'not_in' + + date 'is' + 'is_not' + 'greater_than' + 'less_than' + 'in_last' + 'not_in_last' + 'in_next' + 'not_in_next' + 'in_calendar_day' + 'in_calendar_week' + 'in_calendar_month' + 'in_calendar_year' + 'between' + 'in' + 'not_in' + + date_time 'is' + 'is_not' + 'greater_than' + 'less_than' + 'in_last' + 'not_in_last' + 'in_next' + 'not_in_next' + 'in_calendar_day' + 'in_calendar_week' + 'in_calendar_month' + 'in_calendar_year' + 'between' + 'in' + 'not_in' + + duration 'is' + 'is_not' + 'greater_than' + 'less_than' + 'between' + 'in' + 'not_in' + + entity 'is' + 'is_not' + 'type_is' + 'type_is_not' + 'name_contains' + 'name_not_contains' + 'name_is' + 'in' + 'not_in' + + float 'is' + 'is_not' + 'greater_than' + 'less_than' + 'between' + 'in' + 'not_in' + + image 'is' ** Note: For both 'is' and 'is_not', the only supported value is None, + 'is_not' ** which supports detecting the presence or lack of a thumbnail. + + list 'is' + 'is_not' + 'in' + 'not_in' + + multi_entity 'is' ** Note: when used on multi_entity, this functions as + you would expect 'contains' to function + 'is_not' + 'type_is' + 'type_is_not' + 'name_contains' + 'name_not_contains' + 'in' + 'not_in' + + number 'is' + 'is_not' + 'less_than' + 'greater_than' + 'between' + 'not_between' + 'in' + 'not_in' + + password ** Filtering by this data type field not supported + + percent 'is' + 'is_not' + 'greater_than' + 'less_than' + 'between' + 'in' + 'not_in' + + serializable ** Filtering by this data type field not supported + + status_list 'is' + 'is_not' + 'in' + 'not_in' + + summary ** Filtering by this data type field not supported + + + tag_list 'is' ** Note: when used on tag_list, this functions as + you would expect 'contains' to function + 'is_not' + 'name_contains' + 'name_not_contains' + 'name_id' + + text 'is' + 'is_not' + 'contains' + 'not_contains' + 'starts_with' + 'ends_with' + 'in' + 'not_in' + + + timecode 'is' + 'is_not' + 'greater_than' + 'less_than' + 'between' + 'in' + 'not_in' + + url ** Filtering by this data type field is not supported + + +.. _additional_filter_presets: + +Additional Filter Presets +========================= + +As of Shotgun version 7.0 it is possible to also use filter presets. These presets provide a simple +way to specify powerful query filters that would otherwise be costly and difficult to craft using +traditional filters. + +Multiple presets can be specified in cases where it makes sense. + +Also, these presets can be used alongside normal filters. The result returned is an AND operation +between the specified filters. + +Example Uses +------------ + +The following query will return the Version with the name 'ABC' that is linked to the latest entity +created:: + + additional_filter_presets = [ + { + "preset_name": "LATEST", + "latest_by": "ENTITIES_CREATED_AT" + } + ] + + filters = [['code', 'is', 'ABC']] + + result = sg.find('Version', filters = filters, additional_filter_presets = additional_filter_presets) + + +The following query will find all CutItems associated to Cut #1 and return all Versions associated +to the Shot linked to each of these CutItems:: + + additional_filter_presets = [ + { + "preset_name": "CUT_SHOT_VERSIONS", + "cut_id": 1 + } + ] + + result = sg.find('Version', additional_filter_presets = additional_filter_presets) + +Available Filter Presets by Entity Type +--------------------------------------- + +Allowed filter presets (and preset parameter values) depend on the entity type being searched. + +The table bellow gives the details about which filter preset can be used on each entity type and +with which parameters. + +:: + + Entity Type Preset Name Preset Parameters Allowed Preset Parameter Values + ----------- ----------- ----------------- ------------------------------- + Cut LATEST [string] latest_by 'REVISION_NUMBER': + Returns the cuts that have the + highest revision number. + This is typically used with a query + filter that returns cuts with the + same value for a given field + (e.g. code field). This preset + therefore allows to get + the Cut of that set that has + the highest revision_number value. + + Version CUT_SHOT_VERSIONS [int] cut_id Valid Cut entity id. + Returns all Version entities + associated to the Shot entity + associated to the CutItems + of the given Cut. + This basically allows to find all + Versions associated to the given + Cut, via its CutItems. + + LATEST [string] latest_by 'ENTITIES_CREATED_AT': + When dealing with multiple + Versions associated to a group + of entities, returns only the + last Version created for each + entity. + For example, when dealing with a + set of Shots, this preset allows + to find the latest Version created + for each of these Shots. + + 'BY_PIPELINE_STEP_NUMBER_AND_ENTITIES_CREATED_AT': + When dealing with multiple versions + associated to the same entity *and* + to Tasks, returns the Version + associated to the Task with highest + step.list_order. + If multiple Versions are found for + that step.list_order, only the + latest Version is returned. + This allows to isolate the Version + entity that is the farthest along + in the pipeline for a given entity. + For example, when dealing with a Shot + with multiple Versions, this preset + will return the Version associated + to the Task with the highest + step.list_order value. + +.. _data_types: + +********** +Data Types +********** + +addressing +========== + +:value: :obj:`list` + +List of dicts:: + + [ + { + 'type': 'HumanUser' | 'Group', + 'id': int, + ... + }, + ... + ] + +checkbox +======== + +:value: :obj:`bool` (``True`` | ``False``) + +color +===== + +:value: :obj:`str` +:example: ``255,0,0`` | ``pipeline_step`` + +``pipeline_step`` indicates the Task color inherits from the Pipeline Step color. + +currency +======== + +:value: :obj:`float` | :obj:`None` +:range: ``-9999999999999.99``, ``9999999999999.99`` + +date +==== + +:value: :obj:`str` | :obj:`None` +:range: Year must be >= 1970 +:example: ``YYYY-MM-DD`` + +date_time +========= + +:value: :mod:`datetime` | :obj:`None` +:range: Year must be >= 1970 + + .. note:: + Datetimes are stored as UTC on the server. The Shotgun API is configured to automatically + convert between client local time and UTC. This can be overridden. + +duration +======== + +:value: :obj:`int` | :obj:`None` +:range: ``-2147483648``, ``2147483647`` + +Length of time, in minutes + +entity +====== + +:value: :obj:`dict` | :obj:`None` + +:: + + { + 'type': "string", + 'id': int, + ... + } + +float +===== + +:value: :obj:`float` | :obj:`None` +:range: ``-999999999.999999``, ``999999999.999999`` + +footage +======= + +:value: :obj:`str` | :obj:`None` ``FF-ff`` +:range: Frames must be < Preferences value for "Advanced > Number of frames per foot of film" + + .. note:: + Format matches Preference value for "Formatting > Display of footage fields". + Example above is default.F=Feet f=Frames. + +image (read-only) +================= + +:value: :obj:`str` | :obj:`None` + +list +==== + +:value: :obj:`str` | :obj:`None` + +multi_entity +============ + +:value: :obj:`list` + +List of dicts + +:: + + [ + { + 'type': "string", + 'id': int, + ... + }, + ... + ] + +number +====== + +:value: :obj:`int` | ``None`` +:range: ``-2147483648``, ``2147483647`` + +password +======== + +:value: :obj:`string` | ``None`` + +Returned values of password fields are replaced with ``*******`` for security + +percent +======= + +:value: :obj:`int` | ``None`` +:range: ``-2147483648``, ``2147483647`` + +serializable +============ + +:value: :obj:`dict` | ``None`` + +status_list +=========== + +:value: :obj:`str` | ``None`` + +system_task_type (deprecated) +============================= + +:value: :obj:`str` | ``None`` + +tag_list +======== + +:value: :obj:`list` + +text +==== + +:value: :obj:`str` | ``None`` + +timecode +======== + +:value: :obj:`int` | ``None`` +:range: ``-2147483648``, ``2147483647`` + +Length of time, in milliseconds (1000 = 1 second) + +url (file/link field) +===================== + +:value: :obj:`dict` | ``None`` + +:: + + { + 'content_type': "string", + 'link_type': "local" | "url" | "upload", + 'name': "string", + 'url': "string" + } + +Local File Links +---------------- + +Additional keys exist for local file links + +:value: :obj:`dict` | ``None`` + +:: + + { + 'content_type': "string", + 'link_type': "local", + 'local_path': "string" | None, + 'local_path_linux': "string" | None, + 'local_path_mac': "string" | None, + 'local_path_windows': "string" | None, + 'local_storage': {dictionary}, + 'name': "string", + 'url': "string", + } + API versions < v3.0.3: + + { + 'url': "string", + 'name': "string", + 'content_type': "string" + } + +.. _event_types: + +*********** +Event Types +*********** + +Whenever a user makes a change to any data in Shotgun, an event log entry record is created, +capturing the value before and after. Shotgun also logs some additional useful events that help keep +track of various activity on your Shotgun instance. + +Event-based Triggers +==================== + +Events are particularlly useful when used in conjunction with a trigger framework like the +`Shotgun Event Daemon `_. This allows you to +write plug-ins that watch for certain types of events and then run code when they occur. + +Structure of Event Types +======================== + +The basic structure of event types is broken into 3 parts: + +``Application_EntityType_Action`` + +- ``Application``: Is always "Shotgun" for events automatically created by the Shotgun server. + Other Shotgun products may use their name in here, for example, Toolkit has its own events + that it logs and the application portion is identified by "Toolkit". If you decide to use the + EventLogEntry entity to log events for your scripts or tools, you would use your tool name here. +- ``EntityType``: This is the entity type in Shotgun that was acted upon (eg. Shot, Asset, etc.) +- ``Action``: The general action that was taken. (eg. New, Change, Retirement, Revival) + + +Standard Event Types +==================== + +Each entity type has a standard set of events associated with it when it's created, updated, +deleted, and revived. They follow this pattern: + +- ``Shotgun_EntityType_New``: a new entity was created. Example: ``Shotgun_Task_New`` +- ``Shotgun_EntityType_Change``: an entity was modified. Example: ``Shotgun_HumanUser_Change`` +- ``Shotgun_EntityType_Retirement``: an entity was deleted. Example: ``Shotgun_Ticket_Retirement`` +- ``Shotgun_EntityType_Revival``: an entity was revived. Example: ``Shotgun_CustomEntity03_Revival`` + +Additional Event Types +====================== + +These are _some_ of the additional event types that are logged by Shotgun: + +- ``Shotgun_Attachment_View``: an Attachment (file) was viewed by a user. +- ``Shotgun_Reading_Change``: a threaded entity has been marked read or unread. For example, a + Note was read by a user. The readings are unique to the entity<->user connection so when a + Note is read by user "joe" it may still be unread by user "jane". +- ``Shotgun_User_Login``: a user logged in to Shotgun. +- ``Shotgun_User_Logout``: a user logged out of Shotgun. + + +Custom Event Types +================== + +Since ``EventLogEntries`` are entities themselves, you can create them using the API just like any +other entity type. As mentioned previously, if you'd like to have your scripts or tools log to +the Shotgun event log, simply devise a thoughtful naming structure for your event types and +create the EventLogEntry as needed following the usual methods for creating entities via the API. + +Again, other Shotgun products like Toolkit use event logs this way. + +.. note:: + EventLogEntries cannot be updated or deleted (that would defeat the purpose of course). + +Performance +=========== + +Event log database tables can get large very quickly. While Shotgun does very well with event logs +that get into the millions of records, there's an inevitable degradation of performance for pages +that display them in the web application as well as any API queries for events when they get too +big. This volume of events is not the norm, but can be reached if your server expereinces high +usage. + +This **does not** mean your Shotgun server performance will suffer in general, just any pages that +are specifically displaying EventLogEntries in the web application, or API queries on the event +log that are run. We are always looking for ways to improve this in the future. If you have any +immediate concerns, please `reach out to our support team `_ + + diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 6320019fa..d4c472fa0 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ ----------------------------------------------------------------------------- - Copyright (c) 2009-2016, Shotgun Software Inc + Copyright (c) 2009-2016, Shotgun Software Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -61,12 +61,26 @@ mimetypes.add_type('video/mp4', '.mp4') # from some OS/distros LOG = logging.getLogger("shotgun_api3") -LOG.setLevel(logging.WARN) +""" +Logging instance for shotgun_api3 + +Provides a logging instance where log messages are sent during execution. This instance has no +handler associated with it. +.. seealso:: :ref:`logging` +""" +LOG.setLevel(logging.WARN) SG_TIMEZONE = SgTimezone() NO_SSL_VALIDATION = False +""" +Turns off hostname matching validation for SSL certificates + +Sometimes there are cases where certificate validation should be disabled. For example, if you +have a self-signed internal certificate that isn't included in our certificate bundle, you may +not require the added security provided by enforcing this. +""" try: import ssl except ImportError, e: @@ -84,24 +98,33 @@ # Errors class ShotgunError(Exception): - """Base for all Shotgun API Errors""" + """ + Base for all Shotgun API Errors. + """ pass class ShotgunFileDownloadError(ShotgunError): - """Exception for file download-related errors""" + """ + Exception for file download-related errors. + """ pass class Fault(ShotgunError): - """Exception when server side exception detected.""" + """ + Exception when server-side exception detected. + """ pass class AuthenticationFault(Fault): - """Exception when the server side reports an error related to authentication""" + """ + Exception when the server side reports an error related to authentication. + """ pass class MissingTwoFactorAuthenticationFault(Fault): - """Exception when the server side reports an error related to missing - two factor authentication credentials + """ + Exception when the server side reports an error related to missing two-factor authentication + credentials. """ pass @@ -109,23 +132,34 @@ class MissingTwoFactorAuthenticationFault(Fault): # API class ServerCapabilities(object): - """Container for the servers capabilities, such as version and paging. + """ + Container for the servers capabilities, such as version enabled features. + + .. warning:: + + This class is part of the internal API and its interfaces may change at any time in + the future. Therefore, usage of this class is discouraged. """ def __init__(self, host, meta): - """ServerCapabilities.__init__ + """ + ServerCapabilities.__init__ - :param host: Host name for the server excluding protocol. + :param str host: Host name for the server excluding protocol. + :param dict meta: dict of meta data for the server returned from the info() api method. - :param meta: dict of meta data for the server returned from the - info api method. + :ivar str host: + :ivar dict server_info: + :ivar tuple version: Simple version of the Shotgun server. ``(major, minor, rev)`` + :ivar bool is_dev: ``True`` if server is running a development version of the Shotgun + codebase. """ - #Server host name + # Server host name self.host = host self.server_info = meta - #Version from server is major.minor.rev or major.minor.rev."Dev" - #Store version as triple and check dev flag + # Version from server is major.minor.rev or major.minor.rev."Dev" + # Store version as tuple and check dev flag try: self.version = meta.get("version", None) except AttributeError: @@ -146,12 +180,16 @@ def __init__(self, host, meta): def _ensure_support(self, feature, raise_hell=True): - """Checks the server version supports a given feature, raises an - exception if it does not. + """ + Checks the server version supports a given feature, raises an exception if it does not. - :param feature: dict supported version and human label { 'version': (int, int, int), 'label': str } + :param dict feature: dict where **version** key contains a 3 integer tuple indicating the + supported server version and **label** key contains a human-readable label str:: - :raises ShotgunError: The current server version does not [feature] + { 'version': (5, 4, 4), 'label': 'project parameter } + :param bool raise_hell: Whether to raise an exception if the feature is not supported. + Defaults to ``True`` + :raises: :class:`ShotgunError` if the current server version does not support ``feature`` """ if not self.version or self.version < feature['version']: @@ -164,30 +202,37 @@ def _ensure_support(self, feature, raise_hell=True): else: return True - def _ensure_json_supported(self): - """Wrapper for ensure_support""" + """ + Ensures server has support for JSON API endpoint added in v2.4.0. + """ self._ensure_support({ 'version': (2, 4, 0), 'label': 'JSON API' }) def ensure_include_archived_projects(self): - """Wrapper for ensure_support""" + """ + Ensures server has support for archived Projects feature added in v5.3.14. + """ self._ensure_support({ 'version': (5, 3, 14), 'label': 'include_archived_projects parameter' }) def ensure_per_project_customization(self): - """Wrapper for ensure_support""" + """ + Ensures server has support for per-project customization feature added in v5.4.4. + """ return self._ensure_support({ 'version': (5, 4, 4), 'label': 'project parameter' }, True) def ensure_support_for_additional_filter_presets(self): - """Wrapper for ensure_support""" + """ + Ensures server has support for additional filter presets feature added in v7.0.0. + """ return self._ensure_support({ 'version': (7, 0, 0), 'label': 'additional_filter_presets parameter' @@ -198,10 +243,22 @@ def __str__(self): % (self.host, self.version, self.is_dev) class ClientCapabilities(object): - """Container for the client capabilities. + """ + Container for the client capabilities. + + .. warning:: - Detects the current client platform and works out the SG field - used for local data paths. + This class is part of the internal API and its interfaces may change at any time in + the future. Therefore, usage of this class is discouraged. + + :ivar str platform: The current client platform. Valid values are ``mac``, ``linux``, + ``windows``, or ``None`` (if the current platform couldn't be determined). + :ivar str local_path_field: The SG field used for local file paths. This is calculated using + the value of ``platform``. Ex. ``local_path_mac``. + :ivar str py_version: Simple version of Python executable as a string. Eg. ``2.7``. + :ivar str ssl_version: Version of OpenSSL installed. Eg. ``OpenSSL 1.0.2g 1 Mar 2016``. This + info is only available in Python 2.7+ if the ssl module was imported successfully. + Defaults to ``unknown`` """ def __init__(self): @@ -237,7 +294,9 @@ def __str__(self): self.py_version, self.ssl_version) class _Config(object): - """Container for the client configuration.""" + """ + Container for the client configuration. + """ def __init__(self): self.max_rpc_attempts = 3 @@ -281,7 +340,9 @@ def __init__(self): class Shotgun(object): - """Shotgun Client Connection""" + """ + Shotgun Client connection. + """ # reg ex from # http://underground.infovark.com/2008/07/22/iso-date-validation-regex/ @@ -306,62 +367,85 @@ def __init__(self, sudo_as_login=None, session_token=None, auth_token=None): - """Initializes a new instance of the Shotgun client. - - :param base_url: http or https url to the shotgun server. - - :param script_name: name of the client script, used to authenticate - to the server. If script_name is provided, then api_key must be as - well and neither login nor password can be provided. - - :param api_key: key assigned to the client script, used to - authenticate to the server. If api_key is provided, then script_name - must be as well and neither login nor password can be provided. - - :param convert_datetimes_to_utc: If True date time values are - converted from local time to UTC time before been sent to the server. - Datetimes received from the server are converted back to local time. - If False the client should use UTC date time values. - Default is True. - - :param http_proxy: Optional, URL for the http proxy server, on the - form [username:pass@]proxy.com[:8080] - - :param connect: If True, connect to the server. Only used for testing. - - :param ca_certs: Optional path to an external SSL certificates file. By - default, the Shotgun API will use its own built-in certificates file - which stores root certificates for the most common Certificate - Authorities (CAs). If you are using a corporate or internal CA, or are - packaging an application into an executable, it may be necessary to - point to your own certificates file. You can do this by passing in the - full path to the file via this parameter or by setting the environment - variable `SHOTGUN_API_CACERTS`. In the case both are set, this - parameter will take precedence. - - :param login: The login to use to authenticate to the server. If login - is provided, then password must be as well and neither script_name nor - api_key can be provided. - - :param password: The password for the login to use to authenticate to - the server. If password is provided, then login must be as well and - neither script_name nor api_key can be provided. - - :param sudo_as_login: A user login string for the user whose permissions will - be applied to all actions and who will be logged as the user performing - all actions. Note that logged events will have an additional extra meta-data parameter - 'sudo_actual_user' indicating the script or user that actually authenticated. - - :param session_token: The session token to use to authenticate to the server. This - can be used as an alternative to authenticating with a script user or regular user. - You retrieve the session token by running the get_session_token() method. - - :param auth_token: The authentication token required to authenticate to - a server with two factor authentication turned on. If auth_token is provided, - then login and password must be as well and neither script_name nor api_key - can be provided. Note that these tokens can be short lived so a session is - established right away if an auth_token is provided. A - MissingTwoFactorAuthenticationFault will be raised if the auth_token is invalid. + """ + Initializes a new instance of the Shotgun client. + + :param str base_url: http or https url of the Shotgun server. Do not include the trailing + slash:: + + https://example.shotgunstudio.com + :param str script_name: name of the Script entity used to authenticate to the server. + If provided, then ``api_key`` must be as well, and neither ``login`` nor ``password`` + can be provided. + + .. seealso:: :ref:`authentication` + :param str api_key: API key for the provided ``script_name``. Used to authenticate to the + server. If provided, then ``script_name`` must be as well, and neither ``login`` nor + ``password`` can be provided. + + .. seealso:: :ref:`authentication` + :param bool convert_datetimes_to_utc: (optional) When ``True``, datetime values are converted + from local time to UTC time before being sent to the server. Datetimes received from + the server are then converted back to local time. When ``False`` the client should use + UTC date time values. Default is ``True``. + :param str http_proxy: (optional) URL for a proxy server to use for all connections. The + expected str format is ``[username:password@]111.222.333.444[:8080]``. Examples:: + + 192.168.0.1 + 192.168.0.1:8888 + joe:user@192.168.0.1:8888 + :param bool connect: (optional) When ``True``, as soon as the :class:`~shotgun_api3.Shotgun` + instance is created, a connection will be made to the Shotgun server to determine the + server capabilities and confirm this version of the client is compatible with the server + version. This is mostly used for testing. Default is ``True``. + :param str ca_certs: (optional) path to an external SSL certificates file. By default, the + Shotgun API will use its own built-in certificates file which stores root certificates + for the most common Certificate Authorities (CAs). If you are using a corporate or + internal CA, or are packaging an application into an executable, it may be necessary to + point to your own certificates file. You can do this by passing in the full path to the + file via this parameter or by setting the environment variable ``SHOTGUN_API_CACERTS``. + In the case both are set, this parameter will take precedence. + :param str login: The user login str to use to authenticate to the server when using user-based + authentication. If provided, then ``password`` must be as well, and neither + ``script_name`` nor ``api_key`` can be provided. + + .. seealso:: :ref:`authentication` + :param str password: The password str to use to authenticate to the server when using user-based + authentication. If provided, then ``login`` must be as well and neither ``script_name`` + nor ``api_key`` can be provided. + + See :ref:`authentication` for more info. + :param str sudo_as_login: A user login string for the user whose permissions will be applied + to all actions. Event log entries will be generated showing this user performing all + actions with an additional extra meta-data parameter ``sudo_actual_user`` indicating the + script or user that is actually authenticated. + :param str session_token: The session token to use to authenticate to the server. This + can be used as an alternative to authenticating with a script user or regular user. + You can retrieve the session token by running the + :meth:`~shotgun_api3.Shotgun.get_session_token()` method. + + .. todo: Add this info to the Authentication section of the docs + :param str auth_token: The authentication token required to authenticate to a server with + two-factor authentication turned on. If provided, then ``login`` and ``password`` must + be provided as well, and neither ``script_name`` nor ``api_key`` can be provided. + + .. note:: These tokens can be short lived so a session is established right away if an + ``auth_token`` is provided. A + :class:`~shotgun_api3.MissingTwoFactorAuthenticationFault` will be raised if the + ``auth_token`` is invalid. + .. todo: Add this info to the Authentication section of the docs + + .. note:: A note about proxy connections: If you are using Python <= v2.6.2, HTTPS + connections through a proxy server will not work due to a bug in the :mod:`urllib2` + library (see http://bugs.python.org/issue1424152). This will affect upload and + download-related methods in the Shotgun API (eg. :meth:`~shotgun_api3.Shotgun.upload`, + :meth:`~shotgun_api3.Shotgun.upload_thumbnail`, + :meth:`~shotgun_api3.Shotgun.upload_filmstrip_thumbnail`, + :meth:`~shotgun_api3.Shotgun.download_attachment`. Normal CRUD methods for passing JSON + data should still work fine. If you cannot upgrade your Python installation, you can see + the patch merged into Python v2.6.3 (http://hg.python.org/cpython/rev/0f57b30a152f/) and + try and hack it into your installation but YMMV. For older versions of Python there + are other patches that were proposed in the bug report that may help you as well. """ # verify authentication arguments @@ -492,14 +576,30 @@ def __init__(self, @property def server_info(self): - """Returns server information.""" + """ + Property containing server information. + + >>> sg.server_info + {'full_version': [6, 3, 15, 0], + 's3_uploads_enabled': True, + 'version': [6, 3, 15]} + + :returns: dict of server information from :class:`ServerCapabilities` object + :rtype: dict + """ return self.server_caps.server_info @property def server_caps(self): """ - :returns: ServerCapabilities that describe the server the client is - connected to. + Property containing :class:`ServerCapabilities` object. + + >>> sg.server_caps + + + :returns: :class:`ServerCapabilities` object that describe the server the client is + connected to. + :rtype: :class:`ServerCapabilities` object """ if not self._server_caps or ( self._server_caps.host != self.config.server): @@ -508,18 +608,19 @@ def server_caps(self): return self._server_caps def connect(self): - """Forces the client to connect to the server if it is not already - connected. + """ + Connect client to the server if it is not already connected. - NOTE: The client will automatically connect to the server. Only - call this function if you wish to confirm the client can connect. + .. note:: The client will automatically connect to the server on demand. You only need to + call this function if you wish to confirm the client can connect. """ self._get_connection() self.info() return def close(self): - """Closes the current connection to the server. + """ + Close the current connection to the server. If the client needs to connect again it will do so automatically. """ @@ -527,52 +628,61 @@ def close(self): return def info(self): - """Calls the Info function on the Shotgun API to get the server meta. + """ + Get API-related metadata from the Shotgun server. - :returns: dict of the server meta data. + >>> sg.info() + {'s3_uploads_enabled': True, 'full_version': [6, 3, 15, 0], 'version': [6, 3, 15]} + + :returns: dict of the server metadata. + :rtype: dict """ return self._call_rpc("info", None, include_auth_params=False) def find_one(self, entity_type, filters, fields=None, order=None, filter_operator=None, retired_only=False, include_archived_projects=True, additional_filter_presets=None): - """Calls the find() method and returns the first result, or None. - - :param entity_type: Required, entity type (string) to find. - - :param filters: Required, list of filters to apply. - - :param fields: Optional list of fields from the matched entities to - return. Defaults to id. - - :param order: Optional list of fields to order the results by, list - has the form [{'field_name':'foo','direction':'asc or desc'},] - - :param filter_operator: Optional operator to apply to the filters, - supported values are 'all' and 'any'. Defaults to 'all'. - - :param limit: Optional, number of entities to return per page. - Defaults to 0 which returns all entities that match. - - :param page: Optional, page of results to return. By default all - results are returned. Use together with limit. - - :param retired_only: Optional, flag to return only entities that have - been retried. Defaults to False which returns only entities which - have not been retired. - - :param additional_filter_presets: Optional list of presets to - further filter the result set, list has the form: - [{"preset_name": , : , ... }] - - Note that these filters are ANDed together and ANDed with the 'filter' - argument. - - For details on supported presets and the format of this parameter, - please consult the API documentation: - https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax - - :returns: Dictionary of requested Shotgun fields and values. + """ + Shortcut for :meth:`~shotgun_api3.Shotgun.find` with ``limit=1`` so it returns a single + result. + + >>> sg.find_one("Asset", [["id", "is", 32]], ["id", "code", "sg_status_list"]) + {'code': 'Gopher', 'id': 32, 'sg_status_list': 'ip', 'type': 'Asset'} + + :param str entity_type: Shotgun entity type as a string to find. + :param list filters: list of filters to apply to the query. + + .. seealso:: :ref:`filter_syntax` + + :param list fields: Optional list of fields to include in each entity record returned. + Defaults to ``["id"]``. + :param int order: Optional list of fields to order the results by. List has the format:: + + [{'field_name':'foo', 'direction':'asc'}, {'field_name':'bar', 'direction':'desc'}] + + Defaults to sorting by ``id`` in ascending order. + :param str filter_operator: Operator to apply to the filters. Supported values are ``"all"`` + and ``"any"``. These are just another way of defining if the query is an AND or OR + query. Defaults to ``"all"``. + :param bool retired_only: Optional boolean when ``True`` will return only entities that have + been retried. Defaults to ``False`` which returns only entities which have not been + retired. There is no option to return both retired and non-retired entities in the + same query. + :param bool include_archived_projects: Optional boolean flag to include entities whose projects + have been archived. Defaults to ``True``. + :param additional_filter_presets: Optional list of presets to further filter the result + set, list has the form:: + + [{"preset_name": , : , ... }] + + Note that these filters are ANDed together and ANDed with the 'filter' + argument. + + For details on supported presets and the format of this parameter see + :ref:`additional_filter_presets` + :returns: Dictionary representing a single matching entity with the requested fields, + and the defaults ``"id"`` and ``"type"`` which are always included. + :rtype: dict """ results = self.find(entity_type, filters, fields, order, @@ -586,47 +696,90 @@ def find_one(self, entity_type, filters, fields=None, order=None, def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0, include_archived_projects=True, additional_filter_presets=None): - """Find entities matching the given filters. - - :param entity_type: Required, entity type (string) to find. - - :param filters: Required, list of filters to apply. - - :param fields: Optional list of fields from the matched entities to - return. Defaults to id. - - :param order: Optional list of fields to order the results by, list - has the form [{'field_name':'foo','direction':'asc or desc'},] - - :param filter_operator: Optional operator to apply to the filters, - supported values are 'all' and 'any'. Defaults to 'all'. - - :param limit: Optional, number of entities to return per page. - Defaults to 0 which returns all entities that match. - - :param page: Optional, page of results to return. By default all - results are returned. Use together with limit. - - :param retired_only: Optional, flag to return only entities that have - been retried. Defaults to False which returns only entities which - have not been retired. - - :param include_archived_projects: Optional, flag to include entities - whose projects have been archived. - - :param additional_filter_presets: Optional list of presets to - further filter the result set, list has the form: - [{"preset_name": , : , ... }] - - Note that these filters are ANDed together and ANDed with the 'filter' - argument. - - For details on supported presets and the format of this parameter, - please consult the API documentation: - https://github.com/shotgunsoftware/python-api/wiki/Reference%3A-Filter-Syntax - - :returns: list of the dicts for each entity with the requested fields, - and their id and type. + """ + Find entities matching the given filters. + + >>> # Find Character Assets in Sequence 100_FOO + >>> # ------------- + >>> fields = ['id', 'code', 'sg_asset_type'] + >>> sequence_id = 2 # Sequence "100_FOO" + >>> project_id = 4 # Demo Project + >>> filters = [ + ... ['project', 'is', {'type': 'Project', 'id': project_id}], + ... ['sg_asset_type', 'is', 'Character'], + ... ['sequences', 'is', {'type': 'Sequence', 'id': sequence_id}] + ... ] + >>> assets= sg.find("Asset",filters,fields) + [{'code': 'Gopher', 'id': 32, 'sg_asset_type': 'Character', 'type': 'Asset'}, + {'code': 'Cow', 'id': 33, 'sg_asset_type': 'Character', 'type': 'Asset'}, + {'code': 'Bird_1', 'id': 35, 'sg_asset_type': 'Character', 'type': 'Asset'}, + {'code': 'Bird_2', 'id': 36, 'sg_asset_type': 'Character', 'type': 'Asset'}, + {'code': 'Bird_3', 'id': 37, 'sg_asset_type': 'Character', 'type': 'Asset'}, + {'code': 'Raccoon', 'id': 45, 'sg_asset_type': 'Character', 'type': 'Asset'}, + {'code': 'Wet Gopher', 'id': 149, 'sg_asset_type': 'Character', 'type': 'Asset'}] + + You can drill through single entity links to filter on fields or display linked fields. + This is often called "deep linking" or using "dot syntax". + + .. seealso:: :ref:`filter_syntax` + + >>> # Find Versions created by Tasks in the Animation Pipeline Step + >>> # ------------- + >>> fields = ['id', 'code'] + >>> pipeline_step_id = 2 # Animation Step ID + >>> project_id = 4 # Demo Project + >>> # you can drill through single-entity link fields + >>> filters = [ + ... ['project','is', {'type': 'Project','id': project_id}], + ... ['sg_task.Task.step.Step.id', 'is', pipeline_step_id] + >>> ] + >>> sg.find("Version", filters, fields) + [{'code': 'scene_010_anim_v001', 'id': 42, 'type': 'Version'}, + {'code': 'scene_010_anim_v002', 'id': 134, 'type': 'Version'}, + {'code': 'bird_v001', 'id': 137, 'type': 'Version'}, + {'code': 'birdAltBlue_v002', 'id': 236, 'type': 'Version'}] + + :param str entity_type: Shotgun entity type to find. + :param list filters: list of filters to apply to the query. + + .. seealso:: :ref:`filter_syntax` + + :param list fields: Optional list of fields to include in each entity record returned. + Defaults to ``["id"]``. + :param list order: Optional list of dictionaries defining how to order the results of the + query. Each dictionary contains the ``field_name`` to order by and the ``direction`` + to sort:: + + [{'field_name':'foo', 'direction':'asc'}, {'field_name':'bar', 'direction':'desc'}] + + Defaults to sorting by ``id`` in ascending order. + :param str filter_operator: Operator to apply to the filters. Supported values are ``"all"`` + and ``"any"``. These are just another way of defining if the query is an AND or OR + query. Defaults to ``"all"``. + :param int limit: Optional limit to the number of entities to return. Defaults to ``0`` which + returns all entities that match. + :param int page: Optional page of results to return. Use this together with the ``limit`` + parameter to control how your query results are paged. Defaults to ``0`` which returns + the first page of results. + :param bool retired_only: Optional boolean when ``True`` will return only entities that have + been retried. Defaults to ``False`` which returns only entities which have not been + retired. There is no option to return both retired and non-retired entities in the + same query. + :param bool include_archived_projects: Optional boolean flag to include entities whose projects + have been archived. Defaults to ``True``. + :param additional_filter_presets: Optional list of presets to further filter the result + set, list has the form:: + + [{"preset_name": , : , ... }] + + Note that these filters are ANDed together and ANDed with the 'filter' + argument. + + For details on supported presets and the format of this parameter see + :ref:`additional_filter_presets` + :returns: list of dictionaries representing each entity with the requested fields, and the + defaults ``"id"`` and ``"type"`` which are always included. + :rtype: list """ if not isinstance(limit, int) or limit < 0: @@ -638,7 +791,7 @@ def find(self, entity_type, filters, fields=None, order=None, if isinstance(filters, (list, tuple)): filters = _translate_filters(filters, filter_operator) elif filter_operator: - #TODO:Not sure if this test is correct, replicated from prev api + # TODO: Not sure if this test is correct, replicated from prev api raise ShotgunError("Deprecated: Use of filter_operator for find()" " is not valid any more. See the documentation on find()") @@ -739,7 +892,6 @@ def _add_project_param(self, params, project_entity): return params - def summarize(self, entity_type, filters, @@ -747,57 +899,179 @@ def summarize(self, filter_operator=None, grouping=None, include_archived_projects=True): - """Summarize column data returned by a query. - - This provides the same functionality as the summaries in the UI. - You can specify one or more fields to summarize, choose the summary - type for each, and optionally group the results which will return - summary information for each group as well as the total for the query. - - :param entity_type: The entity type to summarize - - :param filters: An array of conditions used to filter the find query. - Uses the same syntax as for example the find() method. - - :param summary_fields: A list of dictionaries with the following keys: - - field: Which field you are summarizing - - type: The type of summary you are performing on the field. - Summary types can be any of [record_count, count, sum, - maximum, minimum, average, earliest, latest, percentage, - status_percentage, status_list, checked, unchecked] - depending on the type of field you're summarizing. - - :param filter_operator: Controls how the filters are matched. - There are only two valid options: all and any. - You cannot currently combine the two options - in the same query. Defaults to "all". - :param grouping: Optional list of dicts with the following keys: - - field: a string indicating the field on entity_type to - group results by. - - type: a string indicating the type of grouping to perform - for each group. Valid types depend on the type of field - you are grouping on and can be one of [exact, tens, hundreds, - thousands, tensofthousands, hundredsofthousands, millions, - day, week, month, quarter, year, clustered_date, oneday, - fivedays, entitytype, firstletter]. - - direction: a string that sets the order to display the - grouped results. Valid direction options are asc (default) - and desc. - - :returns: dict object containing grouping and summaries keys. - - grouping: list of dictionaries containing grouping - information: - - group_name: Display name of the value - that defines the group. - - group_value: Data representation of the value - that defines the group. - - summaries: see summary key - - groups: For nested groups. This structure will be - repeated with the same structure as defined - in the top-level grouping key. - - summaries: Dict of key/value pairs where the key is the - field name and the value is the summary value - requested for that field. + """ + Summarize field data returned by a query. + + This provides the same functionality as the summaries in the UI. You can specify one or + more fields to summarize, choose the summary type for each, and optionally group the + results which will return summary information for each group as well as the total for + the query. + + **Example: Count all Assets for a Project** + + >>> sg.summarize(entity_type='Asset', + ... filters = [['project', 'is', {'type':'Project', 'id':4}]], + ... summary_fields=[{'field':'id', 'type':'count'}]) + {'groups': [], 'summaries': {'id': 15}} + + ``summaries`` contains the total summary for the query. Each key is the field summarized + and the value is the result of the summary operation for the entire result set. + + .. note:: + You cannot perform more than one summary on a field at a time, but you can summarize + several different fields in the same call. + + **Example: Count all Assets for a Project, grouped by sg_asset_type** + + >>> sg.summarize(entity_type='Asset', + ... filters=[['project', 'is', {'type': 'Project', 'id': 4}]], + ... summary_fields=[{'field': 'id', 'type': 'count'}], + ... grouping=[{'field': 'sg_asset_type', 'type': 'exact', 'direction': 'asc'}]) + {'groups': [{'group_name': 'Character','group_value': 'Character', 'summaries': {'id': 3}}, + {'group_name': 'Environment','group_value': 'Environment', 'summaries': {'id': 3}}, + {'group_name': 'Matte Painting', 'group_value': 'Matte Painting', 'summaries': {'id': 1}}, + {'group_name': 'Prop', 'group_value': 'Prop', 'summaries': {'id': 4}}, + {'group_name': 'Vehicle', 'group_value': 'Vehicle', 'summaries': {'id': 4}}], + 'summaries': {'id': 15}} + + - ``summaries`` contains the total summary for the query. + - ``groups`` contains the summary for each group. + + - ``group_name`` is the display name for the group. + - ``group_value`` is the actual value of the grouping value. This is often the same as + ``group_name`` but in the case when grouping by entity, the ``group_name`` may be + ``PuppyA`` and the group_value would be + ``{'type':'Asset','id':922,'name':'PuppyA'}``. + - ``summaries`` contains the summary calculation dict for each field requested. + + **Example: Count all Tasks for a Sequence and find the latest due_date** + + >>> sg.summarize(entity_type='Task', + ... filters = [ + ... ['entity.Shot.sg_sequence', 'is', {'type':'Sequence', 'id':2}], + ... ['sg_status_list', 'is_not', 'na']], + ... summary_fields=[{'field':'id', 'type':'count'}, + ... {'field':'due_date','type':'latest'}]) + {'groups': [], 'summaries': {'due_date': '2013-07-05', 'id': 30}} + + This shows that the there are 30 Tasks for Shots in the Sequence and the latest ``due_date`` + of any Task is ``2013-07-05``. + + **Example: Count all Tasks for a Sequence, find the latest due_date and group by Shot** + + >>> sg.summarize(entity_type='Task', + ... filters = [ + ... ['entity.Shot.sg_sequence', 'is', {'type': 'Sequence', 'id': 2}], + ... ['sg_status_list', 'is_not', 'na']], + ... summary_fields=[{'field': 'id', 'type': 'count'}, {'field': 'due_date', 'type': 'latest'}], + ... grouping=[{'field': 'entity', 'type': 'exact', 'direction': 'asc'}])) + {'groups': [{'group_name': 'shot_010', + 'group_value': {'id': 2, 'name': 'shot_010', 'type': 'Shot', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-06-18', 'id': 10}}, + {'group_name': 'shot_020', + 'group_value': {'id': 3, 'name': 'shot_020', 'type': 'Shot', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-06-28', 'id': 10}}, + {'group_name': 'shot_030', + 'group_value': {'id': 4, 'name': 'shot_030', 'type': 'Shot', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-07-05', 'id': 10}}], + 'summaries': {'due_date': '2013-07-05', 'id': 30}} + + This shows that the there are 30 Tasks for Shots in the Sequence and the latest ``due_date`` + of any Task is ``2013-07-05``. Because the summary is grouped by ``entity``, we can also + see the summaries for each Shot returned. Each Shot has 10 Tasks and the latest ``due_date`` + for each Shot. The difference between ``group_name`` and ``group_value`` is highlighted in + this example as the name of the Shot is different from its value. + + **Example: Count all Tasks for a Sequence, find the latest due_date, group by Shot and + Pipeline Step** + + >>> sg.summarize(entity_type='Task', + ... filters = [ + ... ['entity.Shot.sg_sequence', 'is', {'type': 'Sequence', 'id': 2}], + ... ['sg_status_list', 'is_not', 'na']], + ... summary_fields=[{'field': 'id', 'type': 'count'}, + ... {'field': 'due_date', 'type': 'latest'}], + ... grouping=[{'field': 'entity', 'type': 'exact', 'direction': 'asc'}, + ... {'field': 'step', 'type': 'exact', 'direction': 'asc'}]) + {'groups': [{'group_name': 'shot_010', + 'group_value': {'id': 2, 'name': 'shot_010', 'type': 'Shot', 'valid': 'valid'}, + 'groups': [{'group_name': 'Client', + 'group_value': {'id': 1, 'name': 'Client', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-05-04', 'id': 1}}, + {'group_name': 'Online', + 'group_value': {'id': 2, 'name': 'Online', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-05-05', 'id': 1}}, + ... + ... truncated for brevity + ... + {'group_name': 'Comp', + 'group_value': {'id': 8, 'name': 'Comp', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-06-18', 'id': 1}}], + 'summaries': {'due_date': '2013-06-18', 'id': 10}}, + {'group_name': 'shot_020', + 'group_value': {'id': 3, 'name': 'shot_020', 'type': 'Shot', 'valid': 'valid'}, + 'groups': [{'group_name': 'Client', + 'group_value': {'id': 1, 'name': 'Client', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-05-15', 'id': 1}}, + {'group_name': 'Online', + 'group_value': {'id': 2, 'name': 'Online', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-05-16', 'id': 1}}, + ... + ... truncated for brevity + ... + {'group_name': 'Comp', + 'group_value': {'id': 8, 'name': 'Comp', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-06-28', 'id': 1}}], + 'summaries': {'due_date': '2013-06-28', 'id': 10}}, + {'group_name': 'shot_030', + 'group_value': {'id': 4, 'name': 'shot_030', 'type': 'Shot', 'valid': 'valid'}, + 'groups': [{'group_name': 'Client', + 'group_value': {'id': 1, 'name': 'Client', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-05-20', 'id': 1}}, + {'group_name': 'Online', + 'group_value': {'id': 2, 'name': 'Online', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-05-21', 'id': 1}}, + ... + ... truncated for brevity + ... + {'group_name': 'Comp', + 'group_value': {'id': 8, 'name': 'Comp', 'type': 'Step', 'valid': 'valid'}, + 'summaries': {'due_date': '2013-07-05', 'id': 1}}], + 'summaries': {'due_date': '2013-07-05', 'id': 10}}], + 'summaries': {'due_date': '2013-07-05', 'id': 30}} + + When grouping my more than one field, the grouping structure is repeated for each sub-group + and summary values are returned for each group on each level. + + :param str entity_type: The entity type to summarize + :param list filters: A list of conditions used to filter the find query. Uses the same + syntax as :meth:`~shotgun_api3.Shotgun.find` method. + :param list summary_fields: A list of dictionaries with the following keys: + + :field: The internal Shotgun field name you are summarizing. + :type: The type of summary you are performing on the field. Summary types can be any of + ``record_count``, ``count``, ``sum``, ``maximum``, ``minimum``, ``average``, + ``earliest``, ``latest``, ``percentage``, ``status_percentage``, ``status_list``, + ``checked``, ``unchecked`` depending on the type of field you're summarizing. + + :param str filter_operator: Operator to apply to the filters. Supported values are ``"all"`` + and ``"any"``. These are just another way of defining if the query is an AND or OR + query. Defaults to ``"all"``. + :param list grouping: Optional list of dicts with the following keys: + + :field: a string indicating the internal Shotgun field name on ``entity_type`` to + group results by. + :type: A string indicating the type of grouping to perform for each group. + Valid types depend on the type of field you are grouping on and can be one of + ``exact``, ``tens``, ``hundreds``, ``thousands``, ``tensofthousands``, + ``hundredsofthousands``, ``millions``, ``day``, ``week``, ``month``, + ``quarter``,``year``, ``clustered_date``, ``oneday``, ``fivedays``, + ``entitytype``, ``firstletter``. + :direction: A string that sets the order to display the grouped results. Valid + options are ``asc`` and ``desc``. Defaults to ``asc``. + + :returns: dictionary containing grouping and summaries keys. + :rtype: dict """ if not isinstance(grouping, list) and grouping is not None: @@ -827,16 +1101,34 @@ def summarize(self, return records def create(self, entity_type, data, return_fields=None): - """Create a new entity of the specified entity_type. - - :param entity_type: Required, entity type (string) to create. - - :param data: Required, dict fields to set on the new entity. - - :param return_fields: Optional list of fields from the new entity - to return. Defaults to 'id' field. - - :returns: dict of the requested fields. + """ + Create a new entity of the specified ``entity_type``. + + >>> data = { + ... "project": {"type": "Project", "id": 161}, + ... "sg_sequence": {"type": "Sequence", "id": 109}, + ... "code": "001_100", + ... 'sg_status_list': "ip" + ... } + >>> sg.create('Shot', data) + {'code': '001_100', + 'id': 2557, + 'project': {'id': 161, 'name': 'Pied Piper', 'type': 'Project'}, + 'sg_sequence': {'id': 109, 'name': 'Sequence 001', 'type': 'Sequence'}, + 'sg_status_list': 'ip', + 'type': 'Shot'} + + :param str entity_type: Shotgun entity type to create. + :param dict data: Dictionary of fields and corresponding values to set on the new entity. If + ``image`` or ``filmstrip_image`` fields are provided, the file path will be uploaded + to the server automatically. + :param list return_fields: Optional list of additional field values to return from the new + entity. Defaults to ``id`` field. + :returns: Shotgun entity dictionary containing the field/value pairs of all of the fields + set from the ``data`` parameter as well as the defaults ``type`` and ``id``. If any + additional fields were provided using the ``return_fields`` parameter, these would be + included as well. + :rtype: dict """ data = data.copy() @@ -880,26 +1172,40 @@ def create(self, entity_type, data, return_fields=None): return result def update(self, entity_type, entity_id, data, multi_entity_update_modes=None): - """Updates the specified entity with the supplied data. - - :param entity_type: Required, entity type (string) to update. - - :param entity_id: Required, id of the entity to update. - - :param data: Required, dict fields to update on the entity. - - :param multi_entity_update_modes: Optional, dict of what update mode to - use when updating a multi-entity link field. The keys in the dict are - the fields to set the mode for and the values from the dict are one - of "set", "add", or "remove". The default behavior if mode is not - specified for a field is 'set'. For example, on the 'Sequence' entity, - to append to the 'shots' field and remove from the 'assets' field, you - would specify: - - multi_entity_update_modes={"shots":"add", "assets":"remove"} + """ + Update the specified entity with the supplied data. + + >>> shots = [ + ... {'type':'Shot', 'id':'40435'}, + ... {'type':'Shot', 'id':'40438'}, + ... {'type':'Shot', 'id':'40441'}] + >>> data = { + ... 'shots': shots_asset_is_in, + ... 'sg_status_list':'rev'} + >>> sg.update("Asset", 55, data) + {'type': 'Shot', + 'id': 55, + 'sg_status_`list`': 'rev', + 'shots': [{'id': 40435, 'name': '100_010', 'type': 'Shot', 'valid': 'valid'}, + {'id': 40438, 'name': '100_040', 'type': 'Shot', 'valid': 'valid'}, + {'id': 40441, 'name': '100_070', 'type': 'Shot', 'valid': 'valid'}] + } - :returns: dict of the fields updated, with the entity_type and - id added. + :param str entity_type: Entity type to update. + :param id entity_id: id of the entity to update. + :param dict data: key/value pairs where key is the field name and value is the value to set + for that field. This method does not restrict the updating of fields hidden in the web + UI via the Project Tracking Settings panel. + :param dict multi_entity_update_modes: Optional dict indicating what update mode to use + when updating a multi-entity link field. The keys in the dict are the fields to set + the mode for, and the values from the dict are one of ``set``, ``add``, or ``remove``. + Defaults to ``set``. + :: + + multi_entity_update_modes={"shots": "add", "assets": "remove"} + + :returns: Dictionary of the fields updated, with the default keys `type` and `id` added as well. + :rtype: dict """ data = data.copy() @@ -944,17 +1250,24 @@ def update(self, entity_type, entity_id, data, multi_entity_update_modes=None): return result def delete(self, entity_type, entity_id): - """Retire the specified entity. + """ + Retire the specified entity. - The entity can be brought back to life using the revive function. + Entities in Shotgun are not "deleted" destructively, they are instead, "retired". This + means they are placed in the trash where they are no longer accessible to users. - :param entity_type: Required, entity type (string) to delete. + The entity can be brought back to life using :meth:`~shotgun_api3.Shotgun.revive`. - :param entity_id: Required, id of the entity to delete. + >>> sg.delete("Shot", 2557) + True - :returns: True if the entity was deleted, False otherwise e.g. if the - entity has previously been deleted. - """ + :param str entity_type: Shotgun entity type to delete. + :param id entity_id: ``id`` of the entity to delete. + :returns: ``True`` if the entity was deleted, ``False`` otherwise (for example, if the + entity was already deleted). + :rtype: bool + :raises: :class:`Fault` if entity does not exist (deleted or not). + """ params = { "type" : entity_type, @@ -964,14 +1277,17 @@ def delete(self, entity_type, entity_id): return self._call_rpc("delete", params) def revive(self, entity_type, entity_id): - """Revive an entity that has previously been deleted. - - :param entity_type: Required, entity type (string) to revive. + """ + Revive an entity that has previously been deleted. - :param entity_id: Required, id of the entity to revive. + >>> sg.revive("Shot", 860) + True - :returns: True if the entity was revived, False otherwise e.g. if the - entity has previously been revived (or was not deleted). + :param str entity_type: Shotgun entity type to revive. + :param int entity_id: id of the entity to revive. + :returns: ``True`` if the entity was revived, ``False`` otherwise (e.g. if the + entity is not currently retired). + :rtype: bool """ params = { @@ -982,20 +1298,61 @@ def revive(self, entity_type, entity_id): return self._call_rpc("revive", params) def batch(self, requests): - """Make a batch request of several create, update and delete calls. + """ + Make a batch request of several :meth:`~shotgun_api3.Shotgun.create`, + :meth:`~shotgun_api3.Shotgun.update`, and :meth:`~shotgun_api3.Shotgun.delete` calls. + + All requests are performed within a transaction, so either all will complete or none will. + + Ex. Make a bunch of shots:: + + batch_data = [] + for i in range(1,100): + data = { + "code": "shot_%04d" % i, + "project": project + } + batch_data.append({"request_type": "create", "entity_type": "Shot", "data": data}) + sg.batch(batch_data) + + Example output:: + + [{'code': 'shot_0001', + 'type': 'Shot', + 'id': 3624, + 'project': {'id': 4, 'name': 'Demo Project', 'type': 'Project'}}, + ... + ... and a bunch more ... + ... + {'code': 'shot_0099', + 'type': 'Shot', + 'id': 3722, + 'project': {'id': 4, 'name': 'Demo Project', 'type': 'Project'}}] + + Ex. All three types of requests in one batch:: + + batch_data = [ + {"request_type": "create", "entity_type": "Shot", "data": {"code": "New Shot 1", "project": project}}, + {"request_type": "update", "entity_type": "Shot", "entity_id": 3624, "data": {"code": "Changed 1"}}, + {"request_type": "delete", "entity_type": "Shot", "entity_id": 3624} + ] + sg.batch(batch_data) + + Example output:: - All requests are performed within a transaction, so either all will - complete or none will. + [{'code': 'New Shot 1', 'type': 'Shot', 'id': 3723, 'project': {'id': 4, 'name': 'Demo Project', 'type': 'Project'}}, + {'code': 'Changed 1', 'type': 'Shot', 'id': 3624}, + True] - :param requests: A list of dict's of the form which have a - request_type key and also specifies: - - create: entity_type, data dict of fields to set - - update: entity_type, entity_id, data dict of fields to set, optionally multi_entity_update_modes - - delete: entity_type and entity_id + :param list requests: A list of dict's of the form which have a request_type key and also + specifies: - :returns: A list of values for each operation, create and update - requests return a dict of the fields updated. Delete requests - return True if the entity was deleted. + - create: ``entity_type``, data dict of fields to set + - update: ``entity_type``, ``entity_id``, data dict of fields to set, and optionally ``multi_entity_update_modes`` + - delete: ``entity_type`` and entity_id + :returns: A list of values for each operation. Create and update requests return a dict of + the fields updated. Delete requests return ``True`` if the entity was deleted. + :rtype: list """ if not isinstance(requests, list): @@ -1048,23 +1405,55 @@ def _required_keys(message, required_keys, data): return self._parse_records(records) def work_schedule_read(self, start_date, end_date, project=None, user=None): - """Get the work day rules for a given date range. - - reasons: - STUDIO_WORK_WEEK - STUDIO_EXCEPTION - PROJECT_WORK_WEEK - PROJECT_EXCEPTION - USER_WORK_WEEK - USER_EXCEPTION - - - :param start_date: Start date of date range. - :type start_date: str (YYYY-MM-DD) - :param end_date: End date of date range. - :type end_date: str (YYYY-MM-DD) - :param dict project: Project entity to query WorkDayRules for. (optional) - :param dict user: User entity to query WorkDayRules for. (optional) + """ + Return the work day rules for a given date range. + + .. versionadded:: 3.0.9 + Requires Shotgun server v3.2.0+ + + This returns the defined WorkDayRules between the ``start_date`` and ``end_date`` inclusive + as a dict where the key is the date and the value is another dict describing the rule for + that date. + + Rules are represented by a dict with the following keys: + + :description: the description entered into the work day rule exception if applicable. + :reason: one of six options: + + - STUDIO_WORK_WEEK: standard studio schedule applies + - STUDIO_EXCEPTION: studio-wide exception applies + - PROJECT_WORK_WEEK: standard project schedule applies + - PROJECT_EXCEPTION: project-specific exception applies + - USER_WORK_WEEK: standard user work week applies + - USER_EXCEPTION: user-specific exception applies + + :working: boolean indicating whether it is a "working" day or not. + + >>> sg.work_schedule_read("2015-12-21", "2015-12-25") + {'2015-12-21': {'description': None, + 'reason': 'STUDIO_WORK_WEEK', + 'working': True}, + '2015-12-22': {'description': None, + 'reason': 'STUDIO_WORK_WEEK', + 'working': True}, + '2015-12-23': {'description': None, + 'reason': 'STUDIO_WORK_WEEK', + 'working': True}, + '2015-12-24': {'description': 'Closed for Christmas Eve', + 'reason': 'STUDIO_EXCEPTION', + 'working': False}, + '2015-12-25': {'description': 'Closed for Christmas', + 'reason': 'STUDIO_EXCEPTION', + 'working': False}} + + + :param str start_date: Start date of date range. ``YYYY-MM-DD`` + :param str end_date: End date of date range. ``YYYY-MM-DD`` + :param dict project: Optional Project entity to query `WorkDayRules` for. + :param dict user: Optional HumanUser entity to query WorkDayRules for. + :returns: Complex dict containing each date and the WorkDayRule defined for that date + between the ``start_date`` and ``end date`` inclusive. See above for details. + :rtype: dict """ if not self.server_caps.version or self.server_caps.version < (3, 2, 0): @@ -1083,17 +1472,39 @@ def work_schedule_read(self, start_date, end_date, project=None, user=None): return self._call_rpc('work_schedule_read', params) - def work_schedule_update(self, date, working, description=None, project=None, user=None, recalculate_field=None): - """Update the work schedule for a given date. If neither project nor user are passed the studio work schedule will be updated. - Project and User can only be used separately. - - :param date: Date of WorkDayRule to update. - :type date: str (YYYY-MM-DD) - :param bool working: - :param str description: Reason for time off. (optional) - :param dict project: Project entity to assign to. Cannot be used with user. (optional) - :param dict user: User entity to assign to. Cannot be used with project. (optional) - :param str recalculate_field: Choose the schedule field that will be recalculated on Tasks when they are affected by a change in working schedule. 'due_date' or 'duration', default is a Site Preference (optional) + def work_schedule_update(self, date, working, description=None, project=None, user=None, + recalculate_field=None): + """ + Update the work schedule for a given date. + + .. versionadded:: 3.0.9 + Requires Shotgun server v3.2.0+ + + If neither ``project`` nor ``user`` are passed in, the studio work schedule will be updated. + ``project`` and ``user`` can only be used exclusively of each other. + + >>> sg.work_schedule_update ("2015-12-31", working=False, + ... description="Studio closed for New Years Eve", project=None, + ... user=None, recalculate_field=None) + {'date': '2015-12-31', + 'description': "Studio closed for New Years Eve", + 'project': None, + 'user': None, + 'working': False} + + :param str date: Date of WorkDayRule to update. ``YYY-MM-DD`` + :param bool working: Indicates whether the day is a working day or not. + :param str description: Optional reason for time off. + :param dict project: Optional Project entity to assign the rule to. Cannot be used with the + ``user`` param. + :param dict user: Optional HumanUser entity to assign the rule to. Cannot be used with the + ``project`` param. + :param str recalculate_field: Optional schedule field that will be recalculated on Tasks + when they are affected by a change in working schedule. Options are ``due_date`` or + ``duration``. Defaults to the value set in the Shotgun web application's Site + Preferences. + :returns: dict containing key/value pairs for each value of the work day rule updated. + :rtype: dict """ if not self.server_caps.version or self.server_caps.version < (3, 2, 0): @@ -1115,12 +1526,21 @@ def work_schedule_update(self, date, working, description=None, project=None, us return self._call_rpc('work_schedule_update', params) def follow(self, user, entity): - """Adds the entity to the user's followed entities (or does nothing if the user is already following the entity) - - :param dict user: User entity to follow the entity - :param dict entity: Entity to be followed - - :returns: dict with 'followed'=true, and dicts for the 'user' and 'entity' that were passed in + """ + Add the entity to the user's followed entities. + + If the user is already following the entity, the method will succeed but nothing will be + changed on the server-side. + + >>> sg.follow({"type": "HumanUser", "id": 42}, {"type": "Shot", "id": 2050}) + {'followed': True, 'user': {'type': 'HumanUser', 'id': 42}, + 'entity': {'type': 'Shot', 'id': 2050}} + + :param dict user: User entity that will follow the entity. + :param dict entity: Shotgun entity to be followed. + :returns: dict with ``"followed": True`` as well as key/values for the params that were + passed in. + :rtype: dict """ if not self.server_caps.version or self.server_caps.version < (5, 1, 22): @@ -1135,12 +1555,20 @@ def follow(self, user, entity): return self._call_rpc('follow', params) def unfollow(self, user, entity): - """Removes entity from the user's followed entities (or does nothing if the user is not following the entity) - - :param dict user: User entity to unfollow the entity + """ + Remove entity from the user's followed entities. + + This does nothing if the user is not following the entity. + + >>> sg.unfollow({"type": "HumanUser", "id": 42}, {"type": "Shot", "id": 2050}) + {'entity': {'type': 'Shot', 'id': 2050}, 'user': {'type': 'HumanUser', 'id': 42}, + 'unfollowed': True} + + :param dict user: User entity that will unfollow the entity. :param dict entity: Entity to be unfollowed - - :returns: dict with 'unfollowed'=true, and dicts for the 'user' and 'entity' that were passed in + :returns: dict with ``"unfollowed": True`` as well as key/values for the params that were + passed in. + :rtype: dict """ if not self.server_caps.version or self.server_caps.version < (5, 1, 22): @@ -1155,11 +1583,21 @@ def unfollow(self, user, entity): return self._call_rpc('unfollow', params) def followers(self, entity): - """Gets all followers of the entity. - - :param dict entity: Find all followers of this entity - - :returns list of dicts for all the users following the entity + """ + Return all followers for an entity. + + >>> sg.followers({"type": "Shot", "id": 2050}) + [{'status': 'act', 'valid': 'valid', 'type': 'HumanUser', 'name': 'Richard Hendriks', + 'id': 42}, + {'status': 'act', 'valid': 'valid', 'type': 'HumanUser', 'name': 'Bertram Gilfoyle', + 'id': 33}, + {'status': 'act', 'valid': 'valid', 'type': 'HumanUser', 'name': 'Dinesh Chugtai', + 'id': 57}] + + :param dict entity: Entity to find followers of. + :returns: list of dicts representing each user following the entity + :rtype: list + :versionadded: """ if not self.server_caps.version or self.server_caps.version < (5, 1, 22): @@ -1173,13 +1611,35 @@ def followers(self, entity): return self._call_rpc('followers', params) def schema_entity_read(self, project_entity=None): - """Gets all active entities defined in the schema. - - :param dict project_entity: Optional, if set, each field's visibility is reported accordingly - to the specified project's current visibility settings. - If None, all fields are reported as visible. + """ + Return all active entity types, their display names, and their visibility. + + If the project parameter is specified, the schema visibility for the given project is + being returned. If the project parameter is omitted or set to ``None``, a full listing is + returned where per-project entity type visibility settings are not considered. + + >>> sg.schema_entity_read() + {'ActionMenuItem': {'name': {'editable': False, 'value': 'Action Menu Item'}, + 'visible': {'editable': False, 'value': True}}, + 'ApiUser': {'name': {'editable': False, 'value': 'Script'}, + 'visible': {'editable': False, 'value': True}}, + 'AppWelcomeUserConnection': {'name': {'editable': False, + 'value': 'App Welcome User Connection'}, + 'visible': {'editable': False, 'value': True}}, + 'Asset': {'name': {'editable': False, 'value': 'Asset'}, + 'visible': {'editable': False, 'value': True}}, + 'AssetAssetConnection': {'name': {'editable': False, + 'value': 'Asset Asset Connection'}, + 'visible': {'editable': False, 'value': True}}, + '...' + } + :param dict project_entity: Optional Project entity specifying which project to return + the listing for. If omitted or set to ``None``, per-project visibility settings are + not taken into consideration and the global list is returned. Example: + ``{'type': 'Project', 'id': 3}`` :returns: dict of Entity Type to dict containing the display name. + :rtype: dict """ params = {} @@ -1192,13 +1652,62 @@ def schema_entity_read(self, project_entity=None): return self._call_rpc("schema_entity_read", None) def schema_read(self, project_entity=None): - """Gets the schema for all fields in all entities. - - :param dict project_entity: Optional, if set, each field's visibility is reported accordingly - to the specified project's current visibility settings. - If None, all fields are reported as visible. + """ + Get the schema for all fields on all entities. + + .. note:: + If ``project_entity`` is not specified, everything is reported as visible. + + >>> sg.schema_read() + {'ActionMenuItem': {'created_at': {'data_type': {'editable': False, 'value': 'date_time'}, + 'description': {'editable': True, 'value': ''}, + 'editable': {'editable': False, 'value': False}, + 'entity_type': {'editable': False, 'value': 'ActionMenuItem'}, + 'mandatory': {'editable': False, 'value': False}, + 'name': {'editable': True, 'value': 'Date Created'}, + 'properties': {'default_value': {'editable': False, 'value': None}, + 'summary_default': {'editable': True, 'value': 'none'}}, + 'unique': {'editable': False, 'value': False}, + 'visible': {'editable': False, 'value': True}}, + 'created_by': {'data_type': {'editable': False,'value': 'entity'}, + 'description': {'editable': True,'value': ''}, + 'editable': {'editable': False,'value': False}, + 'entity_type': {'editable': False,'value': 'ActionMenuItem'}, + 'mandatory': {'editable': False,'value': False}, + 'name': {'editable': True,'value': 'Created by'}, + 'properties': {'default_value': {'editable': False,'value': None}, + 'summary_default': {'editable': True,'value': 'none'}, + 'valid_types': {'editable': True,'value': ['HumanUser','ApiUser']}}, + 'unique': {'editable': False,'value': False}, + 'visible': {'editable': False,'value': True}}, + ... + ... + ... + ... + 'Version': {'client_approved': {'data_type': {'editable': False,'value': 'checkbox'}, + 'description': {'editable': True,'value': ''}, + 'editable': {'editable': False,'value': True}, + 'entity_type': {'editable': False,'value': 'Version'}, + 'mandatory': {'editable': False,'value': False}, + 'name': {'editable': True,'value': 'Client Approved'}, + 'properties': {'default_value': {'editable': False,'value': False}, + 'summary_default': {'editable': False,'value': 'none'}}, + 'unique': {'editable': False,'value': False}, + 'visible': {'editable': False,'value': True}}, + ... + ... + ... + ... + } - :returns: nested dicts + :param dict project_entity: Optional, Project entity specifying which project to return + the listing for. If omitted or set to ``None``, per-project visibility settings are + not taken into consideration and the global list is returned. Example: + ``{'type': 'Project', 'id': 3}``. Defaults to ``None``. + :returns: A nested dict object containing a key/value pair for all fields of all entity + types. Properties that are ``'editable': True``, can be updated using the + :meth:`~shotgun_api3.Shotgun.schema_field_update` method. + :rtype: dict """ params = {} @@ -1211,21 +1720,53 @@ def schema_read(self, project_entity=None): return self._call_rpc("schema_read", None) def schema_field_read(self, entity_type, field_name=None, project_entity=None): - """Gets all schema for fields in the specified entity_type or one - field. - - :param entity_type: Required, entity type (string) to get the schema - for. - - :param field_name: Optional, name of the field to get the schema - definition for. If not supplied all fields for the entity type are - returned. - - :param dict project_entity: Optional, if set, each field's visibility is reported accordingly - to the specified project's current visibility settings. - If None, all fields are reported as visible. - - :returns: dict of field name to nested dicts which describe the field + """ + Get schema for all fields on the specified entity type or just the field name specified + if provided. + + .. note:: + Unlike how the results of a :meth:`~shotgun_api3.Shotgun.find` can be pumped into a + :meth:`~shotgun_api3.Shotgun.create` or :meth:`~shotgun_api3.Shotgun.update`, the + results of :meth:`~shotgun_api3.Shotgun.schema_field_read` are not compatible with + the format used for :meth:`~shotgun_api3.Shotgun.schema_field_create` or + :meth:`~shotgun_api3.Shotgun.schema_field_update`. If you need to pipe the results + from :meth:`~shotgun_api3.Shotgun.schema_field_read` into a + :meth:`~shotgun_api3.Shotgun.schema_field_create` or + :meth:`~shotgun_api3.Shotgun.schema_field_update`, you will need to reformat the + data in your script. + + .. note:: + If you don't specify a ``project_entity``, everything is reported as visible. + + >>> sg.schema_field_read('Asset', 'shots') + {'shots': {'data_type': {'editable': False, 'value': 'multi_entity'}, + 'description': {'editable': True, 'value': ''}, + 'editable': {'editable': False, 'value': True}, + 'entity_type': {'editable': False, 'value': 'Asset'}, + 'mandatory': {'editable': False, 'value': False}, + 'name': {'editable': True, 'value': 'Shots'}, + 'properties': {'default_value': {'editable': False, + 'value': None}, + 'summary_default': {'editable': True, + 'value': 'none'}, + 'valid_types': {'editable': True, + 'value': ['Shot']}}, + 'unique': {'editable': False, 'value': False}, + 'visible': {'editable': False, 'value': True}}} + + :param str entity_type: Entity type to get the schema for. + :param str field_name: Optional internal Shotgun name of the field to get the schema + definition for. If this parameter is excluded or set to ``None``, data structures of + all fields will be returned. Defaults to ``None``. Example: ``sg_temp_field``. + :param dict project_entity: Optional Project entity specifying which project to return + the listing for. If omitted or set to ``None``, per-project visibility settings are + not taken into consideration and the global list is returned. Example: + ``{'type': 'Project', 'id': 3}`` + :returns: a nested dict object containing a key/value pair for the ``field_name`` specified + and its properties, or if no field_name is specified, for all the fields of the + ``entity_type``. Properties that are ``'editable': True``, can be updated using the + :meth:`~shotgun_api3.Shotgun.schema_field_update` method. + :rtype: dict """ params = { @@ -1239,20 +1780,30 @@ def schema_field_read(self, entity_type, field_name=None, project_entity=None): return self._call_rpc("schema_field_read", params) - def schema_field_create(self, entity_type, data_type, display_name, - properties=None): - """Creates a field for the specified entity type. - - :param entity_type: Required, entity type (string) to add the field to - - :param data_type: Required, Shotgun data type for the new field. - - :param display_name: Required, display name for the new field. - - :param properties: Optional, dict of properties for the new field. - - :returns: The Shotgun name (string) for the new field, this is - different to the display_name passed in. + def schema_field_create(self, entity_type, data_type, display_name, properties=None): + """ + Create a field for the specified entity type. + + .. note:: + If the internal Shotgun field name computed from the provided ``display_name`` already + exists, the internal Shotgun field name will automatically be appended with ``_1`` in + order to create a unique name. The integer suffix will be incremented by 1 until a + unique name is found. + + >>> properties = {"summary_default": "count", "description": "Complexity breakdown of Asset"} + >>> sg.schema_field_create("Asset", "text", "Complexity", properties) + 'sg_complexity' + + :param str entity_type: Entity type to add the field to. + :param str data_type: Shotgun data type for the new field. + :param str display_name: Specifies the display name of the field you are creating. The + system name will be created from this display name and returned upon successful + creation. + :param dict properties: Dict of valid properties for the new field. Use this to specify + other field properties such as the 'description' or 'summary_default'. + :returns: The internal Shotgun name for the new field, this is different to the + ``display_name`` parameter passed in. + :rtype: str """ params = { @@ -1268,16 +1819,25 @@ def schema_field_create(self, entity_type, data_type, display_name, return self._call_rpc("schema_field_create", params) def schema_field_update(self, entity_type, field_name, properties): - """Updates the specified field definition with the supplied - properties. - - :param entity_type: Required, entity type (string) to add the field to - - :param field_name: Required, Shotgun name of the field to update. - - :param properties: Required, dict of updated properties for the field. - - :returns: True if the field was updated, False otherwise. + """ + Update the properties for the specified field on an entity. + + .. note:: + Although the property name may be the key in a nested dictionary, like + 'summary_default', it is treated no differently than keys that are up + one level, like 'description'. + + >>> properties = {"name": "Test Number Field Renamed", "summary_default": "sum", + ... "description": "this is only a test"} + >>> sg.schema_field_update("Asset", "sg_test_number", properties) + True + + :param entity_type: Entity type of field to update. + :param field_name: Internal Shotgun name of the field to update. + :param properties: Dictionary with key/value pairs where the key is the property to be + updated and the value is the new value. + :returns: ``True`` if the field was updated. + :rtype: bool """ params = { @@ -1292,16 +1852,16 @@ def schema_field_update(self, entity_type, field_name, properties): return self._call_rpc("schema_field_update", params) def schema_field_delete(self, entity_type, field_name): - """Deletes the specified field definition from the entity_type. - - :param entity_type: Required, entity type (string) to delete the field - from. - - :param field_name: Required, Shotgun name of the field to delete. + """ + Delete the specified field from the entity type. - :param properties: Required, dict of updated properties for the field. + >>> sg.schema_field_delete("Asset", "sg_temp_field") + True - :returns: True if the field was updated, False otherwise. + :param str entity_type: Entity type to delete the field from. + :param str field_name: Internal Shotgun name of the field to delete. + :returns: ``True`` if the field was deleted. + :rtype: bool """ params = { @@ -1312,19 +1872,25 @@ def schema_field_delete(self, entity_type, field_name): return self._call_rpc("schema_field_delete", params) def add_user_agent(self, agent): - """Add agent to the user-agent header. + """ + Add agent to the user-agent header. + + Appends agent to the user-agent string sent with every API request. - Append agent to the string passed in as the user-agent to be logged - in events for this API session. + >>> sg.add_user_agent("my_tool 1.0") - :param agent: Required, string to append to user-agent. + :param str agent: string to append to user-agent. """ self._user_agents.append(agent) def reset_user_agent(self): - """Reset user agent to the default. + """ + Reset user agent to the default value. + + Example default user-agent:: + + shotgun-json (3.0.17); Python 2.6 (Mac); ssl OpenSSL 1.0.2d 9 Jul 2015 (validate) - Eg. "shotgun-json (3.0.17); Python 2.6 (Mac); ssl OpenSSL 1.0.2d 9 Jul 2015 (validate)" """ ua_platform = "Unknown" if self.client_caps.platform is not None: @@ -1342,12 +1908,16 @@ def reset_user_agent(self): def set_session_uuid(self, session_uuid): - """Sets the browser session_uuid for this API session. + """ + Set the browser session_uuid in the current Shotgun API instance. + + When this is set, any events generated by the API will include the ``session_uuid`` value + on the corresponding EventLogEntries. If there is a current browser session open with + this ``session_uuid``, the browser will display updates for these events. - Once set events generated by this API session will include the - session_uuid in their EventLogEntries. + >>> sg.set_session_uuid("5a1d49b0-0c69-11e0-a24c-003048d17544") - :param session_uuid: Session UUID to set. + :param str session_uuid: The uuid of the browser session to be updated. """ self.config.session_uuid = session_uuid @@ -1355,38 +1925,44 @@ def set_session_uuid(self, session_uuid): def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, filmstrip_thumbnail=False, **kwargs): - """Associate a thumbnail with more than one Shotgun entity. - - Share the thumbnail from between entities without requiring - uploading the thumbnail file multiple times. You can use this in - two ways: - - 1) Upload an image to set as the thumbnail on multiple entities. + """ + Associate a thumbnail with more than one Shotgun entity. + + .. versionadded:: 3.0.9 + Requires Shotgun server v4.0.0+ + + Share the thumbnail from between entities without requiring uploading the thumbnail file + multiple times. You can use this in two ways: + + 1) Upload an image to set as the thumbnail on multiple entities. 2) Update multiple entities to point to an existing entity's thumbnail. - Please note that when sharing a filmstrip thumbnail, it is required - to have a static thumbnail in place before the filmstrip will - be displayed in the Shotgun web UI. - - :param entities: The entities to update to point to the shared - thumbnail provided in standard hash (dict) format. - Example: [{'type': 'Version', 'id': 123}, - {'type': 'Version', 'id': 456}] - - :param thumbnail_path: Required if source_entity is not provided. - The full path to the local thumbnail file to - upload and share. - - :param source_entity: Required if source_entity is not provided. - The entity whoes thumbnail will be the source - for sharing. Dictionary with type and id. - - :param filmstrip_thumbnail: If True, the filmstrip_thumbnail will be - shared. If False (default), the static - thumbnail will be shared. - - :returns: Id of the Attachment entity that was created for the image - if a thumbnail was uploaded successfully. + .. note:: + When sharing a filmstrip thumbnail, it is required to have a static thumbnail in + place before the filmstrip will be displayed in the Shotgun web UI. + + >>> thumb = '/data/show/ne2/100_110/anim/01.mlk-02b.jpg' + >>> e = [{'type': 'Version', 'id': 123}, {'type': 'Version', 'id': 456}] + >>> sg.share_thumbnail(entities=e, thumbnail_path=thumb) + 4271 + + >>> e = [{'type': 'Version', 'id': 123}, {'type': 'Version', 'id': 456}] + >>> sg.share_thumbnail(entities=e, source_entity={'type':'Version', 'id': 789}) + 4271 + + :param list entities: The entities to update to point to the shared thumbnail provided in + standard entity dict format:: + + [{'type': 'Version', 'id': 123}, + {'type': 'Version', 'id': 456}] + :param str thumbnail_path: The full path to the local thumbnail file to upload and share. + Required if ``source_entity`` is not provided. + :param dict source_entity: The entity whos thumbnail will be the source for sharing. + Required if ``source_entity`` is not provided. + :param bool filmstrip_thumbnail: ``True`` to share the filmstrip thumbnail. ``False`` to + share the static thumbnail. Defaults to ``False``. + :returns: ``id`` of the Attachment entity representing the source thumbnail that is shared. + :rtype: int """ if not self.server_caps.version or self.server_caps.version < (4, 0, 0): raise ShotgunError("Thumbnail sharing support requires server "\ @@ -1471,29 +2047,72 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, return attachment_id def upload_thumbnail(self, entity_type, entity_id, path, **kwargs): - """Convenience function for uploading thumbnails. - - Additional keyword arguments passed to this method will be forwarded - to the upload() method. - - :param entity_type: Entity type of the entity to associate with - :param entity_id: Required, id of the entity to associate with - :param path: Path to file on disk + """ + Upload a file from a local path and assign it as the thumbnail for the specified entity. + + .. note:: + Images will automatically be re-sized on the server to generate a size-appropriate image + file. However, the original file is retained as well and is accessible when you click + on the thumbnail image in the web UI. If you are using a local install of Shotgun and + have not enabled S3, this can eat up disk space if you're uploading really large source + images for your thumbnails. + + You can un-set (aka clear) a thumbnail on an entity using the + :meth:`~shotgun_api3.Shotgun.update` method and setting the **image** field to ``None``. + This will also unset the ``filmstrip_thumbnail`` field if it is set. + + Supported image file types include ``.jpg` and ``.png`` (preferred) but will also accept. + ``.gif```, ``.tif``, ``.tiff``, ``.bmp``, ``.exr``, ``.dpx``, and ``.tga``. + + This method wraps over :meth:`~shotgun_api3.Shotgun.upload`. Additional keyword arguments + passed to this method will be forwarded to the :meth:`~shotgun_api3.Shotgun.upload` method. + + :param str entity_type: Entity type to set the thumbnail for. + :param int entity_id: Id of the entity to set the thumbnail for. + :param str path: Full path to the thumbnail file on disk. :returns: Id of the new attachment """ return self.upload(entity_type, entity_id, path, field_name="thumb_image", **kwargs) def upload_filmstrip_thumbnail(self, entity_type, entity_id, path, **kwargs): - """Convenience function for uploading filmstrip thumbnails. - - Additional keyword arguments passed to this method will be forwarded - to the upload() method. - - :param entity_type: Entity type of the entity to associate with - :param entity_id: Required, id of the entity to associate with - :param path: Path to file on disk - :returns: Id of the new attachment + """ + Upload filmstrip thumbnail to specified entity. + + .. versionadded:: 3.0.9 + Requires Shotgun server v3.1.0+ + + Uploads a file from a local directory and assigns it as the filmstrip thumbnail for the + specified entity. The image must be a horizontal strip of any number of frames that are + exactly 240 pixels wide. Therefore the whole strip must be an exact multiple of 240 pixels + in width. The height can be anything (and will depend on the aspect ratio of the frames). + Any image file type that works for thumbnails will work for filmstrip thumbnails. + + Filmstrip thumbnails will only be visible in the Thumbnail field on an entity if a + regular thumbnail image is also uploaded to the entity. The standard thumbnail is + displayed by default as the poster frame. Then, on hover, the filmstrip thumbnail is + displayed and updated based on your horizontal cursor position for scrubbing. On mouseout, + the default thumbnail is displayed again as the poster frame. + + The url for a filmstrip thumbnail on an entity is available by querying for the + ``filmstrip_image field``. + + You can un-set (aka clear) a thumbnail on an entity using the + :meth:`~shotgun_api3.Shotgun.update` method and setting the **image** field to ``None``. + This will also unset the ``filmstrip_thumbnail`` field if it is set. + + This method wraps over :meth:`~shotgun_api3.Shotgun.upload`. Additional keyword arguments + passed to this method will be forwarded to the :meth:`~shotgun_api3.Shotgun.upload` method. + + >>> filmstrip_thumbnail = '/data/show/ne2/100_110/anim/01.mlk-02b_filmstrip.jpg' + >>> sg.upload_filmstrip_thumbnail("Version", 27, filmstrip_thumbnail) + 87 + + :param str entity_type: Entity type to set the filmstrip thumbnail for. + :param int entity_id: Id of the entity to set the filmstrip thumbnail for. + :param str path: Full path to the filmstrip thumbnail file on disk. + :returns: Id of the new Attachment entity created for the filmstrip thumbnail + :rtype: int """ if not self.server_caps.version or self.server_caps.version < (3, 1, 0): raise ShotgunError("Filmstrip thumbnail support requires server version 3.1 or "\ @@ -1502,26 +2121,29 @@ def upload_filmstrip_thumbnail(self, entity_type, entity_id, path, **kwargs): return self.upload(entity_type, entity_id, path, field_name="filmstrip_thumb_image", **kwargs) - def upload(self, entity_type, entity_id, path, field_name=None, - display_name=None, tag_list=None): - """Upload a file as an attachment/thumbnail to the specified - entity_type and entity_id. - - :param entity_type: Entity type of the entity to associate with - - :param entity_id: Entity id of the entity to associate with - - :param path: Path to file on disk - - :param field_name: the field on the entity to upload to - (ignored if thumbnail) - - :param display_name: the display name to use for the file in the ui - (ignored if thumbnail) - - :param tag_list: comma-separated string of tags to assign to the file - - :returns: Id of the new attachment. + def upload(self, entity_type, entity_id, path, field_name=None, display_name=None, + tag_list=None): + """ + Upload a file to the specified entity. + + Creates an Attachment entity for the file in Shotgun and links it to the specified entity. + You can optionally store the file in a field on the entity, change the display name, and + assign tags to the Attachment. + + >>> mov_file = '/data/show/ne2/100_110/anim/01.mlk-02b.mov' + >>> sg.upload("Shot", 423, mov_file, field_name="sg_latest_quicktime", + ... display_name="Latest QT") + 72 + + :param str entity_type: Entity type to link the upload to. + :param int entity_id: Id of the entity to link the upload to. + :param str path: Full path to file on disk to upload. + :param str field_name: The internal Shotgun field name on the entity to store the file in. + This field must be a File/Link field type. + :param str display_name: The display name to use for the file. Defaults to the file name. + :param str tag_list: comma-separated string of tags to assign to the file. + :returns: Id of the Attachment entity that was created for the image. + :rtype: int """ path = os.path.abspath(os.path.expanduser(path or "")) if not os.path.isfile(path): @@ -1581,34 +2203,40 @@ def upload(self, entity_type, entity_id, path, field_name=None, attachment_id = int(str(result).split(":")[1].split("\n")[0]) return attachment_id - def download_attachment(self, attachment=False, file_path=None, - attachment_id=None): - """Downloads the file associated with a Shotgun Attachment. - - NOTE: On older (< v5.1.0) Shotgun versions, non-downloadable files - on Shotgun don't raise exceptions, they cause a server error which - returns a 200 with the page content. - - :param attachment: (mixed) Usually a dict representing an Attachment. - The dict should have a 'url' key that specifies the download url. - Optionally, the dict can be a standard entity hash format with 'id' and - 'type' keys as long as 'type'=='Attachment'. This is only supported for - backwards compatibility (#22150). - If an int value is passed in, the Attachment with the matching id will - be downloaded from the Shotgun server. + def download_attachment(self, attachment=False, file_path=None, attachment_id=None): + """ + Download the file associated with a Shotgun Attachment. - :param file_path: (str) Optional. If provided, write the data directly - to local disk using the file_path. This avoids loading all of the data - in memory and saves the file locally which is probably what is desired - anyway. + >>> version = sg.find_one("Version", [["id", "is", 7115]], ["sg_uploaded_movie"]) + >>> local_file_path = "/var/tmp/%s" % version["sg_uploaded_movie"]["name"] + >>> sg.download_attachment(version["sg_uploaded_movie"], file_path=local_file_path) + /var/tmp/100b_scene_output_v032.mov - :param attachment_id: (int) Optional. Deprecated in favor of passing in - Attachment hash to attachment param. This attachment_id exists only for - backwards compatibility for scripts specifying the parameter with - keywords. + .. warning:: - :returns: (str) If file_path is None, returns data of the Attachment - file as a string. If file_path is provided, returns file_path. + On older (< v5.1.0) Shotgun versions, non-downloadable files + on Shotgun don't raise exceptions, they cause a server error which + returns a 200 with the page content. + + :param dict attachment: Usually a dictionary representing an Attachment entity. + The dictionary should have a ``url`` key that specifies the download url. + Optionally, the dictionary can be a standard entity hash format with ``id`` and + ``type`` keys as long as ``"type"=="Attachment"``. This is only supported for + backwards compatibility (#22150). + + If an int value is passed in, the Attachment entity with the matching id will + be downloaded from the Shotgun server. + :param str file_path: Optional file path to write the data directly to local disk. This + avoids loading all of the data in memory and saves the file locally at the given path. + :param id attachment_id: (deprecated) Optional ``id`` of the Attachment entity in Shotgun to + download. + + .. note: + This parameter exists only for backwards compatibility for scripts specifying + the parameter with keywords. + :returns: If ``file_path`` is provided, returns the path to the file on disk. If + ``file_path`` is ``None``, returns the actual data of the file as a string. + :rtype: str """ # backwards compatibility when passed via keyword argument if attachment is False: @@ -1658,8 +2286,8 @@ def download_attachment(self, attachment=False, file_path=None, body = e.readlines() if body: xml = ''.join(body) - # Once python 2.4 support is not needed we can think about using elementtree. - # The doc is pretty small so this shouldn't be an issue. + # Once python 2.4 support is not needed we can think about using + # elementtree. The doc is pretty small so this shouldn't be an issue. match = re.search('(.*)', xml) if match: err += ' - %s' % (match.group(1)) @@ -1673,8 +2301,11 @@ def download_attachment(self, attachment=False, file_path=None, return attachment def set_up_auth_cookie(self): - """Sets up urllib2 with a cookie for authentication on the Shotgun - instance. + """ + Set up urllib2 with a cookie for authentication on the Shotgun instance. + + Looks up session token and sets that in a cookie in the :mod:`urllib2` handler. This is + used internally for downloading attachments from the Shotgun server. """ sid = self.get_session_token() cj = cookielib.LWPCookieJar() @@ -1687,21 +2318,27 @@ def set_up_auth_cookie(self): urllib2.install_opener(opener) def get_attachment_download_url(self, attachment): - """Returns the URL for downloading provided Attachment. + """ + Return the URL for downloading provided Attachment. + + :param mixed attachment: Usually a dict representing An Attachment entity in Shotgun to + return the download url for. If the ``url`` key is present, it will be used as-is for + the download url. If the ``url`` key is not present, a url will be constructed pointing + at the current Shotgun server for downloading the Attachment entity using the ``id``. - :param attachment: (mixed) If type is an int, construct url to download - Attachment with id from Shotgun. - If type is a dict, and a url key is present, use that url. - If type is a dict, and url key is not present, check if we have - an id and type keys and the type is 'Attachment' in which case we - construct url to download Attachment with id from Shotgun as if just - the id has been passed in. + If ``None`` is passed in, it is silently ignored in order to avoid raising an error when + results from a :meth:`~shotgun_api3.Shotgun.find` are passed off to + :meth:`~shotgun_api3.Shotgun.download_attachment` - :todo: Support for a standard entity hash should be removed: #22150 + .. note:: + Support for passing in an int representing the Attachment ``id`` is deprecated - :returns: (str) the download URL for the Attachment or None if None was - passed to attachment param. This avoids raising an error when results - from a find() are passed off to a download_attachment() call. + .. todo:: + Support for a standard entity hash should be removed: #22150 + + :returns: the download URL for the Attachment or ``None`` if ``None`` was passed to + ``attachment`` parameter. + :rtype: str """ attachment_id = None if isinstance(attachment, int): @@ -1728,18 +2365,23 @@ def get_attachment_download_url(self, attachment): return url def authenticate_human_user(self, user_login, user_password, auth_token=None): - """Authenticate Shotgun HumanUser. - - Note that HumanUser must be an active account. - - :param user_login: Login name of Shotgun HumanUser - - :param user_password: Password for Shotgun HumanUser - - :param auth_token: One-time token required to authenticate Shotgun HumanUser - when two factor authentication is turned on. - - :return: Dictionary of HumanUser including ID if authenticated, None if unauthorized. + """ + Authenticate Shotgun HumanUser. + + Authenticates a user given the login, password, and optionally, one-time auth token (when + two-factor authentication is required). The user must be a ``HumanUser`` entity and the + account must be active. + + >>> sg.authenticate_human_user("rhendriks", "c0mPre$Hi0n", None) + {"type": "HumanUser", "id": 123, "name": "Richard Hendriks"} + + :param str user_login: Login name of Shotgun HumanUser + :param str user_password: Password for Shotgun HumanUser + :param str auth_token: One-time token required to authenticate Shotgun HumanUser + when two-factor authentication is turned on. + :returns: Standard Shotgun dictionary representing the HumanUser if authentication + succeeded. ``None`` if authentication failed for any reason. + :rtype: dict """ if not user_login: raise ValueError('Please supply a username to authenticate.') @@ -1757,7 +2399,9 @@ def authenticate_human_user(self, user_login, user_password, auth_token=None): self.config.auth_token = auth_token try: - data = self.find_one('HumanUser', [['sg_status_list', 'is', 'act'], ['login', 'is', user_login]], ['id', 'login'], '', 'all') + data = self.find_one('HumanUser', [['sg_status_list', 'is', 'act'], + ['login', 'is', user_login]], + ['id', 'login'], '', 'all') # Set back to default - There finally and except cannot be used together in python2.4 self.config.user_login = original_login self.config.user_password = original_password @@ -1775,15 +2419,27 @@ def authenticate_human_user(self, user_login, user_password, auth_token=None): self.config.auth_token = original_auth_token raise - def update_project_last_accessed(self, project, user=None): - """Update projects last_accessed_by_current_user field. - - :param project: a project entity hash - :param user: A human user entity hash. Optional if either login or sudo_as are used. + """ + Update a Project's ``last_accessed_by_current_user`` field to the current timestamp. + + This helps keep track of the recent Projects each user has worked on and enables scripts + and apps to use this information to display "Recent Projects" for users as a convenience. + + .. versionadded:: + Requires Shotgun v5.3.20+ + + >>> sg.update_project_last_accessed({"type": "Project", "id": 66}, + ... {"type": "HumanUser", "id": 43}) + + :param dict project: Standard Project entity dictionary + :param dict user: Standard user entity dictionary. This is optional if the current API + instance is using user-based authenitcation, or has specified ``sudo_as_login``. In + these cases, if ``user`` is not provided, the ``sudo_as_login`` value or ``login`` + value from the current instance will be used instead. """ if self.server_caps.version and self.server_caps.version < (5, 3, 20): - raise ShotgunError("update_project_last_accessed requires server version 5.3.20 or "\ + raise ShotgunError("update_project_last_accessed requires server version 5.3.20 or " "higher, server is %s" % (self.server_caps.version,)) if not user: @@ -1804,11 +2460,11 @@ def update_project_last_accessed(self, project, user=None): def note_thread_read(self, note_id, entity_fields=None): - """Returns the full conversation for a given note, including - replies and attachments. - - Returns a complex data structure on the following form: - + """ + Return the full conversation for a given note, including Replies and Attachments. + + Returns a complex data structure on the following form:: + [{'content': 'Please add more awesomeness to the color grading.', 'created_at': '2015-07-14 21:33:28 UTC', 'created_by': {'id': 38, @@ -1837,29 +2493,29 @@ def note_thread_read(self, note_id, entity_fields=None): 'valid': 'valid'}}] The list is returned in descending chronological order. - - If you wish to include additional fields beyond the ones that are - returned by default, you can specify these in an entity_fields - dictionary. This dictonary should be keyed by entity type and each - key should contain a list of fields to retrieve, for example: - - { "Note": ["created_by.HumanUser.image", - "addressings_to", - "playlist", + + If you wish to include additional fields beyond the ones that are + returned by default, you can specify these in an entity_fields + dictionary. This dictionary should be keyed by entity type and each + key should contain a list of fields to retrieve, for example:: + + { "Note": ["created_by.HumanUser.image", + "addressings_to", + "playlist", "user" ], - "Reply": ["content"], - "Attachment": ["filmstrip_image", - "local_storage", - "this_file", + "Reply": ["content"], + "Attachment": ["filmstrip_image", + "local_storage", + "this_file", "image"] } - - :param note_id: The id for the note to be retrieved - :param entity_fields: Additional fields to retrieve as part - of the request. See above for details. - - :returns: A list of dictionaries. See above for example. - """ + + :param int note_id: The id for the note to be retrieved + :param dict entity_fields: Additional fields to retrieve as part of the request. + See above for details. + :returns: A list of dictionaries. See above for example. + :rtype: list + """ if self.server_caps.version and self.server_caps.version < (6, 2, 0): raise ShotgunError("note_thread requires server version 6.2.0 or "\ @@ -1878,39 +2534,38 @@ def note_thread_read(self, note_id, entity_fields=None): def text_search(self, text, entity_types, project_ids=None, limit=None): - """Searches across the specified entity types for the given text. - - This method can be used to implement auto completion or a Shotgun - global search. The method requires a text input phrase that is at least - three characters long, or an exception will be raised. - - Several ways to limit the results of the query are available: - - - Using the project_ids parameter, you can provide a list - of project ids to search across. Leaving this at its default - value of None will search across all Shotgun data. - - - You need to define which subset of entity types to search using the - entity_types parameter. Each of these entity types can be associated - with a filter query to further reduce the list of matches. The filter - list is using the standard filter syntax used by for example the - find() method. For example: - - Constrain the search to all shots but character assets only: - { "Asset": [["sg_asset_type", "is", "character"]], - "Shot": [] - } - - A dictionary with keys 'terms' and 'matches' will be returned: - + """ + Search across the specified entity types for the given text. + + This method can be used to implement auto completion or a Shotgun global search. The method + requires a text input phrase that is at least three characters long, or an exception will + be raised. + + Several ways to limit the results of the query are available: + + - Using the ``project_ids`` parameter, you can provide a list of Project ids to search + across. Leaving this at its default value of ``None`` will search across all Shotgun data. + + - You need to define which subset of entity types to search using the ``entity_types`` + parameter. Each of these entity types can be associated with a filter query to further + reduce the list of matches. The filter list is using the standard filter syntax used by + for example the :meth:`~shotgun_api3.Shotgun.find` method. + + **Example: Constrain the search to all Tasks but Character Assets only** + + >>> entity_types = { + ... "Asset": [["sg_asset_type", "is", "Character"]], + ... "Task": [] + ... } + >>> sg.text_search("bunny", entity_types) {'matches': [{'id': 734, 'type': 'Asset', 'name': 'Bunny', - 'project_id': 65, + 'project_id': 65, 'image': 'https://...', 'links': ['', ''], 'status': 'fin'}, - + ... {'id': 558, 'type': 'Task' 'name': 'FX', @@ -1919,21 +2574,21 @@ def text_search(self, text, entity_types, project_ids=None, limit=None): 'links': ['Shot', 'bunny_010_0010'], 'status': 'fin'}], 'terms': ['bunny']} - - The links field will contain information about any linked entity. - This is useful when for example presenting tasks and you want to - display what shot or asset the task is associated with. - - :param text: Text to search for. This must be at least three - characters long, or an exception will be raised. - :param entity_types: Dictionary to specify which entity types to search - across. See above for usage examples. - :param project_ids: List of projects to search. By default, all - projects will be searched. - :param limit: Specify the maximum number of matches to return. - - :returns: A complex dictonary structure, see above for example. - """ + + The links field will contain information about any linked entity. This is useful when, for + example, presenting Tasks and you want to display what Shot or Asset the Task is associated + with. + + :param str text: Text to search for. This must be at least three characters long, or an + exception will be raised. + :param dict entity_types: Dictionary to specify which entity types to search across. See + above for usage examples. + :param list project_ids: List of Projects to search. By default, all projects will be + searched. + :param int limit: Specify the maximum number of matches to return. + :returns: A complex dictionary structure, see above for example. + :rtype: dict + """ if self.server_caps.version and self.server_caps.version < (6, 2, 0): raise ShotgunError("auto_complete requires server version 6.2.0 or "\ "higher, server is %s" % (self.server_caps.version,)) @@ -1965,68 +2620,71 @@ def text_search(self, text, entity_types, project_ids=None, limit=None): return result - def activity_stream_read(self, entity_type, entity_id, entity_fields=None, - min_id=None, max_id=None, limit=None): - """Retrieves activity stream data from Shotgun. - - This data corresponds to the data that is displayed in the + def activity_stream_read(self, entity_type, entity_id, entity_fields=None, min_id=None, + max_id=None, limit=None): + """ + Retrieve activity stream data from Shotgun. + + This data corresponds to the data that is displayed in the Activity tab for an entity in the Shotgun Web UI. - - A complex data structure on the following form will be - returned from Shotgun: - - {'earliest_update_id': 50, - 'entity_id': 65, - 'entity_type': 'Project', - 'latest_update_id': 79, - 'updates': [{'created_at': '2015-07-15 11:06:55 UTC', - 'created_by': {'id': 38, - 'image': '6641', - 'name': 'John Smith', - 'status': 'act', - 'type': 'HumanUser'}, - 'id': 79, - 'meta': {'entity_id': 6004, - 'entity_type': 'Version', - 'type': 'new_entity'}, - 'primary_entity': {'id': 6004, - 'name': 'Review_turntable_v2', - 'status': 'rev', - 'type': 'Version'}, - 'read': False, - 'update_type': 'create'}, - ]} - - The main payload of the return data can be found inside the 'updates' - key, containing a list of dictionaries. This list is always returned - in descending date order. Each item may contain different fields - depending on their update type. The primary_entity key represents the - main Shotgun entity that is associated with the update. By default, - this entity is returned with a set of standard fields. By using the - entity_fields parameter, you can extend the returned data to include - additional fields. If for example you wanted to return the asset type - for all assets and the linked sequence for all Shots, pass the - following entity_fields: - - {"Shot": ["sg_sequence"], "Asset": ["sg_asset_type"]} - - Deep queries can be used in this syntax if you want to + + A complex data structure on the following form will be + returned from Shotgun:: + + {'earliest_update_id': 50, + 'entity_id': 65, + 'entity_type': 'Project', + 'latest_update_id': 79, + 'updates': [{'created_at': '2015-07-15 11:06:55 UTC', + 'created_by': {'id': 38, + 'image': '6641', + 'name': 'John Smith', + 'status': 'act', + 'type': 'HumanUser'}, + 'id': 79, + 'meta': {'entity_id': 6004, + 'entity_type': 'Version', + 'type': 'new_entity'}, + 'primary_entity': {'id': 6004, + 'name': 'Review_turntable_v2', + 'status': 'rev', + 'type': 'Version'}, + 'read': False, + 'update_type': 'create'}, + {...}, + ] + } + + The main payload of the return data can be found inside the 'updates' + key, containing a list of dictionaries. This list is always returned + in descending date order. Each item may contain different fields + depending on their update type. The primary_entity key represents the + main Shotgun entity that is associated with the update. By default, + this entity is returned with a set of standard fields. By using the + entity_fields parameter, you can extend the returned data to include + additional fields. If for example you wanted to return the asset type + for all assets and the linked sequence for all Shots, pass the + following entity_fields:: + + {"Shot": ["sg_sequence"], "Asset": ["sg_asset_type"]} + + Deep queries can be used in this syntax if you want to traverse into connected data. - - :param entity_type: Entity type to retrieve activity stream for - :param entity_id: Entity id to retrieve activity stream for - :param entity_fields: List of additional fields to include. + + :param str entity_type: Entity type to retrieve activity stream for + :param int entity_id: Entity id to retrieve activity stream for + :param list entity_fields: List of additional fields to include. See above for details - :param max_id: Do not retrieve ids greater than this id. + :param int max_id: Do not retrieve ids greater than this id. This is useful when implementing paging. - :param min_id: Do not retrieve ids lesser than this id. - This is useful when implementing caching of - the event stream data and you want to + :param int min_id: Do not retrieve ids lesser than this id. + This is useful when implementing caching of + the event stream data and you want to "top up" an existing cache. - :param limit: Limit the number of returned records. If not specified, + :param int limit: Limit the number of returned records. If not specified, the system default will be used. - - :returns: A complex activity stream data structure. See above for details + :returns: A complex activity stream data structure. See above for details. + :rtype: dict """ if self.server_caps.version and self.server_caps.version < (6, 2, 0): raise ShotgunError("activity_stream requires server version 6.2.0 or "\ @@ -2070,11 +2728,17 @@ def nav_expand(self, path, seed_entity_field=None, entity_fields=None): ) def get_session_token(self): - """Get the session token associated with the current session. - If a session token has already been established, this is returned, - otherwise a new one is generated on the server and returned. - - :returns: String containing a session token + """ + Get the session token associated with the current session. + + If a session token has already been established, this is returned, otherwise a new one is + generated on the server and returned. + + >>> sg.get_session_token() + dd638be7d07c39fa73d935a775558a50 + + :returns: String containing a session token. + :rtype: str """ if self.config.session_token: return self.config.session_token @@ -2088,7 +2752,9 @@ def get_session_token(self): return session_token def _build_opener(self, handler): - """Build urllib2 opener with appropriate proxy handler.""" + """ + Build urllib2 opener with appropriate proxy handler. + """ if self.config.proxy_handler: opener = urllib2.build_opener(self.config.proxy_handler, handler) else: @@ -2096,7 +2762,9 @@ def _build_opener(self, handler): return opener def _turn_off_ssl_validation(self): - """Turn off SSL certificate validation.""" + """ + Turn off SSL certificate validation. + """ global NO_SSL_VALIDATION self.config.no_ssl_validation = True NO_SSL_VALIDATION = True @@ -2107,18 +2775,25 @@ def _turn_off_ssl_validation(self): # Deprecated methods from old wrapper def schema(self, entity_type): + """ + .. deprecated:: 3.0.0 + Use :meth:`~shotgun_api3.Shotgun.schema_field_read` instead. + """ raise ShotgunError("Deprecated: use schema_field_read('type':'%s') " "instead" % entity_type) def entity_types(self): + """ + .. deprecated:: 3.0.0 + Use :meth:`~shotgun_api3.Shotgun.schema_entity_read` instead. + """ raise ShotgunError("Deprecated: use schema_entity_read() instead") # ======================================================================== # RPC Functions def _call_rpc(self, method, params, include_auth_params=True, first=False): - """Calls the specified method on the Shotgun Server sending the - supplied payload. - + """ + Call the specified method on the Shotgun Server sending the supplied payload. """ LOG.debug("Starting rpc call to %s with params %s" % ( @@ -2158,8 +2833,9 @@ def _call_rpc(self, method, params, include_auth_params=True, first=False): return results def _auth_params(self): - """ return a dictionary of the authentication parameters being used. """ - + """ + Return a dictionary of the authentication parameters being used. + """ # Used to authenticate HumanUser credentials if self.config.user_login and self.config.user_password: auth_params = { @@ -2179,9 +2855,9 @@ def _auth_params(self): # Authenticate using session_id elif self.config.session_token: if self.server_caps.version and self.server_caps.version < (5, 3, 0): - raise ShotgunError("Session token based authentication requires server version 5.3.0 or "\ - "higher, server is %s" % (self.server_caps.version,)) - + raise ShotgunError("Session token based authentication requires server version " + "5.3.0 or higher, server is %s" % (self.server_caps.version,)) + auth_params = {"session_token" : str(self.config.session_token)} # Request server side to raise exception for expired sessions. @@ -2219,8 +2895,8 @@ def _sanitize_auth_params(self, params): return sanitized_params def _build_payload(self, method, params, include_auth_params=True): - """Builds the payload to be send to the rpc endpoint. - + """ + Build the payload to be send to the rpc endpoint. """ if not method: raise ValueError("method is empty") @@ -2240,7 +2916,8 @@ def _build_payload(self, method, params, include_auth_params=True): } def _encode_payload(self, payload): - """Encodes the payload to a string to be passed to the rpc endpoint. + """ + Encode the payload to a string to be passed to the rpc endpoint. The payload is json encoded as a unicode string if the content requires it. The unicode string is then encoded as 'utf-8' as it must @@ -2253,7 +2930,10 @@ def _encode_payload(self, payload): return wire def _make_call(self, verb, path, body, headers): - """Makes a HTTP call to the server, handles retry and failure. + """ + Make an HTTP call to the server. + + Handles retry and failure. """ attempt = 0 @@ -2310,7 +2990,8 @@ def _make_call(self, verb, path, body, headers): raise def _http_request(self, verb, path, body, headers): - """Makes the actual HTTP request. + """ + Make the actual HTTP request. """ url = urlparse.urlunparse((self.config.scheme, self.config.server, path, None, None, None)) @@ -2336,11 +3017,11 @@ def _http_request(self, verb, path, body, headers): return (http_status, resp_headers, resp_body) def _parse_http_status(self, status): - """Parse the status returned from the http request. + """ + Parse the status returned from the http request. + :param tuple status: Tuple of (code, reason). :raises: RuntimeError if the http status is non success. - - :param status: Tuple of (code, reason). """ error_code = status[0] errmsg = status[1] @@ -2348,7 +3029,8 @@ def _parse_http_status(self, status): if status[0] >= 300: headers = "HTTP error from server" if status[0] == 503: - errmsg = "Shotgun is currently down for maintenance or too busy to reply. Please try again later." + errmsg = "Shotgun is currently down for maintenance or too busy to reply. Please " \ + "try again later." raise ProtocolError(self.config.server, error_code, errmsg, @@ -2357,16 +3039,16 @@ def _parse_http_status(self, status): return def _decode_response(self, headers, body): - """Decodes the response from the server from the wire format to + """ + Decode the response from the server from the wire format to a python data structure. - :param headers: Headers from the server. - - :param body: Raw response body from the server. - + :param dict headers: Headers from the server. + :param str body: Raw response body from the server. :returns: If the content-type starts with application/json or - text/javascript the body is json decoded. Otherwise the raw body is - returned. + text/javascript the body is json decoded. Otherwise the raw body is + returned. + :rtype: str """ if not body: return body @@ -2381,7 +3063,9 @@ def _json_loads(self, body): return json.loads(body) def _json_loads_ascii(self, body): - """"See http://stackoverflow.com/questions/956867""" + """ + See http://stackoverflow.com/questions/956867 + """ def _decode_list(lst): newlist = [] for i in lst: @@ -2407,7 +3091,8 @@ def _decode_dict(dct): def _response_errors(self, sg_response): - """Raises any API errors specified in the response. + """ + Raise any API errors specified in the response. :raises ShotgunError: If the server response contains an exception. """ @@ -2426,7 +3111,9 @@ def _response_errors(self, sg_response): return def _visit_data(self, data, visitor): - """Walk the data (simple python types) and call the visitor.""" + """ + Walk the data (simple python types) and call the visitor. + """ if not data: return data @@ -2447,8 +3134,8 @@ def _visit_data(self, data, visitor): return visitor(data) def _transform_outbound(self, data): - """Transforms data types or values before they are sent by the - client. + """ + Transform data types or values before they are sent by the client. - changes timezones - converts dates and times to strings @@ -2493,11 +3180,12 @@ def _outbound_visitor(value): return self._visit_data(data, _outbound_visitor) def _transform_inbound(self, data): - """Transforms data types or values after they are received from the - server.""" - #NOTE: The time zone is removed from the time after it is transformed - #to the local time, otherwise it will fail to compare to datetimes - #that do not have a time zone. + """ + Transforms data types or values after they are received from the server. + """ + # NOTE: The time zone is removed from the time after it is transformed + # to the local time, otherwise it will fail to compare to datetimes + # that do not have a time zone. if self.config.convert_datetimes_to_utc: _change_tz = lambda x: x.replace(tzinfo=SG_TIMEZONE.utc)\ .astimezone(SG_TIMEZONE.local) @@ -2525,8 +3213,8 @@ def _inbound_visitor(value): # Connection Functions def _get_connection(self): - """Returns the current connection or creates a new connection to the - current server. + """ + Return the current connection or creates a new connection to the current server. """ if self._connection is not None: return self._connection @@ -2544,7 +3232,9 @@ def _get_connection(self): return self._connection def _close_connection(self): - """Closes the current connection.""" + """ + Close the current connection. + """ if self._connection is None: return @@ -2560,7 +3250,8 @@ def _close_connection(self): # Utility def _parse_records(self, records): - """Parses 'records' returned from the api to do local modifications: + """ + Parse 'records' returned from the api to do local modifications: - Insert thumbnail urls - Insert local file paths. @@ -2609,15 +3300,13 @@ def _parse_records(self, records): return records def _build_thumb_url(self, entity_type, entity_id): - """Returns the URL for the thumbnail of an entity given the - entity type and the entity id. + """ + Return the URL for the thumbnail of an entity given the entity type and the entity id. Note: This makes a call to the server for every thumbnail. :param entity_type: Entity type the id is for. - :param entity_id: id of the entity to get the thumbnail for. - :returns: Fully qualified url to the thumbnail. """ # Example response from the end point @@ -2634,7 +3323,7 @@ def _build_thumb_url(self, entity_type, entity_id): code, thumb_url = body.splitlines() code = int(code) - #code of 0 means error, second line is the error code + # code of 0 means error, second line is the error code if code == 0: raise ShotgunError(thumb_url) @@ -2646,8 +3335,8 @@ def _build_thumb_url(self, entity_type, entity_id): raise RuntimeError("Unknown code %s %s" % (code, thumb_url)) def _dict_to_list(self, d, key_name="field_name", value_name="value", extra_data=None): - """Utility function to convert a dict into a list dicts using the - key_name and value_name keys. + """ + Utility function to convert a dict into a list dicts using the key_name and value_name keys. e.g. d {'foo' : 'bar'} changed to [{'field_name':'foo', 'value':'bar'}] @@ -2663,8 +3352,9 @@ def _dict_to_list(self, d, key_name="field_name", value_name="value", extra_data return ret def _dict_to_extra_data(self, d, key_name="value"): - """Utility function to convert a dict into a dict compatible with the extra_data arg - of _dict_to_list + """ + Utility function to convert a dict into a dict compatible with the extra_data arg + of _dict_to_list. e.g. d {'foo' : 'bar'} changed to {'foo': {"value": 'bar'}] """ @@ -2729,8 +3419,9 @@ def https_request(self, request): def _translate_filters(filters, filter_operator): - """_translate_filters translates filters params into data structure - expected by rpc call.""" + """ + Translate filters params into data structure expected by rpc call. + """ wrapped_filters = { "filter_operator": filter_operator or "all", "filters": filters @@ -2750,8 +3441,9 @@ def _translate_filters_dict(sg_filter): raise ShotgunError("Invalid filter_operator %s" % filter_operator) if not isinstance(sg_filter["filters"], (list,tuple)): - raise ShotgunError("Invalid filters, expected a list or a tuple, got %s" % sg_filter["filters"]) - + raise ShotgunError("Invalid filters, expected a list or a tuple, got %s" + % sg_filter["filters"]) + new_filters["conditions"] = _translate_filters_list(sg_filter["filters"]) return new_filters @@ -2765,8 +3457,9 @@ def _translate_filters_list(filters): elif isinstance(sg_filter, dict): conditions.append(_translate_filters_dict(sg_filter)) else: - raise ShotgunError("Invalid filters, expected a list, tuple or dict, got %s" % sg_filter) - + raise ShotgunError("Invalid filters, expected a list, tuple or dict, got %s" + % sg_filter) + return conditions def _translate_filters_simple(sg_filter): @@ -2784,6 +3477,7 @@ def _translate_filters_simple(sg_filter): return condition def _version_str(version): - """Converts a tuple of int's to a '.' separated str""" + """ + Convert a tuple of int's to a '.' separated str. + """ return '.'.join(map(str, version)) - From c8e94f3247240a2eb515f8c8a4a2f0f95f827d37 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 22 Sep 2016 00:28:25 -0500 Subject: [PATCH 145/389] packaging for v3.0.32 release --- HISTORY.rst | 7 +++++-- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 526ccf752..76c2d94f6 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,11 +4,14 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. -v3.0.32.dev (TBD) -================= +v3.0.32 (2016 Sep 22) +===================== - Optimized import speed of the API on Python 2.7. - Integrated the latest fixes to the ``mimetypes`` module. +- Added ``nav_expand()`` method as an experimental, internal method for querying SG hierarchy. +- Ported all documentation to sphinx. See http://developer.shotgunsoftware.com/python-api. +- Moved Changelog to dedicated HISTORY file. v3.0.31 (2016 May 18) ===================== diff --git a/setup.py b/setup.py index 2743729c6..4ded94651 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.31', + version='3.0.32', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index d4c472fa0..8ab9b6009 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.32.dev" +__version__ = "3.0.32" # ---------------------------------------------------------------------------- # Errors From 4dc25e4499ac61183f800cc194f6a11bfd1432b5 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 22 Sep 2016 00:43:30 -0500 Subject: [PATCH 146/389] bump version to v3.0.33.dev --- HISTORY.rst | 5 +++++ shotgun_api3/shotgun.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 76c2d94f6..d7171eaee 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,11 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.33.dev (TBD) +================= + +- TBD + v3.0.32 (2016 Sep 22) ===================== diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 8ab9b6009..921ebf5ac 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.32" +__version__ = "3.0.33.dev" # ---------------------------------------------------------------------------- # Errors From 1780be8f022959b7c9a68a7f176d64560e971f96 Mon Sep 17 00:00:00 2001 From: KP Date: Thu, 27 Oct 2016 22:30:33 -0500 Subject: [PATCH 147/389] for #39129: catch empty files before uploading() and raise exception It was possible to attempt to upload a zero-byte file which can cause all sorts of issues but most notably it generates a ServerError which is misleading to the user. We now check the file exists and is not empty before calling upload(). If the file is empty, and exception is now raised stating the issue. --- HISTORY.rst | 2 ++ shotgun_api3/shotgun.py | 5 ++++- tests/empty.txt | 0 tests/test_api.py | 21 +++++++++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 tests/empty.txt diff --git a/HISTORY.rst b/HISTORY.rst index d7171eaee..2134d2631 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,8 @@ Here you can see the full list of changes between each Python API release. v3.0.33.dev (TBD) ================= +- Raise an exception when uploading an empty file using :meth:`upload`, :meth:`upload_thumbnail` + or :meth:`upload_filmstrip_thumbnail` before calling out to the server. - TBD v3.0.32 (2016 Sep 22) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 921ebf5ac..7319cae84 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2137,7 +2137,7 @@ def upload(self, entity_type, entity_id, path, field_name=None, display_name=Non :param str entity_type: Entity type to link the upload to. :param int entity_id: Id of the entity to link the upload to. - :param str path: Full path to file on disk to upload. + :param str path: Full path to an existing non-empty file on disk to upload. :param str field_name: The internal Shotgun field name on the entity to store the file in. This field must be a File/Link field type. :param str display_name: The display name to use for the file. Defaults to the file name. @@ -2145,9 +2145,12 @@ def upload(self, entity_type, entity_id, path, field_name=None, display_name=Non :returns: Id of the Attachment entity that was created for the image. :rtype: int """ + # Basic validations of the file to upload. path = os.path.abspath(os.path.expanduser(path or "")) if not os.path.isfile(path): raise ShotgunError("Path must be a valid file, got '%s'" % path) + if os.path.getsize(path) == 0: + raise ShotgunError("Path cannot be an empty file: '%s'" % path) is_thumbnail = (field_name in ["thumb_image", "filmstrip_thumb_image", "image", "filmstrip_image"]) diff --git a/tests/empty.txt b/tests/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_api.py b/tests/test_api.py index 68b681d7b..78870bb60 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1629,6 +1629,27 @@ def test_sanitized_auth_params(self, mock_open): # except above wasn't properly run self.assertTrue(False) + def test_upload_empty_file(self): + """ + Test uploading an empty file raises an error. + """ + this_dir, _ = os.path.split(__file__) + path = os.path.abspath(os.path.expanduser(os.path.join(this_dir,"empty.txt"))) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload, 'Version', 123, path) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_thumbnail, 'Version', 123, path) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_filmstrip_thumbnail, 'Version', + 123, path) + + def test_upload_missing_file(self): + """ + Test uploading an missing file raises an error. + """ + path = "/path/to/nowhere/foo.txt" + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload, 'Version', 123, path) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_thumbnail, 'Version', 123, path) + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_filmstrip_thumbnail, 'Version', + 123, path) + # def test_malformed_response(self): # #TODO ResponseError # pass From 9bdfbd0787676f5a42e674675468a01d8e762404 Mon Sep 17 00:00:00 2001 From: KP Date: Mon, 5 Dec 2016 17:05:55 -0600 Subject: [PATCH 148/389] [docs] Add index of Shotgun() methods - fix Task menu tree * [docs] Fix menu tree for Tasks so it doesn't overflow * [docs] Add index of Shotgun() methods using auto summary --- docs/cookbook/tasks/updating_tasks.rst | 143 ++++++++++++++----------- docs/reference.rst | 79 +++++++++++++- 2 files changed, 156 insertions(+), 66 deletions(-) diff --git a/docs/cookbook/tasks/updating_tasks.rst b/docs/cookbook/tasks/updating_tasks.rst index b7c57a051..445ecdfc6 100644 --- a/docs/cookbook/tasks/updating_tasks.rst +++ b/docs/cookbook/tasks/updating_tasks.rst @@ -45,14 +45,17 @@ will vary. .. note:: The ``duration`` field stores ``duration`` values in minutes -Universal -========= + +---- + +.. rubric:: Universal + Regardless of current values on the Task, this behavior rules:: Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} -Update start_date and due_date -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Update start_date and due_date** + ``duration`` is ignored if also provided. It is instead set automatically as (``due_date`` - ``start_date``) @@ -67,8 +70,7 @@ Update start_date and due_date .. note:: The value provided in the update() is ignored (and in this case was also incorrect). -Update start_date and duration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Update start_date and duration** :: @@ -79,8 +81,7 @@ Update start_date and duration - ``duration`` is updated. - ``due_date`` is updated to (``start_date`` + ``duration``). -Update due_date and duration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Update due_date and duration** :: @@ -93,15 +94,19 @@ Update due_date and duration .. note:: This means the ``duration`` provided is overwritten. -Task has start_date only -======================== + +---- + +.. rubric:: Task has start_date only + +If the Task only has a ``start_date`` value and has no other date values, this is how updates +will behave. :: Task = {'start_date': '2011-05-20', 'due_date': None, 'duration': None, 'id':123} -Update start_date -~~~~~~~~~~~~~~~~~ +**Update start_date** :: @@ -110,8 +115,7 @@ Update start_date - Only ``start_date`` is updated. -Update due_date -~~~~~~~~~~~~~~~ +**Update due_date** :: @@ -121,8 +125,7 @@ Update due_date - ``due_date`` is updated. - ``duration`` is updated to (``due_date`` - ``start_date``). -Update duration -~~~~~~~~~~~~~~~ +**Update duration** :: @@ -132,15 +135,19 @@ Update duration - ``duration`` is updated. - ``due_date`` is set to (``start_date`` + ``duration``) -Task has due_date only -====================== + +---- + +.. rubric:: Task has due_date only + +If the Task only has a ``due_date`` value and has no other date values, this is how updates +will behave. :: # Task = {'start_date': None, 'due_date': '2011-05-25', 'duration': None, 'id':123} -Update start_date -~~~~~~~~~~~~~~~~~ +**Update start_date** :: @@ -150,8 +157,7 @@ Update start_date - ``start_date`` is updated. - ``duration`` is updated to (``due_date`` - ``start_date``). -Update due_date -~~~~~~~~~~~~~~~ +**Update due_date** :: @@ -160,8 +166,7 @@ Update due_date - only ``due_date`` is updated. -Update duration -~~~~~~~~~~~~~~~ +**Update duration** :: @@ -171,15 +176,19 @@ Update duration - ``duration`` is updated. - ``start_date`` is set to (``due_date`` - ``duration``) -Task has duration only -====================== + +---- + +.. rubric:: Task has duration only + +If the Task only has a ``duration`` value and has no other date values, this is how updates +will behave. :: # Task = {'start_date': None, 'due_date': None, 'duration': 2400, 'id':123} -Update start_date -~~~~~~~~~~~~~~~~~ +**Update start_date** :: @@ -189,8 +198,7 @@ Update start_date - ``start_date`` is updated. - ``due_date`` is updated to (``start_date`` + ``duration``). -Update due_date -~~~~~~~~~~~~~~~ +**Update due_date** :: @@ -200,8 +208,7 @@ Update due_date - ``due_date`` is updated. - ``start_date`` is updated to (``due_date`` - ``duration``) -Update duration -~~~~~~~~~~~~~~~ +**Update duration** :: @@ -210,15 +217,19 @@ Update duration - only ``duration`` is updated. -Task has start_date and due_date (no duration) -============================================== + +---- + +.. rubric:: Task has start_date and due_date + +If the Task has ``start_date`` and ``due_date`` values but has no ``duration``, this is how updates +will behave. :: # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': None, 'id':123} -Update start_date -~~~~~~~~~~~~~~~~~ +**Update start_date** :: @@ -228,8 +239,7 @@ Update start_date - ``start_date`` is updated. - ``duration`` is updated to (``due_date`` - ``start_date``). -Update due_date -~~~~~~~~~~~~~~~ +**Update due_date** :: @@ -239,8 +249,7 @@ Update due_date - ``due_date`` is updated. - ``duration`` is updated to (``due_date`` - ``start_date``) -Update duration -~~~~~~~~~~~~~~~ +**Update duration** :: @@ -250,15 +259,19 @@ Update duration - ``duration`` is updated. - ``due_date`` is updated to (``start_date`` + ``duration``) -Task has start_date and duration (no due_date) -============================================== + +---- + +.. rubric:: Task has start_date and duration + +If the Task has ``start_date`` and ``duration`` values but has no ``due_date``, this is how updates +will behave. :: # Task = {'start_date': '2011-05-20', 'due_date': None, 'duration': 2400, 'id':123} -Update start_date -~~~~~~~~~~~~~~~~~ +**Update start_date** :: @@ -268,8 +281,7 @@ Update start_date - ``start_date`` is updated. - ``due_date`` is updated to (``start_date`` +``duration``). -Update due_date -~~~~~~~~~~~~~~~ +**Update due_date** :: @@ -279,8 +291,7 @@ Update due_date - ``due_date`` is updated. - ``duration`` is updated to (``due_date`` - ``start_date``). -Update duration -~~~~~~~~~~~~~~~ +**Update duration** :: @@ -290,15 +301,19 @@ Update duration - ``duration`` is updated. - ``due_date`` is updated to (``start_date`` + ``duration``) -Task has due_date and duration (no start_date) -============================================== + +---- + +.. rubric:: Task has due_date and duration + +If the Task has ``due_date`` and ``duration`` values but has no ``start_date``, this is how updates +will behave. :: # Task = {'start_date': None, 'due_date': '2011-05-25', 'duration': 2400, 'id':123} -Update start_date -~~~~~~~~~~~~~~~~~ +**Update start_date** :: @@ -308,8 +323,7 @@ Update start_date - ``start_date`` is updated. - ``due_date`` is updated to (``start_date`` + ``duration``). -Update due_date -~~~~~~~~~~~~~~~ +**Update due_date** :: @@ -319,8 +333,7 @@ Update due_date - ``due_date`` is updated. - ``start_date`` is updated to (``due_date`` - ``duration``). -Update duration -~~~~~~~~~~~~~~~ +**Update duration** :: @@ -330,15 +343,19 @@ Update duration - ``duration`` is updated. - ``start_date`` is updated to (``due_date`` - ``duration``) -Task has start_date ,due_date, and duration -=========================================== + +---- + +.. rubric:: Task has start_date ,due_date, and duration + +If the Task has ``start_date``, ``due_date``, and ``duration``, this is how updates +will behave. :: # Task = {'start_date': '2011-05-20', 'due_date': '2011-05-25', 'duration': 2400, 'id':123} -Update start_date -~~~~~~~~~~~~~~~~~ +**Update start_date** :: @@ -348,8 +365,7 @@ Update start_date - ``start_date`` is updated. - ``due_date`` is updated to (``start_date`` + ``duration``). -Update due_date -~~~~~~~~~~~~~~~ +**Update due_date** :: @@ -359,8 +375,7 @@ Update due_date - ``due_date`` is updated. - ``duration`` is updated to (``due_date`` - ``start_date``) -Update duration -~~~~~~~~~~~~~~~ +**Update duration** :: diff --git a/docs/reference.rst b/docs/reference.rst index d6456af2e..39a97abce 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -19,6 +19,13 @@ class. There are a couple of useful attributes to note. :private-members: :special-members: +*************** +Shotgun() +*************** + +.. autoclass:: Shotgun + :show-inheritance: + *************** Shotgun Methods *************** @@ -26,8 +33,76 @@ Shotgun Methods The majority of functionality is contained within the :class:`~shotgun_api3.Shotgun` class. The documentation for all of the methods you'll need in your scripts lives in here. -.. autoclass:: Shotgun - :show-inheritance: +.. rubric:: Connection & Authentication + +.. autosummary:: + :nosignatures: + + Shotgun.connect + Shotgun.close + Shotgun.authenticate_human_user + Shotgun.get_session_token + Shotgun.set_up_auth_cookie + Shotgun.add_user_agent + Shotgun.reset_user_agent + Shotgun.set_session_uuid + Shotgun.info + +.. rubric:: CRUD Methods + +.. autosummary:: + :nosignatures: + + Shotgun.create + Shotgun.find + Shotgun.find_one + Shotgun.update + Shotgun.delete + Shotgun.revive + Shotgun.batch + Shotgun.summarize + Shotgun.note_thread_read + Shotgun.text_search + Shotgun.update_project_last_accessed + Shotgun.work_schedule_read + Shotgun.work_schedule_update + +.. rubric:: Working With Files + +.. autosummary:: + :nosignatures: + + Shotgun.upload + Shotgun.upload_thumbnail + Shotgun.upload_filmstrip_thumbnail + Shotgun.download_attachment + Shotgun.get_attachment_download_url + Shotgun.share_thumbnail + +.. rubric:: Activity Stream + +.. autosummary:: + :nosignatures: + + Shotgun.activity_stream_read + Shotgun.follow + Shotgun.unfollow + Shotgun.followers + +.. rubric:: Working with the Shotgun Schema + +.. autosummary:: + :nosignatures: + + Shotgun.schema_entity_read + Shotgun.schema_field_read + Shotgun.schema_field_create + Shotgun.schema_field_update + Shotgun.schema_field_delete + Shotgun.schema_read + Shotgun.schema + Shotgun.entity_types + Connection & Authentication =========================== From 1f7b5413d5169cdb1afa9df2310f9626853babb3 Mon Sep 17 00:00:00 2001 From: dallum Date: Wed, 11 Jan 2017 16:52:26 +0000 Subject: [PATCH 149/389] Copyright update Updated year --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 7319cae84..3442e8c29 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ ----------------------------------------------------------------------------- - Copyright (c) 2009-2016, Shotgun Software Inc. + Copyright (c) 2009-2017, Shotgun Software Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From 33985c6603690371822a5670c3fed060ed34e8c4 Mon Sep 17 00:00:00 2001 From: Jordi Riera Date: Thu, 12 Jan 2017 12:27:46 -0500 Subject: [PATCH 150/389] Adds support for list and status_list fields. Thanks for the fine people of RodeoFX for this contribution. --- shotgun_api3/lib/mockgun.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shotgun_api3/lib/mockgun.py b/shotgun_api3/lib/mockgun.py index 5197b19fc..37bed9e0f 100644 --- a/shotgun_api3/lib/mockgun.py +++ b/shotgun_api3/lib/mockgun.py @@ -526,6 +526,8 @@ def _validate_entity_data(self, entity_type, data): "serializable": dict, "date": datetime.date, "date_time": datetime.datetime, + "list": basestring, + "status_list": basestring, "url": dict}[sg_type] except KeyError: raise ShotgunError("Field %s.%s: Handling for Shotgun type %s is not implemented" % (entity_type, field, sg_type)) @@ -587,7 +589,7 @@ def _compare(self, field_type, lval, operator, rval): return lval < rval[0] or lval > rval[1] elif operator == "in": return lval in rval - elif field_type == "list": + elif field_type in ("list", "status_list"): if operator == "is": return lval == rval elif operator == "is_not": From a347a3b385953d93f361519ca707774f903e0c73 Mon Sep 17 00:00:00 2001 From: KP Date: Fri, 20 Jan 2017 09:34:00 -0600 Subject: [PATCH 151/389] Update README.md fix typo in Tutorial url. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a55c42bad..18d631150 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Tutorials and detailed documentation about the Python API are available at http: Some useful direct links: * [Installing](http://developer.shotgunsoftware.com/python-api/installation.html) -* [Tutorials](http://developer.shotgunsoftware.com/python-api/cookbok/tutorials.html) +* [Tutorials](http://developer.shotgunsoftware.com/python-api/cookbook/tutorials.html) * [API Reference](http://developer.shotgunsoftware.com/python-api/reference.html) * [Data Types](http://developer.shotgunsoftware.com/python-api/reference.html#data-types) * [Filter Syntax](http://developer.shotgunsoftware.com/python-api/reference.html#filter-syntax) From 4afcdd6cfb597b6a8d4bf6f184c00139c6e9d382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 7 Feb 2017 14:45:43 -0500 Subject: [PATCH 152/389] For #40713, add support for filter_operator syntax in Mockgun. find queries in Mockgun can now use the filter_operator syntax to specify boolean operations. Closes https://github.com/shotgunsoftware/python-api/pull/130/ --- shotgun_api3/lib/mockgun.py | 122 +- tests/mockgun/schema.pickle | 98684 +++++++++++++++++++++++++++ tests/mockgun/schema_entity.pickle | 1003 + tests/test_mockgun.py | 264 + 4 files changed, 100035 insertions(+), 38 deletions(-) create mode 100644 tests/mockgun/schema.pickle create mode 100644 tests/mockgun/schema_entity.pickle create mode 100644 tests/test_mockgun.py diff --git a/shotgun_api3/lib/mockgun.py b/shotgun_api3/lib/mockgun.py index 37bed9e0f..ae404bc79 100644 --- a/shotgun_api3/lib/mockgun.py +++ b/shotgun_api3/lib/mockgun.py @@ -1,6 +1,6 @@ """ ----------------------------------------------------------------------------- - Copyright (c) 2009-2015, Shotgun Software Inc + Copyright (c) 2009-2017, Shotgun Software Inc Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -305,6 +305,8 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No # do not validate custom fields - this makes it hard to mock up a field quickly #self._validate_entity_fields(entity_type, fields) + # FIXME: This should be refactored so that we can use the complex filer + # style in nested filter operations. if isinstance(filters, dict): # complex filter style! # {'conditions': [{'path': 'id', 'relation': 'is', 'values': [1]}], 'logical_operator': 'and'} @@ -328,24 +330,13 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No # traditiona style sg filters resolved_filters = filters - # now translate ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] - resolved_filters_2 = [] - for f in resolved_filters: - - if len(f) > 3: - # ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] - new_filter = [ f[0], f[1], f[2:] ] - - elif f[1] == "in" and not isinstance(f[2], list): - # ["field", "in", 2] --> ["field", "in", [2]] - new_filter = [ f[0], f[1], [ f[2] ] ] - - else: - new_filter = f - - resolved_filters_2.append(new_filter) - - results = [row for row in self._db[entity_type].values() if self._row_matches_filters(entity_type, row, resolved_filters_2, filter_operator, retired_only)] + results = [ + # Apply the filters for every single entities for the given entity type. + row for row in self._db[entity_type].values() + if self._row_matches_filters( + entity_type, row, resolved_filters, filter_operator, retired_only + ) + ] # handle the ordering of the recordset if order: @@ -690,36 +681,91 @@ def _get_field_type(self, entity_type, field): except ValueError: return self._schema[entity_type][field]["data_type"]["value"] - def _row_matches_filter(self, entity_type, row, filter): - - + def _row_matches_filter(self, entity_type, row, sg_filter, retired_only): + try: - field, operator, rval = filter + field, operator, rval = sg_filter except ValueError: raise ShotgunError("Filters must be in the form [lval, operator, rval]") - lval = self._get_field_from_row(entity_type, row, field) - - field_type = self._get_field_type(entity_type, field) - - # if we're operating on an entity, we'll need to grab the name from the lval's row - if field_type == "entity": - lval_row = self._db[lval["type"]][lval["id"]] - if "name" in lval_row: - lval["name"] = lval_row["name"] - elif "code" in lval_row: - lval["name"] = lval_row["code"] - return self._compare(field_type, lval, operator, rval) + + # Special case, field is None when we have a filter operator. + if field is None: + if operator in ["any", "all"]: + return self._row_matches_filters(entity_type, row, rval, operator, retired_only) + else: + raise ShotgunError("Unknown filter_operator type: %s" % operator) + else: + lval = self._get_field_from_row(entity_type, row, field) + + field_type = self._get_field_type(entity_type, field) + + # if we're operating on an entity, we'll need to grab the name from the lval's row + if field_type == "entity": + lval_row = self._db[lval["type"]][lval["id"]] + if "name" in lval_row: + lval["name"] = lval_row["name"] + elif "code" in lval_row: + lval["name"] = lval_row["code"] + return self._compare(field_type, lval, operator, rval) + + def _rearrange_filters(self, filters): + """ + Modifies the filter syntax to turn it into a list of three items regardless + of the actual filter. Most of the filters are list of three elements, so this doesn't change much. + + The filter_operator syntax uses a dictionary with two keys, "filters" and + "filter_operator". Filters using this syntax will be turned into + [None, filter["filter_operator"], filter["filters"]] + + Filters of the form [field, operator, values....] will be turned into + [field, operator, [values...]]. + + :param list filters: List of filters to rearrange. + + :returns: A list of three items. + """ + rearranged_filters = [] + + # now translate ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] + for f in filters: + if isinstance(f, list): + if len(f) > 3: + # ["field", "in", 2,3,4] --> ["field", "in", [2, 3, 4]] + new_filter = [f[0], f[1], f[2:]] + + elif f[1] == "in" and not isinstance(f[2], list): + # ["field", "in", 2] --> ["field", "in", [2]] + new_filter = [f[0], f[1], [f[2]]] + + else: + new_filter = f + elif isinstance(f, dict): + if "filter_operator" not in f or "filters" not in f: + raise ShotgunError( + "Bad filter operator, requires keys 'filter_operator' and 'filters', " + "found %s" % ", ".join(f.keys()) + ) + new_filter = [None, f["filter_operator"], f["filters"]] + else: + raise ShotgunError( + "Filters can only be lists or dictionaries, not %s." % type(f).__name__ + ) + + rearranged_filters.append(new_filter) + + return rearranged_filters def _row_matches_filters(self, entity_type, row, filters, filter_operator, retired_only): - + filters = self._rearrange_filters(filters) + if retired_only and not row["__retired"] or not retired_only and row["__retired"]: # ignore retired rows unless the retired_only flag is set # ignore live rows if the retired_only flag is set return False elif filter_operator in ("all", None): - return all(self._row_matches_filter(entity_type, row, filter) for filter in filters) + return all(self._row_matches_filter(entity_type, row, filter, retired_only) for filter in filters) elif filter_operator == "any": - return any(self._row_matches_filter(entity_type, row, filter) for filter in filters) + return any(self._row_matches_filter(entity_type, row, filter, retired_only) for filter in filters) else: raise ShotgunError("%s is not a valid filter operator" % filter_operator) diff --git a/tests/mockgun/schema.pickle b/tests/mockgun/schema.pickle new file mode 100644 index 000000000..ad15f4854 --- /dev/null +++ b/tests/mockgun/schema.pickle @@ -0,0 +1,98684 @@ +(dp0 +S'Playlist' +p1 +(dp2 +S'open_notes_count' +p3 +(dp4 +S'mandatory' +p5 +(dp6 +S'editable' +p7 +I00 +sS'value' +p8 +I00 +ssS'name' +p9 +(dp10 +S'editable' +p11 +I01 +sS'value' +p12 +S'Open Notes Count' +p13 +ssS'data_type' +p14 +(dp15 +S'editable' +p16 +I00 +sS'value' +p17 +S'text' +p18 +ssS'entity_type' +p19 +(dp20 +S'editable' +p21 +I00 +sS'value' +p22 +S'Playlist' +p23 +ssS'editable' +p24 +(dp25 +S'editable' +p26 +I00 +sS'value' +p27 +I00 +ssS'unique' +p28 +(dp29 +S'editable' +p30 +I00 +sS'value' +p31 +I00 +ssS'properties' +p32 +(dp33 +S'default_value' +p34 +(dp35 +S'editable' +p36 +I00 +sS'value' +p37 +NssS'summary_default' +p38 +(dp39 +S'editable' +p40 +I01 +sS'value' +p41 +S'none' +p42 +sssS'description' +p43 +(dp44 +S'editable' +p45 +I01 +sS'value' +p46 +S'' +p47 +sssS'code' +p48 +(dp49 +S'mandatory' +p50 +(dp51 +S'editable' +p52 +I00 +sS'value' +p53 +I01 +ssS'name' +p54 +(dp55 +S'editable' +p56 +I01 +sS'value' +p57 +S'Playlist Name' +p58 +ssS'data_type' +p59 +(dp60 +S'editable' +p61 +I00 +sS'value' +p62 +S'text' +p63 +ssS'entity_type' +p64 +(dp65 +S'editable' +p66 +I00 +sS'value' +p67 +S'Playlist' +p68 +ssS'editable' +p69 +(dp70 +S'editable' +p71 +I00 +sS'value' +p72 +I01 +ssS'unique' +p73 +(dp74 +S'editable' +p75 +I00 +sS'value' +p76 +I00 +ssS'properties' +p77 +(dp78 +S'default_value' +p79 +(dp80 +S'editable' +p81 +I00 +sS'value' +p82 +NssS'summary_default' +p83 +(dp84 +S'editable' +p85 +I01 +sS'value' +p86 +S'none' +p87 +sssS'description' +p88 +(dp89 +S'editable' +p90 +I01 +sS'value' +p91 +g47 +sssS'open_notes' +p92 +(dp93 +S'mandatory' +p94 +(dp95 +S'editable' +p96 +I00 +sS'value' +p97 +I00 +ssS'name' +p98 +(dp99 +S'editable' +p100 +I01 +sS'value' +p101 +S'Open Notes' +p102 +ssS'data_type' +p103 +(dp104 +S'editable' +p105 +I00 +sS'value' +p106 +S'multi_entity' +p107 +ssS'entity_type' +p108 +(dp109 +S'editable' +p110 +I00 +sS'value' +p111 +S'Playlist' +p112 +ssS'editable' +p113 +(dp114 +S'editable' +p115 +I00 +sS'value' +p116 +I00 +ssS'unique' +p117 +(dp118 +S'editable' +p119 +I00 +sS'value' +p120 +I00 +ssS'properties' +p121 +(dp122 +S'default_value' +p123 +(dp124 +S'editable' +p125 +I00 +sS'value' +p126 +NssS'summary_default' +p127 +(dp128 +S'editable' +p129 +I01 +sS'value' +p130 +S'none' +p131 +ssS'valid_types' +p132 +(dp133 +S'editable' +p134 +I01 +sS'value' +p135 +(lp136 +S'Note' +p137 +asssS'description' +p138 +(dp139 +S'editable' +p140 +I01 +sS'value' +p141 +g47 +sssS'description' +p142 +(dp143 +S'mandatory' +p144 +(dp145 +S'editable' +p146 +I00 +sS'value' +p147 +I00 +ssS'name' +p148 +(dp149 +S'editable' +p150 +I01 +sS'value' +p151 +S'Description' +p152 +ssS'data_type' +p153 +(dp154 +S'editable' +p155 +I00 +sS'value' +p156 +S'text' +p157 +ssS'entity_type' +p158 +(dp159 +S'editable' +p160 +I00 +sS'value' +p161 +S'Playlist' +p162 +ssS'editable' +p163 +(dp164 +S'editable' +p165 +I00 +sS'value' +p166 +I01 +ssS'unique' +p167 +(dp168 +S'editable' +p169 +I00 +sS'value' +p170 +I00 +ssS'properties' +p171 +(dp172 +S'default_value' +p173 +(dp174 +S'editable' +p175 +I00 +sS'value' +p176 +NssS'summary_default' +p177 +(dp178 +S'editable' +p179 +I01 +sS'value' +p180 +S'none' +p181 +sssS'description' +p182 +(dp183 +S'editable' +p184 +I01 +sS'value' +p185 +g47 +sssS'versions' +p186 +(dp187 +S'mandatory' +p188 +(dp189 +S'editable' +p190 +I00 +sS'value' +p191 +I00 +ssS'name' +p192 +(dp193 +S'editable' +p194 +I01 +sS'value' +p195 +S'Versions' +p196 +ssS'data_type' +p197 +(dp198 +S'editable' +p199 +I00 +sS'value' +p200 +S'multi_entity' +p201 +ssS'entity_type' +p202 +(dp203 +S'editable' +p204 +I00 +sS'value' +p205 +S'Playlist' +p206 +ssS'editable' +p207 +(dp208 +S'editable' +p209 +I00 +sS'value' +p210 +I01 +ssS'unique' +p211 +(dp212 +S'editable' +p213 +I00 +sS'value' +p214 +I00 +ssS'properties' +p215 +(dp216 +S'default_value' +p217 +(dp218 +S'editable' +p219 +I00 +sS'value' +p220 +NssS'summary_default' +p221 +(dp222 +S'editable' +p223 +I01 +sS'value' +p224 +S'none' +p225 +ssS'valid_types' +p226 +(dp227 +S'editable' +p228 +I01 +sS'value' +p229 +(lp230 +S'Version' +p231 +asssS'description' +p232 +(dp233 +S'editable' +p234 +I01 +sS'value' +p235 +g47 +sssS'notes' +p236 +(dp237 +S'mandatory' +p238 +(dp239 +S'editable' +p240 +I00 +sS'value' +p241 +I00 +ssS'name' +p242 +(dp243 +S'editable' +p244 +I01 +sS'value' +p245 +S'Notes' +p246 +ssS'data_type' +p247 +(dp248 +S'editable' +p249 +I00 +sS'value' +p250 +S'multi_entity' +p251 +ssS'entity_type' +p252 +(dp253 +S'editable' +p254 +I00 +sS'value' +p255 +S'Playlist' +p256 +ssS'editable' +p257 +(dp258 +S'editable' +p259 +I00 +sS'value' +p260 +I01 +ssS'unique' +p261 +(dp262 +S'editable' +p263 +I00 +sS'value' +p264 +I00 +ssS'properties' +p265 +(dp266 +S'default_value' +p267 +(dp268 +S'editable' +p269 +I00 +sS'value' +p270 +NssS'summary_default' +p271 +(dp272 +S'editable' +p273 +I01 +sS'value' +p274 +S'none' +p275 +ssS'valid_types' +p276 +(dp277 +S'editable' +p278 +I01 +sS'value' +p279 +(lp280 +S'Note' +p281 +asssS'description' +p282 +(dp283 +S'editable' +p284 +I01 +sS'value' +p285 +g47 +sssS'media_center_viewed_by_current_user_at' +p286 +(dp287 +S'mandatory' +p288 +(dp289 +S'editable' +p290 +I00 +sS'value' +p291 +I00 +ssS'name' +p292 +(dp293 +S'editable' +p294 +I01 +sS'value' +p295 +S'Media Center Date Viewed' +p296 +ssS'data_type' +p297 +(dp298 +S'editable' +p299 +I00 +sS'value' +p300 +S'date_time' +p301 +ssS'entity_type' +p302 +(dp303 +S'editable' +p304 +I00 +sS'value' +p305 +S'Playlist' +p306 +ssS'editable' +p307 +(dp308 +S'editable' +p309 +I00 +sS'value' +p310 +I00 +ssS'unique' +p311 +(dp312 +S'editable' +p313 +I00 +sS'value' +p314 +I00 +ssS'properties' +p315 +(dp316 +S'default_value' +p317 +(dp318 +S'editable' +p319 +I00 +sS'value' +p320 +NssS'summary_default' +p321 +(dp322 +S'editable' +p323 +I00 +sS'value' +p324 +S'none' +p325 +sssS'description' +p326 +(dp327 +S'editable' +p328 +I01 +sS'value' +p329 +g47 +sssS'sg_status' +p330 +(dp331 +S'mandatory' +p332 +(dp333 +S'editable' +p334 +I00 +sS'value' +p335 +I00 +ssS'name' +p336 +(dp337 +S'editable' +p338 +I01 +sS'value' +p339 +S'Status' +p340 +ssS'data_type' +p341 +(dp342 +S'editable' +p343 +I00 +sS'value' +p344 +S'status_list' +p345 +ssS'entity_type' +p346 +(dp347 +S'editable' +p348 +I00 +sS'value' +p349 +S'Playlist' +p350 +ssS'editable' +p351 +(dp352 +S'editable' +p353 +I00 +sS'value' +p354 +I01 +ssS'unique' +p355 +(dp356 +S'editable' +p357 +I00 +sS'value' +p358 +I00 +ssS'properties' +p359 +(dp360 +S'default_value' +p361 +(dp362 +S'editable' +p363 +I01 +sS'value' +p364 +S'opn' +p365 +ssS'valid_values' +p366 +(dp367 +S'editable' +p368 +I01 +sS'value' +p369 +(lp370 +S'clsd' +p371 +aS'ip' +p372 +aS'opn' +p373 +assS'summary_default' +p374 +(dp375 +S'editable' +p376 +I01 +sS'value' +p377 +S'none' +p378 +sssS'description' +p379 +(dp380 +S'editable' +p381 +I01 +sS'value' +p382 +g47 +sssS'updated_at' +p383 +(dp384 +S'mandatory' +p385 +(dp386 +S'editable' +p387 +I00 +sS'value' +p388 +I00 +ssS'name' +p389 +(dp390 +S'editable' +p391 +I01 +sS'value' +p392 +S'Date Updated' +p393 +ssS'data_type' +p394 +(dp395 +S'editable' +p396 +I00 +sS'value' +p397 +S'date_time' +p398 +ssS'entity_type' +p399 +(dp400 +S'editable' +p401 +I00 +sS'value' +p402 +S'Playlist' +p403 +ssS'editable' +p404 +(dp405 +S'editable' +p406 +I00 +sS'value' +p407 +I00 +ssS'unique' +p408 +(dp409 +S'editable' +p410 +I00 +sS'value' +p411 +I00 +ssS'properties' +p412 +(dp413 +S'default_value' +p414 +(dp415 +S'editable' +p416 +I00 +sS'value' +p417 +NssS'summary_default' +p418 +(dp419 +S'editable' +p420 +I01 +sS'value' +p421 +S'none' +p422 +sssS'description' +p423 +(dp424 +S'editable' +p425 +I01 +sS'value' +p426 +g47 +sssS'created_by' +p427 +(dp428 +S'mandatory' +p429 +(dp430 +S'editable' +p431 +I00 +sS'value' +p432 +I00 +ssS'name' +p433 +(dp434 +S'editable' +p435 +I01 +sS'value' +p436 +S'Created by' +p437 +ssS'data_type' +p438 +(dp439 +S'editable' +p440 +I00 +sS'value' +p441 +S'entity' +p442 +ssS'entity_type' +p443 +(dp444 +S'editable' +p445 +I00 +sS'value' +p446 +S'Playlist' +p447 +ssS'editable' +p448 +(dp449 +S'editable' +p450 +I00 +sS'value' +p451 +I00 +ssS'unique' +p452 +(dp453 +S'editable' +p454 +I00 +sS'value' +p455 +I00 +ssS'properties' +p456 +(dp457 +S'default_value' +p458 +(dp459 +S'editable' +p460 +I00 +sS'value' +p461 +NssS'summary_default' +p462 +(dp463 +S'editable' +p464 +I01 +sS'value' +p465 +S'none' +p466 +ssS'valid_types' +p467 +(dp468 +S'editable' +p469 +I01 +sS'value' +p470 +(lp471 +S'HumanUser' +p472 +aS'ApiUser' +p473 +asssS'description' +p474 +(dp475 +S'editable' +p476 +I01 +sS'value' +p477 +g47 +sssS'id' +p478 +(dp479 +S'mandatory' +p480 +(dp481 +S'editable' +p482 +I00 +sS'value' +p483 +I00 +ssS'name' +p484 +(dp485 +S'editable' +p486 +I01 +sS'value' +p487 +S'Id' +p488 +ssS'data_type' +p489 +(dp490 +S'editable' +p491 +I00 +sS'value' +p492 +S'number' +p493 +ssS'entity_type' +p494 +(dp495 +S'editable' +p496 +I00 +sS'value' +p497 +S'Playlist' +p498 +ssS'editable' +p499 +(dp500 +S'editable' +p501 +I00 +sS'value' +p502 +I00 +ssS'unique' +p503 +(dp504 +S'editable' +p505 +I00 +sS'value' +p506 +I00 +ssS'properties' +p507 +(dp508 +S'default_value' +p509 +(dp510 +S'editable' +p511 +I00 +sS'value' +p512 +NssS'summary_default' +p513 +(dp514 +S'editable' +p515 +I01 +sS'value' +p516 +S'none' +p517 +sssS'description' +p518 +(dp519 +S'editable' +p520 +I01 +sS'value' +p521 +g47 +sssS'project' +p522 +(dp523 +S'mandatory' +p524 +(dp525 +S'editable' +p526 +I00 +sS'value' +p527 +I00 +ssS'name' +p528 +(dp529 +S'editable' +p530 +I01 +sS'value' +p531 +S'Project' +p532 +ssS'data_type' +p533 +(dp534 +S'editable' +p535 +I00 +sS'value' +p536 +S'entity' +p537 +ssS'entity_type' +p538 +(dp539 +S'editable' +p540 +I00 +sS'value' +p541 +S'Playlist' +p542 +ssS'editable' +p543 +(dp544 +S'editable' +p545 +I00 +sS'value' +p546 +I01 +ssS'unique' +p547 +(dp548 +S'editable' +p549 +I00 +sS'value' +p550 +I00 +ssS'properties' +p551 +(dp552 +S'default_value' +p553 +(dp554 +S'editable' +p555 +I00 +sS'value' +p556 +NssS'summary_default' +p557 +(dp558 +S'editable' +p559 +I01 +sS'value' +p560 +S'none' +p561 +ssS'valid_types' +p562 +(dp563 +S'editable' +p564 +I01 +sS'value' +p565 +(lp566 +S'Project' +p567 +asssS'description' +p568 +(dp569 +S'editable' +p570 +I01 +sS'value' +p571 +g47 +sssS'filmstrip_image' +p572 +(dp573 +S'mandatory' +p574 +(dp575 +S'editable' +p576 +I00 +sS'value' +p577 +I00 +ssS'name' +p578 +(dp579 +S'editable' +p580 +I01 +sS'value' +p581 +S'Filmstrip Thumbnail' +p582 +ssS'data_type' +p583 +(dp584 +S'editable' +p585 +I00 +sS'value' +p586 +S'image' +p587 +ssS'entity_type' +p588 +(dp589 +S'editable' +p590 +I00 +sS'value' +p591 +S'Playlist' +p592 +ssS'editable' +p593 +(dp594 +S'editable' +p595 +I00 +sS'value' +p596 +I01 +ssS'unique' +p597 +(dp598 +S'editable' +p599 +I00 +sS'value' +p600 +I00 +ssS'properties' +p601 +(dp602 +S'default_value' +p603 +(dp604 +S'editable' +p605 +I00 +sS'value' +p606 +NssS'summary_default' +p607 +(dp608 +S'editable' +p609 +I01 +sS'value' +p610 +S'none' +p611 +sssS'description' +p612 +(dp613 +S'editable' +p614 +I01 +sS'value' +p615 +g47 +sssS'sg_date_and_time' +p616 +(dp617 +S'mandatory' +p618 +(dp619 +S'editable' +p620 +I00 +sS'value' +p621 +I00 +ssS'name' +p622 +(dp623 +S'editable' +p624 +I01 +sS'value' +p625 +S'Date and Time' +p626 +ssS'data_type' +p627 +(dp628 +S'editable' +p629 +I00 +sS'value' +p630 +S'date_time' +p631 +ssS'entity_type' +p632 +(dp633 +S'editable' +p634 +I00 +sS'value' +p635 +S'Playlist' +p636 +ssS'editable' +p637 +(dp638 +S'editable' +p639 +I00 +sS'value' +p640 +I01 +ssS'unique' +p641 +(dp642 +S'editable' +p643 +I00 +sS'value' +p644 +I00 +ssS'properties' +p645 +(dp646 +S'default_value' +p647 +(dp648 +S'editable' +p649 +I00 +sS'value' +p650 +NssS'summary_default' +p651 +(dp652 +S'editable' +p653 +I01 +sS'value' +p654 +S'none' +p655 +sssS'description' +p656 +(dp657 +S'editable' +p658 +I01 +sS'value' +p659 +g47 +sssS'image' +p660 +(dp661 +S'mandatory' +p662 +(dp663 +S'editable' +p664 +I00 +sS'value' +p665 +I00 +ssS'name' +p666 +(dp667 +S'editable' +p668 +I01 +sS'value' +p669 +S'Thumbnail' +p670 +ssS'data_type' +p671 +(dp672 +S'editable' +p673 +I00 +sS'value' +p674 +S'image' +p675 +ssS'entity_type' +p676 +(dp677 +S'editable' +p678 +I00 +sS'value' +p679 +S'Playlist' +p680 +ssS'editable' +p681 +(dp682 +S'editable' +p683 +I00 +sS'value' +p684 +I01 +ssS'unique' +p685 +(dp686 +S'editable' +p687 +I00 +sS'value' +p688 +I00 +ssS'properties' +p689 +(dp690 +S'default_value' +p691 +(dp692 +S'editable' +p693 +I00 +sS'value' +p694 +NssS'summary_default' +p695 +(dp696 +S'editable' +p697 +I01 +sS'value' +p698 +S'none' +p699 +sssS'description' +p700 +(dp701 +S'editable' +p702 +I01 +sS'value' +p703 +g47 +sssS'current_user_favorite' +p704 +(dp705 +S'mandatory' +p706 +(dp707 +S'editable' +p708 +I00 +sS'value' +p709 +I00 +ssS'name' +p710 +(dp711 +S'editable' +p712 +I01 +sS'value' +p713 +S'Favorite' +p714 +ssS'data_type' +p715 +(dp716 +S'editable' +p717 +I00 +sS'value' +p718 +S'checkbox' +p719 +ssS'entity_type' +p720 +(dp721 +S'editable' +p722 +I00 +sS'value' +p723 +S'Playlist' +p724 +ssS'editable' +p725 +(dp726 +S'editable' +p727 +I00 +sS'value' +p728 +I01 +ssS'unique' +p729 +(dp730 +S'editable' +p731 +I00 +sS'value' +p732 +I00 +ssS'properties' +p733 +(dp734 +S'default_value' +p735 +(dp736 +S'editable' +p737 +I00 +sS'value' +p738 +NssS'summary_default' +p739 +(dp740 +S'editable' +p741 +I01 +sS'value' +p742 +S'none' +p743 +sssS'description' +p744 +(dp745 +S'editable' +p746 +I01 +sS'value' +p747 +g47 +sssS'cached_display_name' +p748 +(dp749 +S'mandatory' +p750 +(dp751 +S'editable' +p752 +I00 +sS'value' +p753 +I00 +ssS'name' +p754 +(dp755 +S'editable' +p756 +I01 +sS'value' +p757 +S'Cached Display Name' +p758 +ssS'data_type' +p759 +(dp760 +S'editable' +p761 +I00 +sS'value' +p762 +S'text' +p763 +ssS'entity_type' +p764 +(dp765 +S'editable' +p766 +I00 +sS'value' +p767 +S'Playlist' +p768 +ssS'editable' +p769 +(dp770 +S'editable' +p771 +I00 +sS'value' +p772 +I01 +ssS'unique' +p773 +(dp774 +S'editable' +p775 +I00 +sS'value' +p776 +I00 +ssS'properties' +p777 +(dp778 +S'default_value' +p779 +(dp780 +S'editable' +p781 +I00 +sS'value' +p782 +NssS'summary_default' +p783 +(dp784 +S'editable' +p785 +I00 +sS'value' +p786 +S'none' +p787 +sssS'description' +p788 +(dp789 +S'editable' +p790 +I01 +sS'value' +p791 +g47 +sssS'tag_list' +p792 +(dp793 +S'mandatory' +p794 +(dp795 +S'editable' +p796 +I00 +sS'value' +p797 +I00 +ssS'name' +p798 +(dp799 +S'editable' +p800 +I01 +sS'value' +p801 +S'Tags' +p802 +ssS'data_type' +p803 +(dp804 +S'editable' +p805 +I00 +sS'value' +p806 +S'tag_list' +p807 +ssS'entity_type' +p808 +(dp809 +S'editable' +p810 +I00 +sS'value' +p811 +S'Playlist' +p812 +ssS'editable' +p813 +(dp814 +S'editable' +p815 +I00 +sS'value' +p816 +I01 +ssS'unique' +p817 +(dp818 +S'editable' +p819 +I00 +sS'value' +p820 +I00 +ssS'properties' +p821 +(dp822 +S'default_value' +p823 +(dp824 +S'editable' +p825 +I00 +sS'value' +p826 +NssS'summary_default' +p827 +(dp828 +S'editable' +p829 +I01 +sS'value' +p830 +S'none' +p831 +ssS'valid_types' +p832 +(dp833 +S'editable' +p834 +I01 +sS'value' +p835 +(lp836 +S'Tag' +p837 +asssS'description' +p838 +(dp839 +S'editable' +p840 +I01 +sS'value' +p841 +g47 +sssS'media_center_viewed_by_current_user' +p842 +(dp843 +S'mandatory' +p844 +(dp845 +S'editable' +p846 +I00 +sS'value' +p847 +I00 +ssS'name' +p848 +(dp849 +S'editable' +p850 +I01 +sS'value' +p851 +S'Media Center Viewed/Unviewed' +p852 +ssS'data_type' +p853 +(dp854 +S'editable' +p855 +I00 +sS'value' +p856 +S'list' +p857 +ssS'entity_type' +p858 +(dp859 +S'editable' +p860 +I00 +sS'value' +p861 +S'Playlist' +p862 +ssS'editable' +p863 +(dp864 +S'editable' +p865 +I00 +sS'value' +p866 +I01 +ssS'unique' +p867 +(dp868 +S'editable' +p869 +I00 +sS'value' +p870 +I00 +ssS'properties' +p871 +(dp872 +S'default_value' +p873 +(dp874 +S'editable' +p875 +I00 +sS'value' +p876 +NssS'valid_values' +p877 +(dp878 +S'editable' +p879 +I00 +sS'value' +p880 +(lp881 +S'read' +p882 +aS'unread' +p883 +assS'summary_default' +p884 +(dp885 +S'editable' +p886 +I00 +sS'value' +p887 +S'none' +p888 +sssS'description' +p889 +(dp890 +S'editable' +p891 +I01 +sS'value' +p892 +g47 +sssS'created_at' +p893 +(dp894 +S'mandatory' +p895 +(dp896 +S'editable' +p897 +I00 +sS'value' +p898 +I00 +ssS'name' +p899 +(dp900 +S'editable' +p901 +I01 +sS'value' +p902 +S'Date Created' +p903 +ssS'data_type' +p904 +(dp905 +S'editable' +p906 +I00 +sS'value' +p907 +S'date_time' +p908 +ssS'entity_type' +p909 +(dp910 +S'editable' +p911 +I00 +sS'value' +p912 +S'Playlist' +p913 +ssS'editable' +p914 +(dp915 +S'editable' +p916 +I00 +sS'value' +p917 +I00 +ssS'unique' +p918 +(dp919 +S'editable' +p920 +I00 +sS'value' +p921 +I00 +ssS'properties' +p922 +(dp923 +S'default_value' +p924 +(dp925 +S'editable' +p926 +I00 +sS'value' +p927 +NssS'summary_default' +p928 +(dp929 +S'editable' +p930 +I01 +sS'value' +p931 +S'none' +p932 +sssS'description' +p933 +(dp934 +S'editable' +p935 +I01 +sS'value' +p936 +g47 +sssS'updated_by' +p937 +(dp938 +S'mandatory' +p939 +(dp940 +S'editable' +p941 +I00 +sS'value' +p942 +I00 +ssS'name' +p943 +(dp944 +S'editable' +p945 +I01 +sS'value' +p946 +S'Updated by' +p947 +ssS'data_type' +p948 +(dp949 +S'editable' +p950 +I00 +sS'value' +p951 +S'entity' +p952 +ssS'entity_type' +p953 +(dp954 +S'editable' +p955 +I00 +sS'value' +p956 +S'Playlist' +p957 +ssS'editable' +p958 +(dp959 +S'editable' +p960 +I00 +sS'value' +p961 +I00 +ssS'unique' +p962 +(dp963 +S'editable' +p964 +I00 +sS'value' +p965 +I00 +ssS'properties' +p966 +(dp967 +S'default_value' +p968 +(dp969 +S'editable' +p970 +I00 +sS'value' +p971 +NssS'summary_default' +p972 +(dp973 +S'editable' +p974 +I01 +sS'value' +p975 +S'none' +p976 +ssS'valid_types' +p977 +(dp978 +S'editable' +p979 +I01 +sS'value' +p980 +(lp981 +S'HumanUser' +p982 +aS'ApiUser' +p983 +asssS'description' +p984 +(dp985 +S'editable' +p986 +I01 +sS'value' +p987 +g47 +ssssS'AppWelcomeUserConnection' +p988 +(dp989 +S'cached_display_name' +p990 +(dp991 +S'mandatory' +p992 +(dp993 +S'editable' +p994 +I00 +sS'value' +p995 +I00 +ssS'name' +p996 +(dp997 +S'editable' +p998 +I01 +sS'value' +p999 +S'Cached Display Name' +p1000 +ssS'data_type' +p1001 +(dp1002 +S'editable' +p1003 +I00 +sS'value' +p1004 +S'text' +p1005 +ssS'entity_type' +p1006 +(dp1007 +S'editable' +p1008 +I00 +sS'value' +p1009 +S'AppWelcomeUserConnection' +p1010 +ssS'editable' +p1011 +(dp1012 +S'editable' +p1013 +I00 +sS'value' +p1014 +I01 +ssS'unique' +p1015 +(dp1016 +S'editable' +p1017 +I00 +sS'value' +p1018 +I00 +ssS'properties' +p1019 +(dp1020 +S'default_value' +p1021 +(dp1022 +S'editable' +p1023 +I00 +sS'value' +p1024 +NssS'summary_default' +p1025 +(dp1026 +S'editable' +p1027 +I00 +sS'value' +p1028 +S'none' +p1029 +sssS'description' +p1030 +(dp1031 +S'editable' +p1032 +I01 +sS'value' +p1033 +g47 +sssS'app_welcome' +p1034 +(dp1035 +S'mandatory' +p1036 +(dp1037 +S'editable' +p1038 +I00 +sS'value' +p1039 +I00 +ssS'name' +p1040 +(dp1041 +S'editable' +p1042 +I01 +sS'value' +p1043 +S'App Welcome' +p1044 +ssS'data_type' +p1045 +(dp1046 +S'editable' +p1047 +I00 +sS'value' +p1048 +S'entity' +p1049 +ssS'entity_type' +p1050 +(dp1051 +S'editable' +p1052 +I00 +sS'value' +p1053 +S'AppWelcomeUserConnection' +p1054 +ssS'editable' +p1055 +(dp1056 +S'editable' +p1057 +I00 +sS'value' +p1058 +I01 +ssS'unique' +p1059 +(dp1060 +S'editable' +p1061 +I00 +sS'value' +p1062 +I00 +ssS'properties' +p1063 +(dp1064 +S'default_value' +p1065 +(dp1066 +S'editable' +p1067 +I00 +sS'value' +p1068 +NssS'summary_default' +p1069 +(dp1070 +S'editable' +p1071 +I00 +sS'value' +p1072 +S'none' +p1073 +ssS'valid_types' +p1074 +(dp1075 +S'editable' +p1076 +I00 +sS'value' +p1077 +(lp1078 +S'AppWelcome' +p1079 +asssS'description' +p1080 +(dp1081 +S'editable' +p1082 +I01 +sS'value' +p1083 +g47 +sssS'id' +p1084 +(dp1085 +S'mandatory' +p1086 +(dp1087 +S'editable' +p1088 +I00 +sS'value' +p1089 +I00 +ssS'name' +p1090 +(dp1091 +S'editable' +p1092 +I01 +sS'value' +p1093 +S'Id' +p1094 +ssS'data_type' +p1095 +(dp1096 +S'editable' +p1097 +I00 +sS'value' +p1098 +S'number' +p1099 +ssS'entity_type' +p1100 +(dp1101 +S'editable' +p1102 +I00 +sS'value' +p1103 +S'AppWelcomeUserConnection' +p1104 +ssS'editable' +p1105 +(dp1106 +S'editable' +p1107 +I00 +sS'value' +p1108 +I00 +ssS'unique' +p1109 +(dp1110 +S'editable' +p1111 +I00 +sS'value' +p1112 +I00 +ssS'properties' +p1113 +(dp1114 +S'default_value' +p1115 +(dp1116 +S'editable' +p1117 +I00 +sS'value' +p1118 +NssS'summary_default' +p1119 +(dp1120 +S'editable' +p1121 +I00 +sS'value' +p1122 +S'none' +p1123 +sssS'description' +p1124 +(dp1125 +S'editable' +p1126 +I01 +sS'value' +p1127 +g47 +sssS'user' +p1128 +(dp1129 +S'mandatory' +p1130 +(dp1131 +S'editable' +p1132 +I00 +sS'value' +p1133 +I00 +ssS'name' +p1134 +(dp1135 +S'editable' +p1136 +I01 +sS'value' +p1137 +S'User' +p1138 +ssS'data_type' +p1139 +(dp1140 +S'editable' +p1141 +I00 +sS'value' +p1142 +S'entity' +p1143 +ssS'entity_type' +p1144 +(dp1145 +S'editable' +p1146 +I00 +sS'value' +p1147 +S'AppWelcomeUserConnection' +p1148 +ssS'editable' +p1149 +(dp1150 +S'editable' +p1151 +I00 +sS'value' +p1152 +I01 +ssS'unique' +p1153 +(dp1154 +S'editable' +p1155 +I00 +sS'value' +p1156 +I00 +ssS'properties' +p1157 +(dp1158 +S'default_value' +p1159 +(dp1160 +S'editable' +p1161 +I00 +sS'value' +p1162 +NssS'summary_default' +p1163 +(dp1164 +S'editable' +p1165 +I00 +sS'value' +p1166 +S'none' +p1167 +ssS'valid_types' +p1168 +(dp1169 +S'editable' +p1170 +I00 +sS'value' +p1171 +(lp1172 +S'HumanUser' +p1173 +asssS'description' +p1174 +(dp1175 +S'editable' +p1176 +I01 +sS'value' +p1177 +g47 +ssssS'Group' +p1178 +(dp1179 +S'open_notes_count' +p1180 +(dp1181 +S'mandatory' +p1182 +(dp1183 +S'editable' +p1184 +I00 +sS'value' +p1185 +I00 +ssS'name' +p1186 +(dp1187 +S'editable' +p1188 +I01 +sS'value' +p1189 +S'Open Notes Count' +p1190 +ssS'data_type' +p1191 +(dp1192 +S'editable' +p1193 +I00 +sS'value' +p1194 +S'text' +p1195 +ssS'entity_type' +p1196 +(dp1197 +S'editable' +p1198 +I00 +sS'value' +p1199 +S'Group' +p1200 +ssS'editable' +p1201 +(dp1202 +S'editable' +p1203 +I00 +sS'value' +p1204 +I00 +ssS'unique' +p1205 +(dp1206 +S'editable' +p1207 +I00 +sS'value' +p1208 +I00 +ssS'properties' +p1209 +(dp1210 +S'default_value' +p1211 +(dp1212 +S'editable' +p1213 +I00 +sS'value' +p1214 +NssS'summary_default' +p1215 +(dp1216 +S'editable' +p1217 +I01 +sS'value' +p1218 +S'none' +p1219 +sssS'description' +p1220 +(dp1221 +S'editable' +p1222 +I01 +sS'value' +p1223 +g47 +sssS'code' +p1224 +(dp1225 +S'mandatory' +p1226 +(dp1227 +S'editable' +p1228 +I00 +sS'value' +p1229 +I01 +ssS'name' +p1230 +(dp1231 +S'editable' +p1232 +I01 +sS'value' +p1233 +S'Group Name' +p1234 +ssS'data_type' +p1235 +(dp1236 +S'editable' +p1237 +I00 +sS'value' +p1238 +S'text' +p1239 +ssS'entity_type' +p1240 +(dp1241 +S'editable' +p1242 +I00 +sS'value' +p1243 +S'Group' +p1244 +ssS'editable' +p1245 +(dp1246 +S'editable' +p1247 +I00 +sS'value' +p1248 +I01 +ssS'unique' +p1249 +(dp1250 +S'editable' +p1251 +I00 +sS'value' +p1252 +I00 +ssS'properties' +p1253 +(dp1254 +S'default_value' +p1255 +(dp1256 +S'editable' +p1257 +I00 +sS'value' +p1258 +NssS'summary_default' +p1259 +(dp1260 +S'editable' +p1261 +I01 +sS'value' +p1262 +S'none' +p1263 +sssS'description' +p1264 +(dp1265 +S'editable' +p1266 +I01 +sS'value' +p1267 +g47 +sssS'open_notes' +p1268 +(dp1269 +S'mandatory' +p1270 +(dp1271 +S'editable' +p1272 +I00 +sS'value' +p1273 +I00 +ssS'name' +p1274 +(dp1275 +S'editable' +p1276 +I01 +sS'value' +p1277 +S'Open Notes' +p1278 +ssS'data_type' +p1279 +(dp1280 +S'editable' +p1281 +I00 +sS'value' +p1282 +S'multi_entity' +p1283 +ssS'entity_type' +p1284 +(dp1285 +S'editable' +p1286 +I00 +sS'value' +p1287 +S'Group' +p1288 +ssS'editable' +p1289 +(dp1290 +S'editable' +p1291 +I00 +sS'value' +p1292 +I00 +ssS'unique' +p1293 +(dp1294 +S'editable' +p1295 +I00 +sS'value' +p1296 +I00 +ssS'properties' +p1297 +(dp1298 +S'default_value' +p1299 +(dp1300 +S'editable' +p1301 +I00 +sS'value' +p1302 +NssS'summary_default' +p1303 +(dp1304 +S'editable' +p1305 +I01 +sS'value' +p1306 +S'none' +p1307 +ssS'valid_types' +p1308 +(dp1309 +S'editable' +p1310 +I01 +sS'value' +p1311 +(lp1312 +S'Note' +p1313 +asssS'description' +p1314 +(dp1315 +S'editable' +p1316 +I01 +sS'value' +p1317 +g47 +sssS'users' +p1318 +(dp1319 +S'mandatory' +p1320 +(dp1321 +S'editable' +p1322 +I00 +sS'value' +p1323 +I00 +ssS'name' +p1324 +(dp1325 +S'editable' +p1326 +I01 +sS'value' +p1327 +S'Users' +p1328 +ssS'data_type' +p1329 +(dp1330 +S'editable' +p1331 +I00 +sS'value' +p1332 +S'multi_entity' +p1333 +ssS'entity_type' +p1334 +(dp1335 +S'editable' +p1336 +I00 +sS'value' +p1337 +S'Group' +p1338 +ssS'editable' +p1339 +(dp1340 +S'editable' +p1341 +I00 +sS'value' +p1342 +I01 +ssS'unique' +p1343 +(dp1344 +S'editable' +p1345 +I00 +sS'value' +p1346 +I00 +ssS'properties' +p1347 +(dp1348 +S'default_value' +p1349 +(dp1350 +S'editable' +p1351 +I00 +sS'value' +p1352 +NssS'summary_default' +p1353 +(dp1354 +S'editable' +p1355 +I01 +sS'value' +p1356 +S'none' +p1357 +ssS'valid_types' +p1358 +(dp1359 +S'editable' +p1360 +I01 +sS'value' +p1361 +(lp1362 +S'HumanUser' +p1363 +asssS'description' +p1364 +(dp1365 +S'editable' +p1366 +I01 +sS'value' +p1367 +g47 +sssS'created_at' +p1368 +(dp1369 +S'mandatory' +p1370 +(dp1371 +S'editable' +p1372 +I00 +sS'value' +p1373 +I00 +ssS'name' +p1374 +(dp1375 +S'editable' +p1376 +I01 +sS'value' +p1377 +S'Date Created' +p1378 +ssS'data_type' +p1379 +(dp1380 +S'editable' +p1381 +I00 +sS'value' +p1382 +S'date_time' +p1383 +ssS'entity_type' +p1384 +(dp1385 +S'editable' +p1386 +I00 +sS'value' +p1387 +S'Group' +p1388 +ssS'editable' +p1389 +(dp1390 +S'editable' +p1391 +I00 +sS'value' +p1392 +I00 +ssS'unique' +p1393 +(dp1394 +S'editable' +p1395 +I00 +sS'value' +p1396 +I00 +ssS'properties' +p1397 +(dp1398 +S'default_value' +p1399 +(dp1400 +S'editable' +p1401 +I00 +sS'value' +p1402 +NssS'summary_default' +p1403 +(dp1404 +S'editable' +p1405 +I01 +sS'value' +p1406 +S'none' +p1407 +sssS'description' +p1408 +(dp1409 +S'editable' +p1410 +I01 +sS'value' +p1411 +g47 +sssS'updated_at' +p1412 +(dp1413 +S'mandatory' +p1414 +(dp1415 +S'editable' +p1416 +I00 +sS'value' +p1417 +I00 +ssS'name' +p1418 +(dp1419 +S'editable' +p1420 +I01 +sS'value' +p1421 +S'Date Updated' +p1422 +ssS'data_type' +p1423 +(dp1424 +S'editable' +p1425 +I00 +sS'value' +p1426 +S'date_time' +p1427 +ssS'entity_type' +p1428 +(dp1429 +S'editable' +p1430 +I00 +sS'value' +p1431 +S'Group' +p1432 +ssS'editable' +p1433 +(dp1434 +S'editable' +p1435 +I00 +sS'value' +p1436 +I00 +ssS'unique' +p1437 +(dp1438 +S'editable' +p1439 +I00 +sS'value' +p1440 +I00 +ssS'properties' +p1441 +(dp1442 +S'default_value' +p1443 +(dp1444 +S'editable' +p1445 +I00 +sS'value' +p1446 +NssS'summary_default' +p1447 +(dp1448 +S'editable' +p1449 +I01 +sS'value' +p1450 +S'none' +p1451 +sssS'description' +p1452 +(dp1453 +S'editable' +p1454 +I01 +sS'value' +p1455 +g47 +sssS'created_by' +p1456 +(dp1457 +S'mandatory' +p1458 +(dp1459 +S'editable' +p1460 +I00 +sS'value' +p1461 +I00 +ssS'name' +p1462 +(dp1463 +S'editable' +p1464 +I01 +sS'value' +p1465 +S'Created by' +p1466 +ssS'data_type' +p1467 +(dp1468 +S'editable' +p1469 +I00 +sS'value' +p1470 +S'entity' +p1471 +ssS'entity_type' +p1472 +(dp1473 +S'editable' +p1474 +I00 +sS'value' +p1475 +S'Group' +p1476 +ssS'editable' +p1477 +(dp1478 +S'editable' +p1479 +I00 +sS'value' +p1480 +I00 +ssS'unique' +p1481 +(dp1482 +S'editable' +p1483 +I00 +sS'value' +p1484 +I00 +ssS'properties' +p1485 +(dp1486 +S'default_value' +p1487 +(dp1488 +S'editable' +p1489 +I00 +sS'value' +p1490 +NssS'summary_default' +p1491 +(dp1492 +S'editable' +p1493 +I01 +sS'value' +p1494 +S'none' +p1495 +ssS'valid_types' +p1496 +(dp1497 +S'editable' +p1498 +I01 +sS'value' +p1499 +(lp1500 +S'HumanUser' +p1501 +aS'ApiUser' +p1502 +asssS'description' +p1503 +(dp1504 +S'editable' +p1505 +I01 +sS'value' +p1506 +g47 +sssS'id' +p1507 +(dp1508 +S'mandatory' +p1509 +(dp1510 +S'editable' +p1511 +I00 +sS'value' +p1512 +I00 +ssS'name' +p1513 +(dp1514 +S'editable' +p1515 +I01 +sS'value' +p1516 +S'Id' +p1517 +ssS'data_type' +p1518 +(dp1519 +S'editable' +p1520 +I00 +sS'value' +p1521 +S'number' +p1522 +ssS'entity_type' +p1523 +(dp1524 +S'editable' +p1525 +I00 +sS'value' +p1526 +S'Group' +p1527 +ssS'editable' +p1528 +(dp1529 +S'editable' +p1530 +I00 +sS'value' +p1531 +I00 +ssS'unique' +p1532 +(dp1533 +S'editable' +p1534 +I00 +sS'value' +p1535 +I00 +ssS'properties' +p1536 +(dp1537 +S'default_value' +p1538 +(dp1539 +S'editable' +p1540 +I00 +sS'value' +p1541 +NssS'summary_default' +p1542 +(dp1543 +S'editable' +p1544 +I01 +sS'value' +p1545 +S'none' +p1546 +sssS'description' +p1547 +(dp1548 +S'editable' +p1549 +I01 +sS'value' +p1550 +g47 +sssS'cached_display_name' +p1551 +(dp1552 +S'mandatory' +p1553 +(dp1554 +S'editable' +p1555 +I00 +sS'value' +p1556 +I00 +ssS'name' +p1557 +(dp1558 +S'editable' +p1559 +I01 +sS'value' +p1560 +S'Cached Display Name' +p1561 +ssS'data_type' +p1562 +(dp1563 +S'editable' +p1564 +I00 +sS'value' +p1565 +S'text' +p1566 +ssS'entity_type' +p1567 +(dp1568 +S'editable' +p1569 +I00 +sS'value' +p1570 +S'Group' +p1571 +ssS'editable' +p1572 +(dp1573 +S'editable' +p1574 +I00 +sS'value' +p1575 +I01 +ssS'unique' +p1576 +(dp1577 +S'editable' +p1578 +I00 +sS'value' +p1579 +I00 +ssS'properties' +p1580 +(dp1581 +S'default_value' +p1582 +(dp1583 +S'editable' +p1584 +I00 +sS'value' +p1585 +NssS'summary_default' +p1586 +(dp1587 +S'editable' +p1588 +I00 +sS'value' +p1589 +S'none' +p1590 +sssS'description' +p1591 +(dp1592 +S'editable' +p1593 +I01 +sS'value' +p1594 +g47 +sssS'tag_list' +p1595 +(dp1596 +S'mandatory' +p1597 +(dp1598 +S'editable' +p1599 +I00 +sS'value' +p1600 +I00 +ssS'name' +p1601 +(dp1602 +S'editable' +p1603 +I01 +sS'value' +p1604 +S'Tags' +p1605 +ssS'data_type' +p1606 +(dp1607 +S'editable' +p1608 +I00 +sS'value' +p1609 +S'tag_list' +p1610 +ssS'entity_type' +p1611 +(dp1612 +S'editable' +p1613 +I00 +sS'value' +p1614 +S'Group' +p1615 +ssS'editable' +p1616 +(dp1617 +S'editable' +p1618 +I00 +sS'value' +p1619 +I01 +ssS'unique' +p1620 +(dp1621 +S'editable' +p1622 +I00 +sS'value' +p1623 +I00 +ssS'properties' +p1624 +(dp1625 +S'default_value' +p1626 +(dp1627 +S'editable' +p1628 +I00 +sS'value' +p1629 +NssS'summary_default' +p1630 +(dp1631 +S'editable' +p1632 +I01 +sS'value' +p1633 +S'none' +p1634 +ssS'valid_types' +p1635 +(dp1636 +S'editable' +p1637 +I01 +sS'value' +p1638 +(lp1639 +S'Tag' +p1640 +asssS'description' +p1641 +(dp1642 +S'editable' +p1643 +I01 +sS'value' +p1644 +g47 +sssS'notes' +p1645 +(dp1646 +S'mandatory' +p1647 +(dp1648 +S'editable' +p1649 +I00 +sS'value' +p1650 +I00 +ssS'name' +p1651 +(dp1652 +S'editable' +p1653 +I01 +sS'value' +p1654 +S'Notes' +p1655 +ssS'data_type' +p1656 +(dp1657 +S'editable' +p1658 +I00 +sS'value' +p1659 +S'multi_entity' +p1660 +ssS'entity_type' +p1661 +(dp1662 +S'editable' +p1663 +I00 +sS'value' +p1664 +S'Group' +p1665 +ssS'editable' +p1666 +(dp1667 +S'editable' +p1668 +I00 +sS'value' +p1669 +I01 +ssS'unique' +p1670 +(dp1671 +S'editable' +p1672 +I00 +sS'value' +p1673 +I00 +ssS'properties' +p1674 +(dp1675 +S'default_value' +p1676 +(dp1677 +S'editable' +p1678 +I00 +sS'value' +p1679 +NssS'summary_default' +p1680 +(dp1681 +S'editable' +p1682 +I01 +sS'value' +p1683 +S'none' +p1684 +ssS'valid_types' +p1685 +(dp1686 +S'editable' +p1687 +I01 +sS'value' +p1688 +(lp1689 +S'Note' +p1690 +asssS'description' +p1691 +(dp1692 +S'editable' +p1693 +I01 +sS'value' +p1694 +g47 +sssS'updated_by' +p1695 +(dp1696 +S'mandatory' +p1697 +(dp1698 +S'editable' +p1699 +I00 +sS'value' +p1700 +I00 +ssS'name' +p1701 +(dp1702 +S'editable' +p1703 +I01 +sS'value' +p1704 +S'Updated by' +p1705 +ssS'data_type' +p1706 +(dp1707 +S'editable' +p1708 +I00 +sS'value' +p1709 +S'entity' +p1710 +ssS'entity_type' +p1711 +(dp1712 +S'editable' +p1713 +I00 +sS'value' +p1714 +S'Group' +p1715 +ssS'editable' +p1716 +(dp1717 +S'editable' +p1718 +I00 +sS'value' +p1719 +I00 +ssS'unique' +p1720 +(dp1721 +S'editable' +p1722 +I00 +sS'value' +p1723 +I00 +ssS'properties' +p1724 +(dp1725 +S'default_value' +p1726 +(dp1727 +S'editable' +p1728 +I00 +sS'value' +p1729 +NssS'summary_default' +p1730 +(dp1731 +S'editable' +p1732 +I01 +sS'value' +p1733 +S'none' +p1734 +ssS'valid_types' +p1735 +(dp1736 +S'editable' +p1737 +I01 +sS'value' +p1738 +(lp1739 +S'HumanUser' +p1740 +aS'ApiUser' +p1741 +asssS'description' +p1742 +(dp1743 +S'editable' +p1744 +I01 +sS'value' +p1745 +g47 +ssssS'PhysicalAssetMocapTakeConnection' +p1746 +(dp1747 +S'physical_asset' +p1748 +(dp1749 +S'mandatory' +p1750 +(dp1751 +S'editable' +p1752 +I00 +sS'value' +p1753 +I00 +ssS'name' +p1754 +(dp1755 +S'editable' +p1756 +I01 +sS'value' +p1757 +S'Physical Asset' +p1758 +ssS'data_type' +p1759 +(dp1760 +S'editable' +p1761 +I00 +sS'value' +p1762 +S'entity' +p1763 +ssS'entity_type' +p1764 +(dp1765 +S'editable' +p1766 +I00 +sS'value' +p1767 +S'PhysicalAssetMocapTakeConnection' +p1768 +ssS'editable' +p1769 +(dp1770 +S'editable' +p1771 +I00 +sS'value' +p1772 +I00 +ssS'unique' +p1773 +(dp1774 +S'editable' +p1775 +I00 +sS'value' +p1776 +I00 +ssS'properties' +p1777 +(dp1778 +S'default_value' +p1779 +(dp1780 +S'editable' +p1781 +I00 +sS'value' +p1782 +NssS'summary_default' +p1783 +(dp1784 +S'editable' +p1785 +I00 +sS'value' +p1786 +S'none' +p1787 +ssS'valid_types' +p1788 +(dp1789 +S'editable' +p1790 +I00 +sS'value' +p1791 +(lp1792 +S'PhysicalAsset' +p1793 +asssS'description' +p1794 +(dp1795 +S'editable' +p1796 +I01 +sS'value' +p1797 +g47 +sssS'mocap_take' +p1798 +(dp1799 +S'mandatory' +p1800 +(dp1801 +S'editable' +p1802 +I00 +sS'value' +p1803 +I00 +ssS'name' +p1804 +(dp1805 +S'editable' +p1806 +I01 +sS'value' +p1807 +S'Mocap Take' +p1808 +ssS'data_type' +p1809 +(dp1810 +S'editable' +p1811 +I00 +sS'value' +p1812 +S'entity' +p1813 +ssS'entity_type' +p1814 +(dp1815 +S'editable' +p1816 +I00 +sS'value' +p1817 +S'PhysicalAssetMocapTakeConnection' +p1818 +ssS'editable' +p1819 +(dp1820 +S'editable' +p1821 +I00 +sS'value' +p1822 +I00 +ssS'unique' +p1823 +(dp1824 +S'editable' +p1825 +I00 +sS'value' +p1826 +I00 +ssS'properties' +p1827 +(dp1828 +S'default_value' +p1829 +(dp1830 +S'editable' +p1831 +I00 +sS'value' +p1832 +NssS'summary_default' +p1833 +(dp1834 +S'editable' +p1835 +I00 +sS'value' +p1836 +S'none' +p1837 +ssS'valid_types' +p1838 +(dp1839 +S'editable' +p1840 +I00 +sS'value' +p1841 +(lp1842 +S'MocapTake' +p1843 +asssS'description' +p1844 +(dp1845 +S'editable' +p1846 +I01 +sS'value' +p1847 +g47 +sssS'cached_display_name' +p1848 +(dp1849 +S'mandatory' +p1850 +(dp1851 +S'editable' +p1852 +I00 +sS'value' +p1853 +I00 +ssS'name' +p1854 +(dp1855 +S'editable' +p1856 +I01 +sS'value' +p1857 +S'Cached Display Name' +p1858 +ssS'data_type' +p1859 +(dp1860 +S'editable' +p1861 +I00 +sS'value' +p1862 +S'text' +p1863 +ssS'entity_type' +p1864 +(dp1865 +S'editable' +p1866 +I00 +sS'value' +p1867 +S'PhysicalAssetMocapTakeConnection' +p1868 +ssS'editable' +p1869 +(dp1870 +S'editable' +p1871 +I00 +sS'value' +p1872 +I01 +ssS'unique' +p1873 +(dp1874 +S'editable' +p1875 +I00 +sS'value' +p1876 +I00 +ssS'properties' +p1877 +(dp1878 +S'default_value' +p1879 +(dp1880 +S'editable' +p1881 +I00 +sS'value' +p1882 +NssS'summary_default' +p1883 +(dp1884 +S'editable' +p1885 +I00 +sS'value' +p1886 +S'none' +p1887 +sssS'description' +p1888 +(dp1889 +S'editable' +p1890 +I01 +sS'value' +p1891 +g47 +sssS'id' +p1892 +(dp1893 +S'mandatory' +p1894 +(dp1895 +S'editable' +p1896 +I00 +sS'value' +p1897 +I01 +ssS'name' +p1898 +(dp1899 +S'editable' +p1900 +I01 +sS'value' +p1901 +S'Id' +p1902 +ssS'data_type' +p1903 +(dp1904 +S'editable' +p1905 +I00 +sS'value' +p1906 +S'number' +p1907 +ssS'entity_type' +p1908 +(dp1909 +S'editable' +p1910 +I00 +sS'value' +p1911 +S'PhysicalAssetMocapTakeConnection' +p1912 +ssS'editable' +p1913 +(dp1914 +S'editable' +p1915 +I00 +sS'value' +p1916 +I00 +ssS'unique' +p1917 +(dp1918 +S'editable' +p1919 +I00 +sS'value' +p1920 +I00 +ssS'properties' +p1921 +(dp1922 +S'default_value' +p1923 +(dp1924 +S'editable' +p1925 +I00 +sS'value' +p1926 +NssS'summary_default' +p1927 +(dp1928 +S'editable' +p1929 +I00 +sS'value' +p1930 +S'none' +p1931 +sssS'description' +p1932 +(dp1933 +S'editable' +p1934 +I01 +sS'value' +p1935 +g47 +ssssS'CustomEntity05' +p1936 +(dp1937 +S'open_notes_count' +p1938 +(dp1939 +S'mandatory' +p1940 +(dp1941 +S'editable' +p1942 +I00 +sS'value' +p1943 +I00 +ssS'name' +p1944 +(dp1945 +S'editable' +p1946 +I01 +sS'value' +p1947 +S'Open Notes Count' +p1948 +ssS'data_type' +p1949 +(dp1950 +S'editable' +p1951 +I00 +sS'value' +p1952 +S'text' +p1953 +ssS'entity_type' +p1954 +(dp1955 +S'editable' +p1956 +I00 +sS'value' +p1957 +S'CustomEntity05' +p1958 +ssS'editable' +p1959 +(dp1960 +S'editable' +p1961 +I00 +sS'value' +p1962 +I00 +ssS'unique' +p1963 +(dp1964 +S'editable' +p1965 +I00 +sS'value' +p1966 +I00 +ssS'properties' +p1967 +(dp1968 +S'default_value' +p1969 +(dp1970 +S'editable' +p1971 +I00 +sS'value' +p1972 +NssS'summary_default' +p1973 +(dp1974 +S'editable' +p1975 +I01 +sS'value' +p1976 +S'none' +p1977 +sssS'description' +p1978 +(dp1979 +S'editable' +p1980 +I01 +sS'value' +p1981 +g47 +sssS'code' +p1982 +(dp1983 +S'mandatory' +p1984 +(dp1985 +S'editable' +p1986 +I00 +sS'value' +p1987 +I01 +ssS'name' +p1988 +(dp1989 +S'editable' +p1990 +I01 +sS'value' +p1991 +S'Custom Entity05 Name' +p1992 +ssS'data_type' +p1993 +(dp1994 +S'editable' +p1995 +I00 +sS'value' +p1996 +S'text' +p1997 +ssS'entity_type' +p1998 +(dp1999 +S'editable' +p2000 +I00 +sS'value' +p2001 +S'CustomEntity05' +p2002 +ssS'editable' +p2003 +(dp2004 +S'editable' +p2005 +I00 +sS'value' +p2006 +I01 +ssS'unique' +p2007 +(dp2008 +S'editable' +p2009 +I00 +sS'value' +p2010 +I00 +ssS'properties' +p2011 +(dp2012 +S'default_value' +p2013 +(dp2014 +S'editable' +p2015 +I00 +sS'value' +p2016 +NssS'summary_default' +p2017 +(dp2018 +S'editable' +p2019 +I01 +sS'value' +p2020 +S'none' +p2021 +sssS'description' +p2022 +(dp2023 +S'editable' +p2024 +I01 +sS'value' +p2025 +g47 +sssS'open_notes' +p2026 +(dp2027 +S'mandatory' +p2028 +(dp2029 +S'editable' +p2030 +I00 +sS'value' +p2031 +I00 +ssS'name' +p2032 +(dp2033 +S'editable' +p2034 +I01 +sS'value' +p2035 +S'Open Notes' +p2036 +ssS'data_type' +p2037 +(dp2038 +S'editable' +p2039 +I00 +sS'value' +p2040 +S'multi_entity' +p2041 +ssS'entity_type' +p2042 +(dp2043 +S'editable' +p2044 +I00 +sS'value' +p2045 +S'CustomEntity05' +p2046 +ssS'editable' +p2047 +(dp2048 +S'editable' +p2049 +I00 +sS'value' +p2050 +I00 +ssS'unique' +p2051 +(dp2052 +S'editable' +p2053 +I00 +sS'value' +p2054 +I00 +ssS'properties' +p2055 +(dp2056 +S'default_value' +p2057 +(dp2058 +S'editable' +p2059 +I00 +sS'value' +p2060 +NssS'summary_default' +p2061 +(dp2062 +S'editable' +p2063 +I01 +sS'value' +p2064 +S'none' +p2065 +ssS'valid_types' +p2066 +(dp2067 +S'editable' +p2068 +I01 +sS'value' +p2069 +(lp2070 +S'Note' +p2071 +asssS'description' +p2072 +(dp2073 +S'editable' +p2074 +I01 +sS'value' +p2075 +g47 +sssS'description' +p2076 +(dp2077 +S'mandatory' +p2078 +(dp2079 +S'editable' +p2080 +I00 +sS'value' +p2081 +I00 +ssS'name' +p2082 +(dp2083 +S'editable' +p2084 +I01 +sS'value' +p2085 +S'Description' +p2086 +ssS'data_type' +p2087 +(dp2088 +S'editable' +p2089 +I00 +sS'value' +p2090 +S'text' +p2091 +ssS'entity_type' +p2092 +(dp2093 +S'editable' +p2094 +I00 +sS'value' +p2095 +S'CustomEntity05' +p2096 +ssS'editable' +p2097 +(dp2098 +S'editable' +p2099 +I00 +sS'value' +p2100 +I01 +ssS'unique' +p2101 +(dp2102 +S'editable' +p2103 +I00 +sS'value' +p2104 +I00 +ssS'properties' +p2105 +(dp2106 +S'default_value' +p2107 +(dp2108 +S'editable' +p2109 +I00 +sS'value' +p2110 +NssS'summary_default' +p2111 +(dp2112 +S'editable' +p2113 +I01 +sS'value' +p2114 +S'none' +p2115 +sssS'description' +p2116 +(dp2117 +S'editable' +p2118 +I01 +sS'value' +p2119 +g47 +sssS'created_at' +p2120 +(dp2121 +S'mandatory' +p2122 +(dp2123 +S'editable' +p2124 +I00 +sS'value' +p2125 +I00 +ssS'name' +p2126 +(dp2127 +S'editable' +p2128 +I01 +sS'value' +p2129 +S'Date Created' +p2130 +ssS'data_type' +p2131 +(dp2132 +S'editable' +p2133 +I00 +sS'value' +p2134 +S'date_time' +p2135 +ssS'entity_type' +p2136 +(dp2137 +S'editable' +p2138 +I00 +sS'value' +p2139 +S'CustomEntity05' +p2140 +ssS'editable' +p2141 +(dp2142 +S'editable' +p2143 +I00 +sS'value' +p2144 +I00 +ssS'unique' +p2145 +(dp2146 +S'editable' +p2147 +I00 +sS'value' +p2148 +I00 +ssS'properties' +p2149 +(dp2150 +S'default_value' +p2151 +(dp2152 +S'editable' +p2153 +I00 +sS'value' +p2154 +NssS'summary_default' +p2155 +(dp2156 +S'editable' +p2157 +I01 +sS'value' +p2158 +S'none' +p2159 +sssS'description' +p2160 +(dp2161 +S'editable' +p2162 +I01 +sS'value' +p2163 +g47 +sssS'updated_at' +p2164 +(dp2165 +S'mandatory' +p2166 +(dp2167 +S'editable' +p2168 +I00 +sS'value' +p2169 +I00 +ssS'name' +p2170 +(dp2171 +S'editable' +p2172 +I01 +sS'value' +p2173 +S'Date Updated' +p2174 +ssS'data_type' +p2175 +(dp2176 +S'editable' +p2177 +I00 +sS'value' +p2178 +S'date_time' +p2179 +ssS'entity_type' +p2180 +(dp2181 +S'editable' +p2182 +I00 +sS'value' +p2183 +S'CustomEntity05' +p2184 +ssS'editable' +p2185 +(dp2186 +S'editable' +p2187 +I00 +sS'value' +p2188 +I00 +ssS'unique' +p2189 +(dp2190 +S'editable' +p2191 +I00 +sS'value' +p2192 +I00 +ssS'properties' +p2193 +(dp2194 +S'default_value' +p2195 +(dp2196 +S'editable' +p2197 +I00 +sS'value' +p2198 +NssS'summary_default' +p2199 +(dp2200 +S'editable' +p2201 +I01 +sS'value' +p2202 +S'none' +p2203 +sssS'description' +p2204 +(dp2205 +S'editable' +p2206 +I01 +sS'value' +p2207 +g47 +sssS'created_by' +p2208 +(dp2209 +S'mandatory' +p2210 +(dp2211 +S'editable' +p2212 +I00 +sS'value' +p2213 +I00 +ssS'name' +p2214 +(dp2215 +S'editable' +p2216 +I01 +sS'value' +p2217 +S'Created by' +p2218 +ssS'data_type' +p2219 +(dp2220 +S'editable' +p2221 +I00 +sS'value' +p2222 +S'entity' +p2223 +ssS'entity_type' +p2224 +(dp2225 +S'editable' +p2226 +I00 +sS'value' +p2227 +S'CustomEntity05' +p2228 +ssS'editable' +p2229 +(dp2230 +S'editable' +p2231 +I00 +sS'value' +p2232 +I00 +ssS'unique' +p2233 +(dp2234 +S'editable' +p2235 +I00 +sS'value' +p2236 +I00 +ssS'properties' +p2237 +(dp2238 +S'default_value' +p2239 +(dp2240 +S'editable' +p2241 +I00 +sS'value' +p2242 +NssS'summary_default' +p2243 +(dp2244 +S'editable' +p2245 +I01 +sS'value' +p2246 +S'none' +p2247 +ssS'valid_types' +p2248 +(dp2249 +S'editable' +p2250 +I01 +sS'value' +p2251 +(lp2252 +S'HumanUser' +p2253 +aS'ApiUser' +p2254 +asssS'description' +p2255 +(dp2256 +S'editable' +p2257 +I01 +sS'value' +p2258 +g47 +sssS'project' +p2259 +(dp2260 +S'mandatory' +p2261 +(dp2262 +S'editable' +p2263 +I00 +sS'value' +p2264 +I00 +ssS'name' +p2265 +(dp2266 +S'editable' +p2267 +I01 +sS'value' +p2268 +S'Project' +p2269 +ssS'data_type' +p2270 +(dp2271 +S'editable' +p2272 +I00 +sS'value' +p2273 +S'entity' +p2274 +ssS'entity_type' +p2275 +(dp2276 +S'editable' +p2277 +I00 +sS'value' +p2278 +S'CustomEntity05' +p2279 +ssS'editable' +p2280 +(dp2281 +S'editable' +p2282 +I00 +sS'value' +p2283 +I01 +ssS'unique' +p2284 +(dp2285 +S'editable' +p2286 +I00 +sS'value' +p2287 +I00 +ssS'properties' +p2288 +(dp2289 +S'default_value' +p2290 +(dp2291 +S'editable' +p2292 +I00 +sS'value' +p2293 +NssS'summary_default' +p2294 +(dp2295 +S'editable' +p2296 +I01 +sS'value' +p2297 +S'none' +p2298 +ssS'valid_types' +p2299 +(dp2300 +S'editable' +p2301 +I01 +sS'value' +p2302 +(lp2303 +S'Project' +p2304 +asssS'description' +p2305 +(dp2306 +S'editable' +p2307 +I01 +sS'value' +p2308 +g47 +sssS'filmstrip_image' +p2309 +(dp2310 +S'mandatory' +p2311 +(dp2312 +S'editable' +p2313 +I00 +sS'value' +p2314 +I00 +ssS'name' +p2315 +(dp2316 +S'editable' +p2317 +I01 +sS'value' +p2318 +S'Filmstrip Thumbnail' +p2319 +ssS'data_type' +p2320 +(dp2321 +S'editable' +p2322 +I00 +sS'value' +p2323 +S'image' +p2324 +ssS'entity_type' +p2325 +(dp2326 +S'editable' +p2327 +I00 +sS'value' +p2328 +S'CustomEntity05' +p2329 +ssS'editable' +p2330 +(dp2331 +S'editable' +p2332 +I00 +sS'value' +p2333 +I01 +ssS'unique' +p2334 +(dp2335 +S'editable' +p2336 +I00 +sS'value' +p2337 +I00 +ssS'properties' +p2338 +(dp2339 +S'default_value' +p2340 +(dp2341 +S'editable' +p2342 +I00 +sS'value' +p2343 +NssS'summary_default' +p2344 +(dp2345 +S'editable' +p2346 +I01 +sS'value' +p2347 +S'none' +p2348 +sssS'description' +p2349 +(dp2350 +S'editable' +p2351 +I01 +sS'value' +p2352 +g47 +sssS'sg_status_list' +p2353 +(dp2354 +S'mandatory' +p2355 +(dp2356 +S'editable' +p2357 +I00 +sS'value' +p2358 +I00 +ssS'name' +p2359 +(dp2360 +S'editable' +p2361 +I01 +sS'value' +p2362 +S'Status' +p2363 +ssS'data_type' +p2364 +(dp2365 +S'editable' +p2366 +I00 +sS'value' +p2367 +S'status_list' +p2368 +ssS'entity_type' +p2369 +(dp2370 +S'editable' +p2371 +I00 +sS'value' +p2372 +S'CustomEntity05' +p2373 +ssS'editable' +p2374 +(dp2375 +S'editable' +p2376 +I00 +sS'value' +p2377 +I01 +ssS'unique' +p2378 +(dp2379 +S'editable' +p2380 +I00 +sS'value' +p2381 +I00 +ssS'properties' +p2382 +(dp2383 +S'default_value' +p2384 +(dp2385 +S'editable' +p2386 +I01 +sS'value' +p2387 +S'wtg' +p2388 +ssS'valid_values' +p2389 +(dp2390 +S'editable' +p2391 +I01 +sS'value' +p2392 +(lp2393 +S'cmpt' +p2394 +aS'ip' +p2395 +aS'wtg' +p2396 +assS'summary_default' +p2397 +(dp2398 +S'editable' +p2399 +I01 +sS'value' +p2400 +S'none' +p2401 +sssS'description' +p2402 +(dp2403 +S'editable' +p2404 +I01 +sS'value' +p2405 +g47 +sssS'notes' +p2406 +(dp2407 +S'mandatory' +p2408 +(dp2409 +S'editable' +p2410 +I00 +sS'value' +p2411 +I00 +ssS'name' +p2412 +(dp2413 +S'editable' +p2414 +I01 +sS'value' +p2415 +S'Notes' +p2416 +ssS'data_type' +p2417 +(dp2418 +S'editable' +p2419 +I00 +sS'value' +p2420 +S'multi_entity' +p2421 +ssS'entity_type' +p2422 +(dp2423 +S'editable' +p2424 +I00 +sS'value' +p2425 +S'CustomEntity05' +p2426 +ssS'editable' +p2427 +(dp2428 +S'editable' +p2429 +I00 +sS'value' +p2430 +I01 +ssS'unique' +p2431 +(dp2432 +S'editable' +p2433 +I00 +sS'value' +p2434 +I00 +ssS'properties' +p2435 +(dp2436 +S'default_value' +p2437 +(dp2438 +S'editable' +p2439 +I00 +sS'value' +p2440 +NssS'summary_default' +p2441 +(dp2442 +S'editable' +p2443 +I01 +sS'value' +p2444 +S'none' +p2445 +ssS'valid_types' +p2446 +(dp2447 +S'editable' +p2448 +I01 +sS'value' +p2449 +(lp2450 +S'Note' +p2451 +asssS'description' +p2452 +(dp2453 +S'editable' +p2454 +I01 +sS'value' +p2455 +g47 +sssS'image' +p2456 +(dp2457 +S'mandatory' +p2458 +(dp2459 +S'editable' +p2460 +I00 +sS'value' +p2461 +I00 +ssS'name' +p2462 +(dp2463 +S'editable' +p2464 +I01 +sS'value' +p2465 +S'Thumbnail' +p2466 +ssS'data_type' +p2467 +(dp2468 +S'editable' +p2469 +I00 +sS'value' +p2470 +S'image' +p2471 +ssS'entity_type' +p2472 +(dp2473 +S'editable' +p2474 +I00 +sS'value' +p2475 +S'CustomEntity05' +p2476 +ssS'editable' +p2477 +(dp2478 +S'editable' +p2479 +I00 +sS'value' +p2480 +I01 +ssS'unique' +p2481 +(dp2482 +S'editable' +p2483 +I00 +sS'value' +p2484 +I00 +ssS'properties' +p2485 +(dp2486 +S'default_value' +p2487 +(dp2488 +S'editable' +p2489 +I00 +sS'value' +p2490 +NssS'summary_default' +p2491 +(dp2492 +S'editable' +p2493 +I01 +sS'value' +p2494 +S'none' +p2495 +sssS'description' +p2496 +(dp2497 +S'editable' +p2498 +I01 +sS'value' +p2499 +g47 +sssS'cached_display_name' +p2500 +(dp2501 +S'mandatory' +p2502 +(dp2503 +S'editable' +p2504 +I00 +sS'value' +p2505 +I00 +ssS'name' +p2506 +(dp2507 +S'editable' +p2508 +I01 +sS'value' +p2509 +S'Cached Display Name' +p2510 +ssS'data_type' +p2511 +(dp2512 +S'editable' +p2513 +I00 +sS'value' +p2514 +S'text' +p2515 +ssS'entity_type' +p2516 +(dp2517 +S'editable' +p2518 +I00 +sS'value' +p2519 +S'CustomEntity05' +p2520 +ssS'editable' +p2521 +(dp2522 +S'editable' +p2523 +I00 +sS'value' +p2524 +I01 +ssS'unique' +p2525 +(dp2526 +S'editable' +p2527 +I00 +sS'value' +p2528 +I00 +ssS'properties' +p2529 +(dp2530 +S'default_value' +p2531 +(dp2532 +S'editable' +p2533 +I00 +sS'value' +p2534 +NssS'summary_default' +p2535 +(dp2536 +S'editable' +p2537 +I00 +sS'value' +p2538 +S'none' +p2539 +sssS'description' +p2540 +(dp2541 +S'editable' +p2542 +I01 +sS'value' +p2543 +g47 +sssS'tag_list' +p2544 +(dp2545 +S'mandatory' +p2546 +(dp2547 +S'editable' +p2548 +I00 +sS'value' +p2549 +I00 +ssS'name' +p2550 +(dp2551 +S'editable' +p2552 +I01 +sS'value' +p2553 +S'Tags' +p2554 +ssS'data_type' +p2555 +(dp2556 +S'editable' +p2557 +I00 +sS'value' +p2558 +S'tag_list' +p2559 +ssS'entity_type' +p2560 +(dp2561 +S'editable' +p2562 +I00 +sS'value' +p2563 +S'CustomEntity05' +p2564 +ssS'editable' +p2565 +(dp2566 +S'editable' +p2567 +I00 +sS'value' +p2568 +I01 +ssS'unique' +p2569 +(dp2570 +S'editable' +p2571 +I00 +sS'value' +p2572 +I00 +ssS'properties' +p2573 +(dp2574 +S'default_value' +p2575 +(dp2576 +S'editable' +p2577 +I00 +sS'value' +p2578 +NssS'summary_default' +p2579 +(dp2580 +S'editable' +p2581 +I01 +sS'value' +p2582 +S'none' +p2583 +ssS'valid_types' +p2584 +(dp2585 +S'editable' +p2586 +I01 +sS'value' +p2587 +(lp2588 +S'Tag' +p2589 +asssS'description' +p2590 +(dp2591 +S'editable' +p2592 +I01 +sS'value' +p2593 +g47 +sssS'id' +p2594 +(dp2595 +S'mandatory' +p2596 +(dp2597 +S'editable' +p2598 +I00 +sS'value' +p2599 +I00 +ssS'name' +p2600 +(dp2601 +S'editable' +p2602 +I01 +sS'value' +p2603 +S'Id' +p2604 +ssS'data_type' +p2605 +(dp2606 +S'editable' +p2607 +I00 +sS'value' +p2608 +S'number' +p2609 +ssS'entity_type' +p2610 +(dp2611 +S'editable' +p2612 +I00 +sS'value' +p2613 +S'CustomEntity05' +p2614 +ssS'editable' +p2615 +(dp2616 +S'editable' +p2617 +I00 +sS'value' +p2618 +I00 +ssS'unique' +p2619 +(dp2620 +S'editable' +p2621 +I00 +sS'value' +p2622 +I00 +ssS'properties' +p2623 +(dp2624 +S'default_value' +p2625 +(dp2626 +S'editable' +p2627 +I00 +sS'value' +p2628 +NssS'summary_default' +p2629 +(dp2630 +S'editable' +p2631 +I01 +sS'value' +p2632 +S'none' +p2633 +sssS'description' +p2634 +(dp2635 +S'editable' +p2636 +I01 +sS'value' +p2637 +g47 +sssS'updated_by' +p2638 +(dp2639 +S'mandatory' +p2640 +(dp2641 +S'editable' +p2642 +I00 +sS'value' +p2643 +I00 +ssS'name' +p2644 +(dp2645 +S'editable' +p2646 +I01 +sS'value' +p2647 +S'Updated by' +p2648 +ssS'data_type' +p2649 +(dp2650 +S'editable' +p2651 +I00 +sS'value' +p2652 +S'entity' +p2653 +ssS'entity_type' +p2654 +(dp2655 +S'editable' +p2656 +I00 +sS'value' +p2657 +S'CustomEntity05' +p2658 +ssS'editable' +p2659 +(dp2660 +S'editable' +p2661 +I00 +sS'value' +p2662 +I00 +ssS'unique' +p2663 +(dp2664 +S'editable' +p2665 +I00 +sS'value' +p2666 +I00 +ssS'properties' +p2667 +(dp2668 +S'default_value' +p2669 +(dp2670 +S'editable' +p2671 +I00 +sS'value' +p2672 +NssS'summary_default' +p2673 +(dp2674 +S'editable' +p2675 +I01 +sS'value' +p2676 +S'none' +p2677 +ssS'valid_types' +p2678 +(dp2679 +S'editable' +p2680 +I01 +sS'value' +p2681 +(lp2682 +S'HumanUser' +p2683 +aS'ApiUser' +p2684 +asssS'description' +p2685 +(dp2686 +S'editable' +p2687 +I01 +sS'value' +p2688 +g47 +ssssS'Note' +p2689 +(dp2690 +S'project' +p2691 +(dp2692 +S'mandatory' +p2693 +(dp2694 +S'editable' +p2695 +I00 +sS'value' +p2696 +I00 +ssS'name' +p2697 +(dp2698 +S'editable' +p2699 +I01 +sS'value' +p2700 +S'Project' +p2701 +ssS'data_type' +p2702 +(dp2703 +S'editable' +p2704 +I00 +sS'value' +p2705 +S'entity' +p2706 +ssS'entity_type' +p2707 +(dp2708 +S'editable' +p2709 +I00 +sS'value' +p2710 +S'Note' +p2711 +ssS'editable' +p2712 +(dp2713 +S'editable' +p2714 +I00 +sS'value' +p2715 +I01 +ssS'unique' +p2716 +(dp2717 +S'editable' +p2718 +I00 +sS'value' +p2719 +I00 +ssS'properties' +p2720 +(dp2721 +S'default_value' +p2722 +(dp2723 +S'editable' +p2724 +I00 +sS'value' +p2725 +NssS'summary_default' +p2726 +(dp2727 +S'editable' +p2728 +I01 +sS'value' +p2729 +S'none' +p2730 +ssS'valid_types' +p2731 +(dp2732 +S'editable' +p2733 +I01 +sS'value' +p2734 +(lp2735 +S'Project' +p2736 +asssS'description' +p2737 +(dp2738 +S'editable' +p2739 +I01 +sS'value' +p2740 +g47 +sssS'playlist' +p2741 +(dp2742 +S'mandatory' +p2743 +(dp2744 +S'editable' +p2745 +I00 +sS'value' +p2746 +I00 +ssS'name' +p2747 +(dp2748 +S'editable' +p2749 +I01 +sS'value' +p2750 +S'Playlist' +p2751 +ssS'data_type' +p2752 +(dp2753 +S'editable' +p2754 +I00 +sS'value' +p2755 +S'entity' +p2756 +ssS'entity_type' +p2757 +(dp2758 +S'editable' +p2759 +I00 +sS'value' +p2760 +S'Note' +p2761 +ssS'editable' +p2762 +(dp2763 +S'editable' +p2764 +I00 +sS'value' +p2765 +I01 +ssS'unique' +p2766 +(dp2767 +S'editable' +p2768 +I00 +sS'value' +p2769 +I00 +ssS'properties' +p2770 +(dp2771 +S'default_value' +p2772 +(dp2773 +S'editable' +p2774 +I00 +sS'value' +p2775 +NssS'summary_default' +p2776 +(dp2777 +S'editable' +p2778 +I00 +sS'value' +p2779 +S'none' +p2780 +ssS'valid_types' +p2781 +(dp2782 +S'editable' +p2783 +I00 +sS'value' +p2784 +(lp2785 +S'Playlist' +p2786 +asssS'description' +p2787 +(dp2788 +S'editable' +p2789 +I01 +sS'value' +p2790 +g47 +sssS'tasks' +p2791 +(dp2792 +S'mandatory' +p2793 +(dp2794 +S'editable' +p2795 +I00 +sS'value' +p2796 +I00 +ssS'name' +p2797 +(dp2798 +S'editable' +p2799 +I01 +sS'value' +p2800 +S'Tasks' +p2801 +ssS'data_type' +p2802 +(dp2803 +S'editable' +p2804 +I00 +sS'value' +p2805 +S'multi_entity' +p2806 +ssS'entity_type' +p2807 +(dp2808 +S'editable' +p2809 +I00 +sS'value' +p2810 +S'Note' +p2811 +ssS'editable' +p2812 +(dp2813 +S'editable' +p2814 +I00 +sS'value' +p2815 +I01 +ssS'unique' +p2816 +(dp2817 +S'editable' +p2818 +I00 +sS'value' +p2819 +I00 +ssS'properties' +p2820 +(dp2821 +S'default_value' +p2822 +(dp2823 +S'editable' +p2824 +I00 +sS'value' +p2825 +NssS'summary_default' +p2826 +(dp2827 +S'editable' +p2828 +I01 +sS'value' +p2829 +S'none' +p2830 +ssS'valid_types' +p2831 +(dp2832 +S'editable' +p2833 +I01 +sS'value' +p2834 +(lp2835 +S'Task' +p2836 +asssS'description' +p2837 +(dp2838 +S'editable' +p2839 +I01 +sS'value' +p2840 +g47 +sssS'note_links' +p2841 +(dp2842 +S'mandatory' +p2843 +(dp2844 +S'editable' +p2845 +I00 +sS'value' +p2846 +I00 +ssS'name' +p2847 +(dp2848 +S'editable' +p2849 +I01 +sS'value' +p2850 +S'Links' +p2851 +ssS'data_type' +p2852 +(dp2853 +S'editable' +p2854 +I00 +sS'value' +p2855 +S'multi_entity' +p2856 +ssS'entity_type' +p2857 +(dp2858 +S'editable' +p2859 +I00 +sS'value' +p2860 +S'Note' +p2861 +ssS'editable' +p2862 +(dp2863 +S'editable' +p2864 +I00 +sS'value' +p2865 +I01 +ssS'unique' +p2866 +(dp2867 +S'editable' +p2868 +I00 +sS'value' +p2869 +I00 +ssS'properties' +p2870 +(dp2871 +S'default_value' +p2872 +(dp2873 +S'editable' +p2874 +I00 +sS'value' +p2875 +NssS'summary_default' +p2876 +(dp2877 +S'editable' +p2878 +I01 +sS'value' +p2879 +S'none' +p2880 +ssS'valid_types' +p2881 +(dp2882 +S'editable' +p2883 +I01 +sS'value' +p2884 +(lp2885 +S'Asset' +p2886 +aS'Shot' +p2887 +aS'Version' +p2888 +aS'Group' +p2889 +aS'TaskTemplate' +p2890 +aS'Playlist' +p2891 +aS'Booking' +p2892 +aS'Department' +p2893 +aS'Phase' +p2894 +aS'Sequence' +p2895 +aS'PublishedFile' +p2896 +aS'TankPublishedFile' +p2897 +aS'CustomEntity01' +p2898 +aS'Scene' +p2899 +aS'CustomEntity02' +p2900 +aS'CustomEntity03' +p2901 +aS'CustomEntity04' +p2902 +aS'CustomEntity05' +p2903 +aS'CustomNonProjectEntity01' +p2904 +aS'CustomNonProjectEntity02' +p2905 +aS'CustomNonProjectEntity03' +p2906 +aS'Element' +p2907 +aS'AssetLibrary' +p2908 +asssS'description' +p2909 +(dp2910 +S'editable' +p2911 +I01 +sS'value' +p2912 +g47 +sssS'attachments' +p2913 +(dp2914 +S'mandatory' +p2915 +(dp2916 +S'editable' +p2917 +I00 +sS'value' +p2918 +I00 +ssS'name' +p2919 +(dp2920 +S'editable' +p2921 +I01 +sS'value' +p2922 +S'Attachments' +p2923 +ssS'data_type' +p2924 +(dp2925 +S'editable' +p2926 +I00 +sS'value' +p2927 +S'multi_entity' +p2928 +ssS'entity_type' +p2929 +(dp2930 +S'editable' +p2931 +I00 +sS'value' +p2932 +S'Note' +p2933 +ssS'editable' +p2934 +(dp2935 +S'editable' +p2936 +I00 +sS'value' +p2937 +I01 +ssS'unique' +p2938 +(dp2939 +S'editable' +p2940 +I00 +sS'value' +p2941 +I00 +ssS'properties' +p2942 +(dp2943 +S'default_value' +p2944 +(dp2945 +S'editable' +p2946 +I00 +sS'value' +p2947 +NssS'summary_default' +p2948 +(dp2949 +S'editable' +p2950 +I01 +sS'value' +p2951 +S'none' +p2952 +ssS'valid_types' +p2953 +(dp2954 +S'editable' +p2955 +I01 +sS'value' +p2956 +(lp2957 +S'Attachment' +p2958 +asssS'description' +p2959 +(dp2960 +S'editable' +p2961 +I01 +sS'value' +p2962 +g47 +sssS'addressings_cc' +p2963 +(dp2964 +S'mandatory' +p2965 +(dp2966 +S'editable' +p2967 +I00 +sS'value' +p2968 +I00 +ssS'name' +p2969 +(dp2970 +S'editable' +p2971 +I01 +sS'value' +p2972 +S'Cc' +p2973 +ssS'data_type' +p2974 +(dp2975 +S'editable' +p2976 +I00 +sS'value' +p2977 +S'multi_entity' +p2978 +ssS'entity_type' +p2979 +(dp2980 +S'editable' +p2981 +I00 +sS'value' +p2982 +S'Note' +p2983 +ssS'editable' +p2984 +(dp2985 +S'editable' +p2986 +I00 +sS'value' +p2987 +I01 +ssS'unique' +p2988 +(dp2989 +S'editable' +p2990 +I00 +sS'value' +p2991 +I00 +ssS'properties' +p2992 +(dp2993 +S'default_value' +p2994 +(dp2995 +S'editable' +p2996 +I00 +sS'value' +p2997 +NssS'summary_default' +p2998 +(dp2999 +S'editable' +p3000 +I01 +sS'value' +p3001 +S'none' +p3002 +ssS'valid_types' +p3003 +(dp3004 +S'editable' +p3005 +I01 +sS'value' +p3006 +(lp3007 +S'Group' +p3008 +aS'HumanUser' +p3009 +asssS'description' +p3010 +(dp3011 +S'editable' +p3012 +I01 +sS'value' +p3013 +g47 +sssS'tag_list' +p3014 +(dp3015 +S'mandatory' +p3016 +(dp3017 +S'editable' +p3018 +I00 +sS'value' +p3019 +I00 +ssS'name' +p3020 +(dp3021 +S'editable' +p3022 +I01 +sS'value' +p3023 +S'Tags' +p3024 +ssS'data_type' +p3025 +(dp3026 +S'editable' +p3027 +I00 +sS'value' +p3028 +S'tag_list' +p3029 +ssS'entity_type' +p3030 +(dp3031 +S'editable' +p3032 +I00 +sS'value' +p3033 +S'Note' +p3034 +ssS'editable' +p3035 +(dp3036 +S'editable' +p3037 +I00 +sS'value' +p3038 +I01 +ssS'unique' +p3039 +(dp3040 +S'editable' +p3041 +I00 +sS'value' +p3042 +I00 +ssS'properties' +p3043 +(dp3044 +S'default_value' +p3045 +(dp3046 +S'editable' +p3047 +I00 +sS'value' +p3048 +NssS'summary_default' +p3049 +(dp3050 +S'editable' +p3051 +I01 +sS'value' +p3052 +S'none' +p3053 +ssS'valid_types' +p3054 +(dp3055 +S'editable' +p3056 +I01 +sS'value' +p3057 +(lp3058 +S'Tag' +p3059 +asssS'description' +p3060 +(dp3061 +S'editable' +p3062 +I01 +sS'value' +p3063 +g47 +sssS'created_at' +p3064 +(dp3065 +S'mandatory' +p3066 +(dp3067 +S'editable' +p3068 +I00 +sS'value' +p3069 +I00 +ssS'name' +p3070 +(dp3071 +S'editable' +p3072 +I01 +sS'value' +p3073 +S'Date Created' +p3074 +ssS'data_type' +p3075 +(dp3076 +S'editable' +p3077 +I00 +sS'value' +p3078 +S'date_time' +p3079 +ssS'entity_type' +p3080 +(dp3081 +S'editable' +p3082 +I00 +sS'value' +p3083 +S'Note' +p3084 +ssS'editable' +p3085 +(dp3086 +S'editable' +p3087 +I00 +sS'value' +p3088 +I00 +ssS'unique' +p3089 +(dp3090 +S'editable' +p3091 +I00 +sS'value' +p3092 +I00 +ssS'properties' +p3093 +(dp3094 +S'default_value' +p3095 +(dp3096 +S'editable' +p3097 +I00 +sS'value' +p3098 +NssS'summary_default' +p3099 +(dp3100 +S'editable' +p3101 +I01 +sS'value' +p3102 +S'none' +p3103 +sssS'description' +p3104 +(dp3105 +S'editable' +p3106 +I01 +sS'value' +p3107 +g47 +sssS'addressings_to' +p3108 +(dp3109 +S'mandatory' +p3110 +(dp3111 +S'editable' +p3112 +I00 +sS'value' +p3113 +I00 +ssS'name' +p3114 +(dp3115 +S'editable' +p3116 +I01 +sS'value' +p3117 +S'To' +p3118 +ssS'data_type' +p3119 +(dp3120 +S'editable' +p3121 +I00 +sS'value' +p3122 +S'multi_entity' +p3123 +ssS'entity_type' +p3124 +(dp3125 +S'editable' +p3126 +I00 +sS'value' +p3127 +S'Note' +p3128 +ssS'editable' +p3129 +(dp3130 +S'editable' +p3131 +I00 +sS'value' +p3132 +I01 +ssS'unique' +p3133 +(dp3134 +S'editable' +p3135 +I00 +sS'value' +p3136 +I00 +ssS'properties' +p3137 +(dp3138 +S'default_value' +p3139 +(dp3140 +S'editable' +p3141 +I00 +sS'value' +p3142 +NssS'summary_default' +p3143 +(dp3144 +S'editable' +p3145 +I01 +sS'value' +p3146 +S'none' +p3147 +ssS'valid_types' +p3148 +(dp3149 +S'editable' +p3150 +I01 +sS'value' +p3151 +(lp3152 +S'Group' +p3153 +aS'HumanUser' +p3154 +asssS'description' +p3155 +(dp3156 +S'editable' +p3157 +I01 +sS'value' +p3158 +g47 +sssS'updated_at' +p3159 +(dp3160 +S'mandatory' +p3161 +(dp3162 +S'editable' +p3163 +I00 +sS'value' +p3164 +I00 +ssS'name' +p3165 +(dp3166 +S'editable' +p3167 +I01 +sS'value' +p3168 +S'Date Updated' +p3169 +ssS'data_type' +p3170 +(dp3171 +S'editable' +p3172 +I00 +sS'value' +p3173 +S'date_time' +p3174 +ssS'entity_type' +p3175 +(dp3176 +S'editable' +p3177 +I00 +sS'value' +p3178 +S'Note' +p3179 +ssS'editable' +p3180 +(dp3181 +S'editable' +p3182 +I00 +sS'value' +p3183 +I00 +ssS'unique' +p3184 +(dp3185 +S'editable' +p3186 +I00 +sS'value' +p3187 +I00 +ssS'properties' +p3188 +(dp3189 +S'default_value' +p3190 +(dp3191 +S'editable' +p3192 +I00 +sS'value' +p3193 +NssS'summary_default' +p3194 +(dp3195 +S'editable' +p3196 +I01 +sS'value' +p3197 +S'none' +p3198 +sssS'description' +p3199 +(dp3200 +S'editable' +p3201 +I01 +sS'value' +p3202 +g47 +sssS'created_by' +p3203 +(dp3204 +S'mandatory' +p3205 +(dp3206 +S'editable' +p3207 +I00 +sS'value' +p3208 +I00 +ssS'name' +p3209 +(dp3210 +S'editable' +p3211 +I01 +sS'value' +p3212 +S'Created by' +p3213 +ssS'data_type' +p3214 +(dp3215 +S'editable' +p3216 +I00 +sS'value' +p3217 +S'entity' +p3218 +ssS'entity_type' +p3219 +(dp3220 +S'editable' +p3221 +I00 +sS'value' +p3222 +S'Note' +p3223 +ssS'editable' +p3224 +(dp3225 +S'editable' +p3226 +I00 +sS'value' +p3227 +I00 +ssS'unique' +p3228 +(dp3229 +S'editable' +p3230 +I00 +sS'value' +p3231 +I00 +ssS'properties' +p3232 +(dp3233 +S'default_value' +p3234 +(dp3235 +S'editable' +p3236 +I00 +sS'value' +p3237 +NssS'summary_default' +p3238 +(dp3239 +S'editable' +p3240 +I01 +sS'value' +p3241 +S'none' +p3242 +ssS'valid_types' +p3243 +(dp3244 +S'editable' +p3245 +I01 +sS'value' +p3246 +(lp3247 +S'HumanUser' +p3248 +aS'ApiUser' +p3249 +asssS'description' +p3250 +(dp3251 +S'editable' +p3252 +I01 +sS'value' +p3253 +g47 +sssS'content' +p3254 +(dp3255 +S'mandatory' +p3256 +(dp3257 +S'editable' +p3258 +I00 +sS'value' +p3259 +I00 +ssS'name' +p3260 +(dp3261 +S'editable' +p3262 +I01 +sS'value' +p3263 +S'Body' +p3264 +ssS'data_type' +p3265 +(dp3266 +S'editable' +p3267 +I00 +sS'value' +p3268 +S'text' +p3269 +ssS'entity_type' +p3270 +(dp3271 +S'editable' +p3272 +I00 +sS'value' +p3273 +S'Note' +p3274 +ssS'editable' +p3275 +(dp3276 +S'editable' +p3277 +I00 +sS'value' +p3278 +I01 +ssS'unique' +p3279 +(dp3280 +S'editable' +p3281 +I00 +sS'value' +p3282 +I00 +ssS'properties' +p3283 +(dp3284 +S'default_value' +p3285 +(dp3286 +S'editable' +p3287 +I00 +sS'value' +p3288 +NssS'summary_default' +p3289 +(dp3290 +S'editable' +p3291 +I01 +sS'value' +p3292 +S'none' +p3293 +sssS'description' +p3294 +(dp3295 +S'editable' +p3296 +I01 +sS'value' +p3297 +g47 +sssS'updated_by' +p3298 +(dp3299 +S'mandatory' +p3300 +(dp3301 +S'editable' +p3302 +I00 +sS'value' +p3303 +I00 +ssS'name' +p3304 +(dp3305 +S'editable' +p3306 +I01 +sS'value' +p3307 +S'Updated by' +p3308 +ssS'data_type' +p3309 +(dp3310 +S'editable' +p3311 +I00 +sS'value' +p3312 +S'entity' +p3313 +ssS'entity_type' +p3314 +(dp3315 +S'editable' +p3316 +I00 +sS'value' +p3317 +S'Note' +p3318 +ssS'editable' +p3319 +(dp3320 +S'editable' +p3321 +I00 +sS'value' +p3322 +I00 +ssS'unique' +p3323 +(dp3324 +S'editable' +p3325 +I00 +sS'value' +p3326 +I00 +ssS'properties' +p3327 +(dp3328 +S'default_value' +p3329 +(dp3330 +S'editable' +p3331 +I00 +sS'value' +p3332 +NssS'summary_default' +p3333 +(dp3334 +S'editable' +p3335 +I01 +sS'value' +p3336 +S'none' +p3337 +ssS'valid_types' +p3338 +(dp3339 +S'editable' +p3340 +I01 +sS'value' +p3341 +(lp3342 +S'HumanUser' +p3343 +aS'ApiUser' +p3344 +asssS'description' +p3345 +(dp3346 +S'editable' +p3347 +I01 +sS'value' +p3348 +g47 +sssS'sg_status_list' +p3349 +(dp3350 +S'mandatory' +p3351 +(dp3352 +S'editable' +p3353 +I00 +sS'value' +p3354 +I00 +ssS'name' +p3355 +(dp3356 +S'editable' +p3357 +I01 +sS'value' +p3358 +S'Status' +p3359 +ssS'data_type' +p3360 +(dp3361 +S'editable' +p3362 +I00 +sS'value' +p3363 +S'status_list' +p3364 +ssS'entity_type' +p3365 +(dp3366 +S'editable' +p3367 +I00 +sS'value' +p3368 +S'Note' +p3369 +ssS'editable' +p3370 +(dp3371 +S'editable' +p3372 +I00 +sS'value' +p3373 +I01 +ssS'unique' +p3374 +(dp3375 +S'editable' +p3376 +I00 +sS'value' +p3377 +I00 +ssS'properties' +p3378 +(dp3379 +S'default_value' +p3380 +(dp3381 +S'editable' +p3382 +I01 +sS'value' +p3383 +S'opn' +p3384 +ssS'valid_values' +p3385 +(dp3386 +S'editable' +p3387 +I01 +sS'value' +p3388 +(lp3389 +S'clsd' +p3390 +aS'ip' +p3391 +aS'opn' +p3392 +assS'summary_default' +p3393 +(dp3394 +S'editable' +p3395 +I01 +sS'value' +p3396 +S'none' +p3397 +sssS'description' +p3398 +(dp3399 +S'editable' +p3400 +I01 +sS'value' +p3401 +g47 +sssS'user' +p3402 +(dp3403 +S'mandatory' +p3404 +(dp3405 +S'editable' +p3406 +I00 +sS'value' +p3407 +I00 +ssS'name' +p3408 +(dp3409 +S'editable' +p3410 +I01 +sS'value' +p3411 +S'Author' +p3412 +ssS'data_type' +p3413 +(dp3414 +S'editable' +p3415 +I00 +sS'value' +p3416 +S'entity' +p3417 +ssS'entity_type' +p3418 +(dp3419 +S'editable' +p3420 +I00 +sS'value' +p3421 +S'Note' +p3422 +ssS'editable' +p3423 +(dp3424 +S'editable' +p3425 +I00 +sS'value' +p3426 +I01 +ssS'unique' +p3427 +(dp3428 +S'editable' +p3429 +I00 +sS'value' +p3430 +I00 +ssS'properties' +p3431 +(dp3432 +S'default_value' +p3433 +(dp3434 +S'editable' +p3435 +I00 +sS'value' +p3436 +NssS'summary_default' +p3437 +(dp3438 +S'editable' +p3439 +I01 +sS'value' +p3440 +S'none' +p3441 +ssS'valid_types' +p3442 +(dp3443 +S'editable' +p3444 +I01 +sS'value' +p3445 +(lp3446 +S'HumanUser' +p3447 +aS'ApiUser' +p3448 +asssS'description' +p3449 +(dp3450 +S'editable' +p3451 +I01 +sS'value' +p3452 +g47 +sssS'replies' +p3453 +(dp3454 +S'mandatory' +p3455 +(dp3456 +S'editable' +p3457 +I00 +sS'value' +p3458 +I00 +ssS'name' +p3459 +(dp3460 +S'editable' +p3461 +I01 +sS'value' +p3462 +S'Replies' +p3463 +ssS'data_type' +p3464 +(dp3465 +S'editable' +p3466 +I00 +sS'value' +p3467 +S'multi_entity' +p3468 +ssS'entity_type' +p3469 +(dp3470 +S'editable' +p3471 +I00 +sS'value' +p3472 +S'Note' +p3473 +ssS'editable' +p3474 +(dp3475 +S'editable' +p3476 +I00 +sS'value' +p3477 +I01 +ssS'unique' +p3478 +(dp3479 +S'editable' +p3480 +I00 +sS'value' +p3481 +I00 +ssS'properties' +p3482 +(dp3483 +S'default_value' +p3484 +(dp3485 +S'editable' +p3486 +I00 +sS'value' +p3487 +NssS'summary_default' +p3488 +(dp3489 +S'editable' +p3490 +I01 +sS'value' +p3491 +S'none' +p3492 +ssS'valid_types' +p3493 +(dp3494 +S'editable' +p3495 +I01 +sS'value' +p3496 +(lp3497 +S'Reply' +p3498 +asssS'description' +p3499 +(dp3500 +S'editable' +p3501 +I01 +sS'value' +p3502 +g47 +sssS'sg_note_type' +p3503 +(dp3504 +S'mandatory' +p3505 +(dp3506 +S'editable' +p3507 +I00 +sS'value' +p3508 +I00 +ssS'name' +p3509 +(dp3510 +S'editable' +p3511 +I01 +sS'value' +p3512 +S'Type' +p3513 +ssS'data_type' +p3514 +(dp3515 +S'editable' +p3516 +I00 +sS'value' +p3517 +S'list' +p3518 +ssS'entity_type' +p3519 +(dp3520 +S'editable' +p3521 +I00 +sS'value' +p3522 +S'Note' +p3523 +ssS'editable' +p3524 +(dp3525 +S'editable' +p3526 +I00 +sS'value' +p3527 +I01 +ssS'unique' +p3528 +(dp3529 +S'editable' +p3530 +I00 +sS'value' +p3531 +I00 +ssS'properties' +p3532 +(dp3533 +S'default_value' +p3534 +(dp3535 +S'editable' +p3536 +I00 +sS'value' +p3537 +NssS'valid_values' +p3538 +(dp3539 +S'editable' +p3540 +I01 +sS'value' +p3541 +(lp3542 +S'Internal' +p3543 +aS'Client' +p3544 +aS'this list can be edited...' +p3545 +assS'summary_default' +p3546 +(dp3547 +S'editable' +p3548 +I01 +sS'value' +p3549 +S'none' +p3550 +sssS'description' +p3551 +(dp3552 +S'editable' +p3553 +I01 +sS'value' +p3554 +g47 +sssS'cached_display_name' +p3555 +(dp3556 +S'mandatory' +p3557 +(dp3558 +S'editable' +p3559 +I00 +sS'value' +p3560 +I00 +ssS'name' +p3561 +(dp3562 +S'editable' +p3563 +I01 +sS'value' +p3564 +S'Cached Display Name' +p3565 +ssS'data_type' +p3566 +(dp3567 +S'editable' +p3568 +I00 +sS'value' +p3569 +S'text' +p3570 +ssS'entity_type' +p3571 +(dp3572 +S'editable' +p3573 +I00 +sS'value' +p3574 +S'Note' +p3575 +ssS'editable' +p3576 +(dp3577 +S'editable' +p3578 +I00 +sS'value' +p3579 +I01 +ssS'unique' +p3580 +(dp3581 +S'editable' +p3582 +I00 +sS'value' +p3583 +I00 +ssS'properties' +p3584 +(dp3585 +S'default_value' +p3586 +(dp3587 +S'editable' +p3588 +I00 +sS'value' +p3589 +NssS'summary_default' +p3590 +(dp3591 +S'editable' +p3592 +I00 +sS'value' +p3593 +S'none' +p3594 +sssS'description' +p3595 +(dp3596 +S'editable' +p3597 +I01 +sS'value' +p3598 +g47 +sssS'reply_content' +p3599 +(dp3600 +S'mandatory' +p3601 +(dp3602 +S'editable' +p3603 +I00 +sS'value' +p3604 +I00 +ssS'name' +p3605 +(dp3606 +S'editable' +p3607 +I01 +sS'value' +p3608 +S'Reply Content' +p3609 +ssS'data_type' +p3610 +(dp3611 +S'editable' +p3612 +I00 +sS'value' +p3613 +S'text' +p3614 +ssS'entity_type' +p3615 +(dp3616 +S'editable' +p3617 +I00 +sS'value' +p3618 +S'Note' +p3619 +ssS'editable' +p3620 +(dp3621 +S'editable' +p3622 +I00 +sS'value' +p3623 +I01 +ssS'unique' +p3624 +(dp3625 +S'editable' +p3626 +I00 +sS'value' +p3627 +I00 +ssS'properties' +p3628 +(dp3629 +S'default_value' +p3630 +(dp3631 +S'editable' +p3632 +I00 +sS'value' +p3633 +NssS'summary_default' +p3634 +(dp3635 +S'editable' +p3636 +I01 +sS'value' +p3637 +S'none' +p3638 +sssS'description' +p3639 +(dp3640 +S'editable' +p3641 +I01 +sS'value' +p3642 +g47 +sssS'id' +p3643 +(dp3644 +S'mandatory' +p3645 +(dp3646 +S'editable' +p3647 +I00 +sS'value' +p3648 +I00 +ssS'name' +p3649 +(dp3650 +S'editable' +p3651 +I01 +sS'value' +p3652 +S'Id' +p3653 +ssS'data_type' +p3654 +(dp3655 +S'editable' +p3656 +I00 +sS'value' +p3657 +S'number' +p3658 +ssS'entity_type' +p3659 +(dp3660 +S'editable' +p3661 +I00 +sS'value' +p3662 +S'Note' +p3663 +ssS'editable' +p3664 +(dp3665 +S'editable' +p3666 +I00 +sS'value' +p3667 +I00 +ssS'unique' +p3668 +(dp3669 +S'editable' +p3670 +I00 +sS'value' +p3671 +I00 +ssS'properties' +p3672 +(dp3673 +S'default_value' +p3674 +(dp3675 +S'editable' +p3676 +I00 +sS'value' +p3677 +NssS'summary_default' +p3678 +(dp3679 +S'editable' +p3680 +I01 +sS'value' +p3681 +S'none' +p3682 +sssS'description' +p3683 +(dp3684 +S'editable' +p3685 +I01 +sS'value' +p3686 +g47 +sssS'subject' +p3687 +(dp3688 +S'mandatory' +p3689 +(dp3690 +S'editable' +p3691 +I00 +sS'value' +p3692 +I01 +ssS'name' +p3693 +(dp3694 +S'editable' +p3695 +I01 +sS'value' +p3696 +S'Subject' +p3697 +ssS'data_type' +p3698 +(dp3699 +S'editable' +p3700 +I00 +sS'value' +p3701 +S'text' +p3702 +ssS'entity_type' +p3703 +(dp3704 +S'editable' +p3705 +I00 +sS'value' +p3706 +S'Note' +p3707 +ssS'editable' +p3708 +(dp3709 +S'editable' +p3710 +I00 +sS'value' +p3711 +I01 +ssS'unique' +p3712 +(dp3713 +S'editable' +p3714 +I00 +sS'value' +p3715 +I00 +ssS'properties' +p3716 +(dp3717 +S'default_value' +p3718 +(dp3719 +S'editable' +p3720 +I00 +sS'value' +p3721 +NssS'summary_default' +p3722 +(dp3723 +S'editable' +p3724 +I01 +sS'value' +p3725 +S'none' +p3726 +sssS'description' +p3727 +(dp3728 +S'editable' +p3729 +I01 +sS'value' +p3730 +g47 +ssssS'TaskDependency' +p3731 +(dp3732 +S'task' +p3733 +(dp3734 +S'mandatory' +p3735 +(dp3736 +S'editable' +p3737 +I00 +sS'value' +p3738 +I00 +ssS'name' +p3739 +(dp3740 +S'editable' +p3741 +I01 +sS'value' +p3742 +S'Task' +p3743 +ssS'data_type' +p3744 +(dp3745 +S'editable' +p3746 +I00 +sS'value' +p3747 +S'entity' +p3748 +ssS'entity_type' +p3749 +(dp3750 +S'editable' +p3751 +I00 +sS'value' +p3752 +S'TaskDependency' +p3753 +ssS'editable' +p3754 +(dp3755 +S'editable' +p3756 +I00 +sS'value' +p3757 +I01 +ssS'unique' +p3758 +(dp3759 +S'editable' +p3760 +I00 +sS'value' +p3761 +I00 +ssS'properties' +p3762 +(dp3763 +S'default_value' +p3764 +(dp3765 +S'editable' +p3766 +I00 +sS'value' +p3767 +NssS'summary_default' +p3768 +(dp3769 +S'editable' +p3770 +I00 +sS'value' +p3771 +S'none' +p3772 +ssS'valid_types' +p3773 +(dp3774 +S'editable' +p3775 +I00 +sS'value' +p3776 +(lp3777 +S'Task' +p3778 +asssS'description' +p3779 +(dp3780 +S'editable' +p3781 +I01 +sS'value' +p3782 +g47 +sssS'task_id' +p3783 +(dp3784 +S'mandatory' +p3785 +(dp3786 +S'editable' +p3787 +I00 +sS'value' +p3788 +I00 +ssS'name' +p3789 +(dp3790 +S'editable' +p3791 +I01 +sS'value' +p3792 +S'Task Id' +p3793 +ssS'data_type' +p3794 +(dp3795 +S'editable' +p3796 +I00 +sS'value' +p3797 +S'number' +p3798 +ssS'entity_type' +p3799 +(dp3800 +S'editable' +p3801 +I00 +sS'value' +p3802 +S'TaskDependency' +p3803 +ssS'editable' +p3804 +(dp3805 +S'editable' +p3806 +I00 +sS'value' +p3807 +I00 +ssS'unique' +p3808 +(dp3809 +S'editable' +p3810 +I00 +sS'value' +p3811 +I00 +ssS'properties' +p3812 +(dp3813 +S'default_value' +p3814 +(dp3815 +S'editable' +p3816 +I00 +sS'value' +p3817 +NssS'summary_default' +p3818 +(dp3819 +S'editable' +p3820 +I00 +sS'value' +p3821 +S'none' +p3822 +sssS'description' +p3823 +(dp3824 +S'editable' +p3825 +I01 +sS'value' +p3826 +g47 +sssS'dependent_task' +p3827 +(dp3828 +S'mandatory' +p3829 +(dp3830 +S'editable' +p3831 +I00 +sS'value' +p3832 +I00 +ssS'name' +p3833 +(dp3834 +S'editable' +p3835 +I01 +sS'value' +p3836 +S'Dependent Task' +p3837 +ssS'data_type' +p3838 +(dp3839 +S'editable' +p3840 +I00 +sS'value' +p3841 +S'entity' +p3842 +ssS'entity_type' +p3843 +(dp3844 +S'editable' +p3845 +I00 +sS'value' +p3846 +S'TaskDependency' +p3847 +ssS'editable' +p3848 +(dp3849 +S'editable' +p3850 +I00 +sS'value' +p3851 +I01 +ssS'unique' +p3852 +(dp3853 +S'editable' +p3854 +I00 +sS'value' +p3855 +I00 +ssS'properties' +p3856 +(dp3857 +S'default_value' +p3858 +(dp3859 +S'editable' +p3860 +I00 +sS'value' +p3861 +NssS'summary_default' +p3862 +(dp3863 +S'editable' +p3864 +I00 +sS'value' +p3865 +S'none' +p3866 +ssS'valid_types' +p3867 +(dp3868 +S'editable' +p3869 +I00 +sS'value' +p3870 +(lp3871 +S'Task' +p3872 +asssS'description' +p3873 +(dp3874 +S'editable' +p3875 +I01 +sS'value' +p3876 +g47 +sssS'offset_days' +p3877 +(dp3878 +S'mandatory' +p3879 +(dp3880 +S'editable' +p3881 +I00 +sS'value' +p3882 +I00 +ssS'name' +p3883 +(dp3884 +S'editable' +p3885 +I01 +sS'value' +p3886 +S'Offset Days' +p3887 +ssS'data_type' +p3888 +(dp3889 +S'editable' +p3890 +I00 +sS'value' +p3891 +S'number' +p3892 +ssS'entity_type' +p3893 +(dp3894 +S'editable' +p3895 +I00 +sS'value' +p3896 +S'TaskDependency' +p3897 +ssS'editable' +p3898 +(dp3899 +S'editable' +p3900 +I00 +sS'value' +p3901 +I01 +ssS'unique' +p3902 +(dp3903 +S'editable' +p3904 +I00 +sS'value' +p3905 +I00 +ssS'properties' +p3906 +(dp3907 +S'default_value' +p3908 +(dp3909 +S'editable' +p3910 +I00 +sS'value' +p3911 +NssS'summary_default' +p3912 +(dp3913 +S'editable' +p3914 +I00 +sS'value' +p3915 +S'none' +p3916 +sssS'description' +p3917 +(dp3918 +S'editable' +p3919 +I01 +sS'value' +p3920 +g47 +sssS'cached_display_name' +p3921 +(dp3922 +S'mandatory' +p3923 +(dp3924 +S'editable' +p3925 +I00 +sS'value' +p3926 +I00 +ssS'name' +p3927 +(dp3928 +S'editable' +p3929 +I01 +sS'value' +p3930 +S'Cached Display Name' +p3931 +ssS'data_type' +p3932 +(dp3933 +S'editable' +p3934 +I00 +sS'value' +p3935 +S'text' +p3936 +ssS'entity_type' +p3937 +(dp3938 +S'editable' +p3939 +I00 +sS'value' +p3940 +S'TaskDependency' +p3941 +ssS'editable' +p3942 +(dp3943 +S'editable' +p3944 +I00 +sS'value' +p3945 +I01 +ssS'unique' +p3946 +(dp3947 +S'editable' +p3948 +I00 +sS'value' +p3949 +I00 +ssS'properties' +p3950 +(dp3951 +S'default_value' +p3952 +(dp3953 +S'editable' +p3954 +I00 +sS'value' +p3955 +NssS'summary_default' +p3956 +(dp3957 +S'editable' +p3958 +I00 +sS'value' +p3959 +S'none' +p3960 +sssS'description' +p3961 +(dp3962 +S'editable' +p3963 +I01 +sS'value' +p3964 +g47 +sssS'dependent_task_id' +p3965 +(dp3966 +S'mandatory' +p3967 +(dp3968 +S'editable' +p3969 +I00 +sS'value' +p3970 +I00 +ssS'name' +p3971 +(dp3972 +S'editable' +p3973 +I01 +sS'value' +p3974 +S'Dependent Task Id' +p3975 +ssS'data_type' +p3976 +(dp3977 +S'editable' +p3978 +I00 +sS'value' +p3979 +S'number' +p3980 +ssS'entity_type' +p3981 +(dp3982 +S'editable' +p3983 +I00 +sS'value' +p3984 +S'TaskDependency' +p3985 +ssS'editable' +p3986 +(dp3987 +S'editable' +p3988 +I00 +sS'value' +p3989 +I00 +ssS'unique' +p3990 +(dp3991 +S'editable' +p3992 +I00 +sS'value' +p3993 +I00 +ssS'properties' +p3994 +(dp3995 +S'default_value' +p3996 +(dp3997 +S'editable' +p3998 +I00 +sS'value' +p3999 +NssS'summary_default' +p4000 +(dp4001 +S'editable' +p4002 +I00 +sS'value' +p4003 +S'none' +p4004 +sssS'description' +p4005 +(dp4006 +S'editable' +p4007 +I01 +sS'value' +p4008 +g47 +sssS'id' +p4009 +(dp4010 +S'mandatory' +p4011 +(dp4012 +S'editable' +p4013 +I00 +sS'value' +p4014 +I00 +ssS'name' +p4015 +(dp4016 +S'editable' +p4017 +I01 +sS'value' +p4018 +S'Id' +p4019 +ssS'data_type' +p4020 +(dp4021 +S'editable' +p4022 +I00 +sS'value' +p4023 +S'number' +p4024 +ssS'entity_type' +p4025 +(dp4026 +S'editable' +p4027 +I00 +sS'value' +p4028 +S'TaskDependency' +p4029 +ssS'editable' +p4030 +(dp4031 +S'editable' +p4032 +I00 +sS'value' +p4033 +I00 +ssS'unique' +p4034 +(dp4035 +S'editable' +p4036 +I00 +sS'value' +p4037 +I00 +ssS'properties' +p4038 +(dp4039 +S'default_value' +p4040 +(dp4041 +S'editable' +p4042 +I00 +sS'value' +p4043 +NssS'summary_default' +p4044 +(dp4045 +S'editable' +p4046 +I00 +sS'value' +p4047 +S'none' +p4048 +sssS'description' +p4049 +(dp4050 +S'editable' +p4051 +I01 +sS'value' +p4052 +g47 +ssssS'PageHit' +p4053 +(dp4054 +S'user' +p4055 +(dp4056 +S'mandatory' +p4057 +(dp4058 +S'editable' +p4059 +I00 +sS'value' +p4060 +I00 +ssS'name' +p4061 +(dp4062 +S'editable' +p4063 +I01 +sS'value' +p4064 +S'User' +p4065 +ssS'data_type' +p4066 +(dp4067 +S'editable' +p4068 +I00 +sS'value' +p4069 +S'entity' +p4070 +ssS'entity_type' +p4071 +(dp4072 +S'editable' +p4073 +I00 +sS'value' +p4074 +S'PageHit' +p4075 +ssS'editable' +p4076 +(dp4077 +S'editable' +p4078 +I00 +sS'value' +p4079 +I00 +ssS'unique' +p4080 +(dp4081 +S'editable' +p4082 +I00 +sS'value' +p4083 +I00 +ssS'properties' +p4084 +(dp4085 +S'default_value' +p4086 +(dp4087 +S'editable' +p4088 +I00 +sS'value' +p4089 +NssS'summary_default' +p4090 +(dp4091 +S'editable' +p4092 +I00 +sS'value' +p4093 +S'none' +p4094 +ssS'valid_types' +p4095 +(dp4096 +S'editable' +p4097 +I00 +sS'value' +p4098 +(lp4099 +S'HumanUser' +p4100 +asssS'description' +p4101 +(dp4102 +S'editable' +p4103 +I01 +sS'value' +p4104 +g47 +sssS'created_at' +p4105 +(dp4106 +S'mandatory' +p4107 +(dp4108 +S'editable' +p4109 +I00 +sS'value' +p4110 +I00 +ssS'name' +p4111 +(dp4112 +S'editable' +p4113 +I01 +sS'value' +p4114 +S'Date Created' +p4115 +ssS'data_type' +p4116 +(dp4117 +S'editable' +p4118 +I00 +sS'value' +p4119 +S'date_time' +p4120 +ssS'entity_type' +p4121 +(dp4122 +S'editable' +p4123 +I00 +sS'value' +p4124 +S'PageHit' +p4125 +ssS'editable' +p4126 +(dp4127 +S'editable' +p4128 +I00 +sS'value' +p4129 +I00 +ssS'unique' +p4130 +(dp4131 +S'editable' +p4132 +I00 +sS'value' +p4133 +I00 +ssS'properties' +p4134 +(dp4135 +S'default_value' +p4136 +(dp4137 +S'editable' +p4138 +I00 +sS'value' +p4139 +NssS'summary_default' +p4140 +(dp4141 +S'editable' +p4142 +I00 +sS'value' +p4143 +S'none' +p4144 +sssS'description' +p4145 +(dp4146 +S'editable' +p4147 +I01 +sS'value' +p4148 +g47 +sssS'id' +p4149 +(dp4150 +S'mandatory' +p4151 +(dp4152 +S'editable' +p4153 +I00 +sS'value' +p4154 +I01 +ssS'name' +p4155 +(dp4156 +S'editable' +p4157 +I01 +sS'value' +p4158 +S'Id' +p4159 +ssS'data_type' +p4160 +(dp4161 +S'editable' +p4162 +I00 +sS'value' +p4163 +S'number' +p4164 +ssS'entity_type' +p4165 +(dp4166 +S'editable' +p4167 +I00 +sS'value' +p4168 +S'PageHit' +p4169 +ssS'editable' +p4170 +(dp4171 +S'editable' +p4172 +I00 +sS'value' +p4173 +I00 +ssS'unique' +p4174 +(dp4175 +S'editable' +p4176 +I00 +sS'value' +p4177 +I00 +ssS'properties' +p4178 +(dp4179 +S'default_value' +p4180 +(dp4181 +S'editable' +p4182 +I00 +sS'value' +p4183 +NssS'summary_default' +p4184 +(dp4185 +S'editable' +p4186 +I00 +sS'value' +p4187 +S'none' +p4188 +sssS'description' +p4189 +(dp4190 +S'editable' +p4191 +I01 +sS'value' +p4192 +g47 +sssS'cached_display_name' +p4193 +(dp4194 +S'mandatory' +p4195 +(dp4196 +S'editable' +p4197 +I00 +sS'value' +p4198 +I00 +ssS'name' +p4199 +(dp4200 +S'editable' +p4201 +I01 +sS'value' +p4202 +S'Cached Display Name' +p4203 +ssS'data_type' +p4204 +(dp4205 +S'editable' +p4206 +I00 +sS'value' +p4207 +S'text' +p4208 +ssS'entity_type' +p4209 +(dp4210 +S'editable' +p4211 +I00 +sS'value' +p4212 +S'PageHit' +p4213 +ssS'editable' +p4214 +(dp4215 +S'editable' +p4216 +I00 +sS'value' +p4217 +I01 +ssS'unique' +p4218 +(dp4219 +S'editable' +p4220 +I00 +sS'value' +p4221 +I00 +ssS'properties' +p4222 +(dp4223 +S'default_value' +p4224 +(dp4225 +S'editable' +p4226 +I00 +sS'value' +p4227 +NssS'summary_default' +p4228 +(dp4229 +S'editable' +p4230 +I00 +sS'value' +p4231 +S'none' +p4232 +sssS'description' +p4233 +(dp4234 +S'editable' +p4235 +I01 +sS'value' +p4236 +g47 +sssS'page' +p4237 +(dp4238 +S'mandatory' +p4239 +(dp4240 +S'editable' +p4241 +I00 +sS'value' +p4242 +I00 +ssS'name' +p4243 +(dp4244 +S'editable' +p4245 +I01 +sS'value' +p4246 +S'Page' +p4247 +ssS'data_type' +p4248 +(dp4249 +S'editable' +p4250 +I00 +sS'value' +p4251 +S'entity' +p4252 +ssS'entity_type' +p4253 +(dp4254 +S'editable' +p4255 +I00 +sS'value' +p4256 +S'PageHit' +p4257 +ssS'editable' +p4258 +(dp4259 +S'editable' +p4260 +I00 +sS'value' +p4261 +I00 +ssS'unique' +p4262 +(dp4263 +S'editable' +p4264 +I00 +sS'value' +p4265 +I00 +ssS'properties' +p4266 +(dp4267 +S'default_value' +p4268 +(dp4269 +S'editable' +p4270 +I00 +sS'value' +p4271 +NssS'summary_default' +p4272 +(dp4273 +S'editable' +p4274 +I00 +sS'value' +p4275 +S'none' +p4276 +ssS'valid_types' +p4277 +(dp4278 +S'editable' +p4279 +I00 +sS'value' +p4280 +(lp4281 +S'Page' +p4282 +asssS'description' +p4283 +(dp4284 +S'editable' +p4285 +I01 +sS'value' +p4286 +g47 +ssssS'ActionMenuItem' +p4287 +(dp4288 +S'updated_by' +p4289 +(dp4290 +S'mandatory' +p4291 +(dp4292 +S'editable' +p4293 +I00 +sS'value' +p4294 +I00 +ssS'name' +p4295 +(dp4296 +S'editable' +p4297 +I01 +sS'value' +p4298 +S'Updated by' +p4299 +ssS'data_type' +p4300 +(dp4301 +S'editable' +p4302 +I00 +sS'value' +p4303 +S'entity' +p4304 +ssS'entity_type' +p4305 +(dp4306 +S'editable' +p4307 +I00 +sS'value' +p4308 +S'ActionMenuItem' +p4309 +ssS'editable' +p4310 +(dp4311 +S'editable' +p4312 +I00 +sS'value' +p4313 +I00 +ssS'unique' +p4314 +(dp4315 +S'editable' +p4316 +I00 +sS'value' +p4317 +I00 +ssS'properties' +p4318 +(dp4319 +S'default_value' +p4320 +(dp4321 +S'editable' +p4322 +I00 +sS'value' +p4323 +NssS'summary_default' +p4324 +(dp4325 +S'editable' +p4326 +I01 +sS'value' +p4327 +S'none' +p4328 +ssS'valid_types' +p4329 +(dp4330 +S'editable' +p4331 +I01 +sS'value' +p4332 +(lp4333 +S'HumanUser' +p4334 +aS'ApiUser' +p4335 +asssS'description' +p4336 +(dp4337 +S'editable' +p4338 +I01 +sS'value' +p4339 +g47 +sssS'list_order' +p4340 +(dp4341 +S'mandatory' +p4342 +(dp4343 +S'editable' +p4344 +I00 +sS'value' +p4345 +I00 +ssS'name' +p4346 +(dp4347 +S'editable' +p4348 +I01 +sS'value' +p4349 +S'Order' +p4350 +ssS'data_type' +p4351 +(dp4352 +S'editable' +p4353 +I00 +sS'value' +p4354 +S'number' +p4355 +ssS'entity_type' +p4356 +(dp4357 +S'editable' +p4358 +I00 +sS'value' +p4359 +S'ActionMenuItem' +p4360 +ssS'editable' +p4361 +(dp4362 +S'editable' +p4363 +I00 +sS'value' +p4364 +I01 +ssS'unique' +p4365 +(dp4366 +S'editable' +p4367 +I00 +sS'value' +p4368 +I00 +ssS'properties' +p4369 +(dp4370 +S'default_value' +p4371 +(dp4372 +S'editable' +p4373 +I00 +sS'value' +p4374 +NssS'summary_default' +p4375 +(dp4376 +S'editable' +p4377 +I00 +sS'value' +p4378 +S'none' +p4379 +sssS'description' +p4380 +(dp4381 +S'editable' +p4382 +I01 +sS'value' +p4383 +g47 +sssS'url' +p4384 +(dp4385 +S'mandatory' +p4386 +(dp4387 +S'editable' +p4388 +I00 +sS'value' +p4389 +I00 +ssS'name' +p4390 +(dp4391 +S'editable' +p4392 +I01 +sS'value' +p4393 +S'URL' +p4394 +ssS'data_type' +p4395 +(dp4396 +S'editable' +p4397 +I00 +sS'value' +p4398 +S'text' +p4399 +ssS'entity_type' +p4400 +(dp4401 +S'editable' +p4402 +I00 +sS'value' +p4403 +S'ActionMenuItem' +p4404 +ssS'editable' +p4405 +(dp4406 +S'editable' +p4407 +I00 +sS'value' +p4408 +I01 +ssS'unique' +p4409 +(dp4410 +S'editable' +p4411 +I00 +sS'value' +p4412 +I00 +ssS'properties' +p4413 +(dp4414 +S'default_value' +p4415 +(dp4416 +S'editable' +p4417 +I00 +sS'value' +p4418 +NssS'summary_default' +p4419 +(dp4420 +S'editable' +p4421 +I00 +sS'value' +p4422 +S'none' +p4423 +sssS'description' +p4424 +(dp4425 +S'editable' +p4426 +I01 +sS'value' +p4427 +g47 +sssS'created_at' +p4428 +(dp4429 +S'mandatory' +p4430 +(dp4431 +S'editable' +p4432 +I00 +sS'value' +p4433 +I00 +ssS'name' +p4434 +(dp4435 +S'editable' +p4436 +I01 +sS'value' +p4437 +S'Date Created' +p4438 +ssS'data_type' +p4439 +(dp4440 +S'editable' +p4441 +I00 +sS'value' +p4442 +S'date_time' +p4443 +ssS'entity_type' +p4444 +(dp4445 +S'editable' +p4446 +I00 +sS'value' +p4447 +S'ActionMenuItem' +p4448 +ssS'editable' +p4449 +(dp4450 +S'editable' +p4451 +I00 +sS'value' +p4452 +I00 +ssS'unique' +p4453 +(dp4454 +S'editable' +p4455 +I00 +sS'value' +p4456 +I00 +ssS'properties' +p4457 +(dp4458 +S'default_value' +p4459 +(dp4460 +S'editable' +p4461 +I00 +sS'value' +p4462 +NssS'summary_default' +p4463 +(dp4464 +S'editable' +p4465 +I01 +sS'value' +p4466 +S'none' +p4467 +sssS'description' +p4468 +(dp4469 +S'editable' +p4470 +I01 +sS'value' +p4471 +g47 +sssS'title' +p4472 +(dp4473 +S'mandatory' +p4474 +(dp4475 +S'editable' +p4476 +I00 +sS'value' +p4477 +I01 +ssS'name' +p4478 +(dp4479 +S'editable' +p4480 +I01 +sS'value' +p4481 +S'Title' +p4482 +ssS'data_type' +p4483 +(dp4484 +S'editable' +p4485 +I00 +sS'value' +p4486 +S'text' +p4487 +ssS'entity_type' +p4488 +(dp4489 +S'editable' +p4490 +I00 +sS'value' +p4491 +S'ActionMenuItem' +p4492 +ssS'editable' +p4493 +(dp4494 +S'editable' +p4495 +I00 +sS'value' +p4496 +I01 +ssS'unique' +p4497 +(dp4498 +S'editable' +p4499 +I00 +sS'value' +p4500 +I00 +ssS'properties' +p4501 +(dp4502 +S'default_value' +p4503 +(dp4504 +S'editable' +p4505 +I00 +sS'value' +p4506 +NssS'summary_default' +p4507 +(dp4508 +S'editable' +p4509 +I00 +sS'value' +p4510 +S'none' +p4511 +sssS'description' +p4512 +(dp4513 +S'editable' +p4514 +I01 +sS'value' +p4515 +g47 +sssS'poll_for_data_updates' +p4516 +(dp4517 +S'mandatory' +p4518 +(dp4519 +S'editable' +p4520 +I00 +sS'value' +p4521 +I00 +ssS'name' +p4522 +(dp4523 +S'editable' +p4524 +I01 +sS'value' +p4525 +S'Poll For Data Updates' +p4526 +ssS'data_type' +p4527 +(dp4528 +S'editable' +p4529 +I00 +sS'value' +p4530 +S'checkbox' +p4531 +ssS'entity_type' +p4532 +(dp4533 +S'editable' +p4534 +I00 +sS'value' +p4535 +S'ActionMenuItem' +p4536 +ssS'editable' +p4537 +(dp4538 +S'editable' +p4539 +I00 +sS'value' +p4540 +I01 +ssS'unique' +p4541 +(dp4542 +S'editable' +p4543 +I00 +sS'value' +p4544 +I00 +ssS'properties' +p4545 +(dp4546 +S'default_value' +p4547 +(dp4548 +S'editable' +p4549 +I00 +sS'value' +p4550 +I00 +ssS'summary_default' +p4551 +(dp4552 +S'editable' +p4553 +I00 +sS'value' +p4554 +S'none' +p4555 +sssS'description' +p4556 +(dp4557 +S'editable' +p4558 +I01 +sS'value' +p4559 +g47 +sssS'updated_at' +p4560 +(dp4561 +S'mandatory' +p4562 +(dp4563 +S'editable' +p4564 +I00 +sS'value' +p4565 +I00 +ssS'name' +p4566 +(dp4567 +S'editable' +p4568 +I01 +sS'value' +p4569 +S'Date Updated' +p4570 +ssS'data_type' +p4571 +(dp4572 +S'editable' +p4573 +I00 +sS'value' +p4574 +S'date_time' +p4575 +ssS'entity_type' +p4576 +(dp4577 +S'editable' +p4578 +I00 +sS'value' +p4579 +S'ActionMenuItem' +p4580 +ssS'editable' +p4581 +(dp4582 +S'editable' +p4583 +I00 +sS'value' +p4584 +I00 +ssS'unique' +p4585 +(dp4586 +S'editable' +p4587 +I00 +sS'value' +p4588 +I00 +ssS'properties' +p4589 +(dp4590 +S'default_value' +p4591 +(dp4592 +S'editable' +p4593 +I00 +sS'value' +p4594 +NssS'summary_default' +p4595 +(dp4596 +S'editable' +p4597 +I01 +sS'value' +p4598 +S'none' +p4599 +sssS'description' +p4600 +(dp4601 +S'editable' +p4602 +I01 +sS'value' +p4603 +g47 +sssS'created_by' +p4604 +(dp4605 +S'mandatory' +p4606 +(dp4607 +S'editable' +p4608 +I00 +sS'value' +p4609 +I00 +ssS'name' +p4610 +(dp4611 +S'editable' +p4612 +I01 +sS'value' +p4613 +S'Created by' +p4614 +ssS'data_type' +p4615 +(dp4616 +S'editable' +p4617 +I00 +sS'value' +p4618 +S'entity' +p4619 +ssS'entity_type' +p4620 +(dp4621 +S'editable' +p4622 +I00 +sS'value' +p4623 +S'ActionMenuItem' +p4624 +ssS'editable' +p4625 +(dp4626 +S'editable' +p4627 +I00 +sS'value' +p4628 +I00 +ssS'unique' +p4629 +(dp4630 +S'editable' +p4631 +I00 +sS'value' +p4632 +I00 +ssS'properties' +p4633 +(dp4634 +S'default_value' +p4635 +(dp4636 +S'editable' +p4637 +I00 +sS'value' +p4638 +NssS'summary_default' +p4639 +(dp4640 +S'editable' +p4641 +I01 +sS'value' +p4642 +S'none' +p4643 +ssS'valid_types' +p4644 +(dp4645 +S'editable' +p4646 +I01 +sS'value' +p4647 +(lp4648 +S'HumanUser' +p4649 +aS'ApiUser' +p4650 +asssS'description' +p4651 +(dp4652 +S'editable' +p4653 +I01 +sS'value' +p4654 +g47 +sssS'permissions_groups' +p4655 +(dp4656 +S'mandatory' +p4657 +(dp4658 +S'editable' +p4659 +I00 +sS'value' +p4660 +I00 +ssS'name' +p4661 +(dp4662 +S'editable' +p4663 +I01 +sS'value' +p4664 +S'Restrict to Permission Groups' +p4665 +ssS'data_type' +p4666 +(dp4667 +S'editable' +p4668 +I00 +sS'value' +p4669 +S'multi_entity' +p4670 +ssS'entity_type' +p4671 +(dp4672 +S'editable' +p4673 +I00 +sS'value' +p4674 +S'ActionMenuItem' +p4675 +ssS'editable' +p4676 +(dp4677 +S'editable' +p4678 +I00 +sS'value' +p4679 +I01 +ssS'unique' +p4680 +(dp4681 +S'editable' +p4682 +I00 +sS'value' +p4683 +I00 +ssS'properties' +p4684 +(dp4685 +S'default_value' +p4686 +(dp4687 +S'editable' +p4688 +I00 +sS'value' +p4689 +NssS'summary_default' +p4690 +(dp4691 +S'editable' +p4692 +I01 +sS'value' +p4693 +S'none' +p4694 +ssS'valid_types' +p4695 +(dp4696 +S'editable' +p4697 +I01 +sS'value' +p4698 +(lp4699 +S'PermissionRuleSet' +p4700 +asssS'description' +p4701 +(dp4702 +S'editable' +p4703 +I01 +sS'value' +p4704 +g47 +sssS'entity_type' +p4705 +(dp4706 +S'mandatory' +p4707 +(dp4708 +S'editable' +p4709 +I00 +sS'value' +p4710 +I00 +ssS'name' +p4711 +(dp4712 +S'editable' +p4713 +I01 +sS'value' +p4714 +S'Entity Type' +p4715 +ssS'data_type' +p4716 +(dp4717 +S'editable' +p4718 +I00 +sS'value' +p4719 +S'entity_type' +p4720 +ssS'entity_type' +p4721 +(dp4722 +S'editable' +p4723 +I00 +sS'value' +p4724 +S'ActionMenuItem' +p4725 +ssS'editable' +p4726 +(dp4727 +S'editable' +p4728 +I00 +sS'value' +p4729 +I01 +ssS'unique' +p4730 +(dp4731 +S'editable' +p4732 +I00 +sS'value' +p4733 +I00 +ssS'properties' +p4734 +(dp4735 +S'default_value' +p4736 +(dp4737 +S'editable' +p4738 +I00 +sS'value' +p4739 +NssS'summary_default' +p4740 +(dp4741 +S'editable' +p4742 +I00 +sS'value' +p4743 +S'none' +p4744 +sssS'description' +p4745 +(dp4746 +S'editable' +p4747 +I01 +sS'value' +p4748 +g47 +sssS'selection_required' +p4749 +(dp4750 +S'mandatory' +p4751 +(dp4752 +S'editable' +p4753 +I00 +sS'value' +p4754 +I00 +ssS'name' +p4755 +(dp4756 +S'editable' +p4757 +I01 +sS'value' +p4758 +S'Selection Required' +p4759 +ssS'data_type' +p4760 +(dp4761 +S'editable' +p4762 +I00 +sS'value' +p4763 +S'checkbox' +p4764 +ssS'entity_type' +p4765 +(dp4766 +S'editable' +p4767 +I00 +sS'value' +p4768 +S'ActionMenuItem' +p4769 +ssS'editable' +p4770 +(dp4771 +S'editable' +p4772 +I00 +sS'value' +p4773 +I01 +ssS'unique' +p4774 +(dp4775 +S'editable' +p4776 +I00 +sS'value' +p4777 +I00 +ssS'properties' +p4778 +(dp4779 +S'default_value' +p4780 +(dp4781 +S'editable' +p4782 +I00 +sS'value' +p4783 +I00 +ssS'summary_default' +p4784 +(dp4785 +S'editable' +p4786 +I00 +sS'value' +p4787 +S'none' +p4788 +sssS'description' +p4789 +(dp4790 +S'editable' +p4791 +I01 +sS'value' +p4792 +g47 +sssS'folder' +p4793 +(dp4794 +S'mandatory' +p4795 +(dp4796 +S'editable' +p4797 +I00 +sS'value' +p4798 +I00 +ssS'name' +p4799 +(dp4800 +S'editable' +p4801 +I01 +sS'value' +p4802 +S'Folder' +p4803 +ssS'data_type' +p4804 +(dp4805 +S'editable' +p4806 +I00 +sS'value' +p4807 +S'text' +p4808 +ssS'entity_type' +p4809 +(dp4810 +S'editable' +p4811 +I00 +sS'value' +p4812 +S'ActionMenuItem' +p4813 +ssS'editable' +p4814 +(dp4815 +S'editable' +p4816 +I00 +sS'value' +p4817 +I01 +ssS'unique' +p4818 +(dp4819 +S'editable' +p4820 +I00 +sS'value' +p4821 +I00 +ssS'properties' +p4822 +(dp4823 +S'default_value' +p4824 +(dp4825 +S'editable' +p4826 +I00 +sS'value' +p4827 +NssS'summary_default' +p4828 +(dp4829 +S'editable' +p4830 +I00 +sS'value' +p4831 +S'none' +p4832 +sssS'description' +p4833 +(dp4834 +S'editable' +p4835 +I01 +sS'value' +p4836 +g47 +sssS'id' +p4837 +(dp4838 +S'mandatory' +p4839 +(dp4840 +S'editable' +p4841 +I00 +sS'value' +p4842 +I00 +ssS'name' +p4843 +(dp4844 +S'editable' +p4845 +I01 +sS'value' +p4846 +S'Id' +p4847 +ssS'data_type' +p4848 +(dp4849 +S'editable' +p4850 +I00 +sS'value' +p4851 +S'number' +p4852 +ssS'entity_type' +p4853 +(dp4854 +S'editable' +p4855 +I00 +sS'value' +p4856 +S'ActionMenuItem' +p4857 +ssS'editable' +p4858 +(dp4859 +S'editable' +p4860 +I00 +sS'value' +p4861 +I00 +ssS'unique' +p4862 +(dp4863 +S'editable' +p4864 +I00 +sS'value' +p4865 +I00 +ssS'properties' +p4866 +(dp4867 +S'default_value' +p4868 +(dp4869 +S'editable' +p4870 +I00 +sS'value' +p4871 +NssS'summary_default' +p4872 +(dp4873 +S'editable' +p4874 +I00 +sS'value' +p4875 +S'none' +p4876 +sssS'description' +p4877 +(dp4878 +S'editable' +p4879 +I01 +sS'value' +p4880 +g47 +sssS'projects' +p4881 +(dp4882 +S'mandatory' +p4883 +(dp4884 +S'editable' +p4885 +I00 +sS'value' +p4886 +I00 +ssS'name' +p4887 +(dp4888 +S'editable' +p4889 +I01 +sS'value' +p4890 +S'Restrict to Projects' +p4891 +ssS'data_type' +p4892 +(dp4893 +S'editable' +p4894 +I00 +sS'value' +p4895 +S'multi_entity' +p4896 +ssS'entity_type' +p4897 +(dp4898 +S'editable' +p4899 +I00 +sS'value' +p4900 +S'ActionMenuItem' +p4901 +ssS'editable' +p4902 +(dp4903 +S'editable' +p4904 +I00 +sS'value' +p4905 +I01 +ssS'unique' +p4906 +(dp4907 +S'editable' +p4908 +I00 +sS'value' +p4909 +I00 +ssS'properties' +p4910 +(dp4911 +S'default_value' +p4912 +(dp4913 +S'editable' +p4914 +I00 +sS'value' +p4915 +NssS'summary_default' +p4916 +(dp4917 +S'editable' +p4918 +I01 +sS'value' +p4919 +S'none' +p4920 +ssS'valid_types' +p4921 +(dp4922 +S'editable' +p4923 +I01 +sS'value' +p4924 +(lp4925 +S'Project' +p4926 +asssS'description' +p4927 +(dp4928 +S'editable' +p4929 +I01 +sS'value' +p4930 +g47 +sssS'cached_display_name' +p4931 +(dp4932 +S'mandatory' +p4933 +(dp4934 +S'editable' +p4935 +I00 +sS'value' +p4936 +I00 +ssS'name' +p4937 +(dp4938 +S'editable' +p4939 +I01 +sS'value' +p4940 +S'Cached Display Name' +p4941 +ssS'data_type' +p4942 +(dp4943 +S'editable' +p4944 +I00 +sS'value' +p4945 +S'text' +p4946 +ssS'entity_type' +p4947 +(dp4948 +S'editable' +p4949 +I00 +sS'value' +p4950 +S'ActionMenuItem' +p4951 +ssS'editable' +p4952 +(dp4953 +S'editable' +p4954 +I00 +sS'value' +p4955 +I01 +ssS'unique' +p4956 +(dp4957 +S'editable' +p4958 +I00 +sS'value' +p4959 +I00 +ssS'properties' +p4960 +(dp4961 +S'default_value' +p4962 +(dp4963 +S'editable' +p4964 +I00 +sS'value' +p4965 +NssS'summary_default' +p4966 +(dp4967 +S'editable' +p4968 +I00 +sS'value' +p4969 +S'none' +p4970 +sssS'description' +p4971 +(dp4972 +S'editable' +p4973 +I01 +sS'value' +p4974 +g47 +ssssS'Attachment' +p4975 +(dp4976 +S'open_notes_count' +p4977 +(dp4978 +S'mandatory' +p4979 +(dp4980 +S'editable' +p4981 +I00 +sS'value' +p4982 +I00 +ssS'name' +p4983 +(dp4984 +S'editable' +p4985 +I01 +sS'value' +p4986 +S'Open Notes Count' +p4987 +ssS'data_type' +p4988 +(dp4989 +S'editable' +p4990 +I00 +sS'value' +p4991 +S'text' +p4992 +ssS'entity_type' +p4993 +(dp4994 +S'editable' +p4995 +I00 +sS'value' +p4996 +S'Attachment' +p4997 +ssS'editable' +p4998 +(dp4999 +S'editable' +p5000 +I00 +sS'value' +p5001 +I00 +ssS'unique' +p5002 +(dp5003 +S'editable' +p5004 +I00 +sS'value' +p5005 +I00 +ssS'properties' +p5006 +(dp5007 +S'default_value' +p5008 +(dp5009 +S'editable' +p5010 +I00 +sS'value' +p5011 +NssS'summary_default' +p5012 +(dp5013 +S'editable' +p5014 +I01 +sS'value' +p5015 +S'none' +p5016 +sssS'description' +p5017 +(dp5018 +S'editable' +p5019 +I01 +sS'value' +p5020 +g47 +sssS'tasks' +p5021 +(dp5022 +S'mandatory' +p5023 +(dp5024 +S'editable' +p5025 +I00 +sS'value' +p5026 +I00 +ssS'name' +p5027 +(dp5028 +S'editable' +p5029 +I01 +sS'value' +p5030 +S'Tasks' +p5031 +ssS'data_type' +p5032 +(dp5033 +S'editable' +p5034 +I00 +sS'value' +p5035 +S'multi_entity' +p5036 +ssS'entity_type' +p5037 +(dp5038 +S'editable' +p5039 +I00 +sS'value' +p5040 +S'Attachment' +p5041 +ssS'editable' +p5042 +(dp5043 +S'editable' +p5044 +I00 +sS'value' +p5045 +I01 +ssS'unique' +p5046 +(dp5047 +S'editable' +p5048 +I00 +sS'value' +p5049 +I00 +ssS'properties' +p5050 +(dp5051 +S'default_value' +p5052 +(dp5053 +S'editable' +p5054 +I00 +sS'value' +p5055 +NssS'summary_default' +p5056 +(dp5057 +S'editable' +p5058 +I01 +sS'value' +p5059 +S'none' +p5060 +ssS'valid_types' +p5061 +(dp5062 +S'editable' +p5063 +I01 +sS'value' +p5064 +(lp5065 +S'Task' +p5066 +asssS'description' +p5067 +(dp5068 +S'editable' +p5069 +I01 +sS'value' +p5070 +g47 +sssS'file_extension' +p5071 +(dp5072 +S'mandatory' +p5073 +(dp5074 +S'editable' +p5075 +I00 +sS'value' +p5076 +I00 +ssS'name' +p5077 +(dp5078 +S'editable' +p5079 +I01 +sS'value' +p5080 +S'File Type' +p5081 +ssS'data_type' +p5082 +(dp5083 +S'editable' +p5084 +I00 +sS'value' +p5085 +S'text' +p5086 +ssS'entity_type' +p5087 +(dp5088 +S'editable' +p5089 +I00 +sS'value' +p5090 +S'Attachment' +p5091 +ssS'editable' +p5092 +(dp5093 +S'editable' +p5094 +I00 +sS'value' +p5095 +I00 +ssS'unique' +p5096 +(dp5097 +S'editable' +p5098 +I00 +sS'value' +p5099 +I00 +ssS'properties' +p5100 +(dp5101 +S'default_value' +p5102 +(dp5103 +S'editable' +p5104 +I00 +sS'value' +p5105 +NssS'summary_default' +p5106 +(dp5107 +S'editable' +p5108 +I01 +sS'value' +p5109 +S'none' +p5110 +sssS'description' +p5111 +(dp5112 +S'editable' +p5113 +I01 +sS'value' +p5114 +g47 +sssS'updated_at' +p5115 +(dp5116 +S'mandatory' +p5117 +(dp5118 +S'editable' +p5119 +I00 +sS'value' +p5120 +I00 +ssS'name' +p5121 +(dp5122 +S'editable' +p5123 +I01 +sS'value' +p5124 +S'Date Updated' +p5125 +ssS'data_type' +p5126 +(dp5127 +S'editable' +p5128 +I00 +sS'value' +p5129 +S'date_time' +p5130 +ssS'entity_type' +p5131 +(dp5132 +S'editable' +p5133 +I00 +sS'value' +p5134 +S'Attachment' +p5135 +ssS'editable' +p5136 +(dp5137 +S'editable' +p5138 +I00 +sS'value' +p5139 +I00 +ssS'unique' +p5140 +(dp5141 +S'editable' +p5142 +I00 +sS'value' +p5143 +I00 +ssS'properties' +p5144 +(dp5145 +S'default_value' +p5146 +(dp5147 +S'editable' +p5148 +I00 +sS'value' +p5149 +NssS'summary_default' +p5150 +(dp5151 +S'editable' +p5152 +I01 +sS'value' +p5153 +S'none' +p5154 +sssS'description' +p5155 +(dp5156 +S'editable' +p5157 +I01 +sS'value' +p5158 +g47 +sssS'attachment_reference_links' +p5159 +(dp5160 +S'mandatory' +p5161 +(dp5162 +S'editable' +p5163 +I00 +sS'value' +p5164 +I00 +ssS'name' +p5165 +(dp5166 +S'editable' +p5167 +I01 +sS'value' +p5168 +S'Reference For' +p5169 +ssS'data_type' +p5170 +(dp5171 +S'editable' +p5172 +I00 +sS'value' +p5173 +S'multi_entity' +p5174 +ssS'entity_type' +p5175 +(dp5176 +S'editable' +p5177 +I00 +sS'value' +p5178 +S'Attachment' +p5179 +ssS'editable' +p5180 +(dp5181 +S'editable' +p5182 +I00 +sS'value' +p5183 +I01 +ssS'unique' +p5184 +(dp5185 +S'editable' +p5186 +I00 +sS'value' +p5187 +I00 +ssS'properties' +p5188 +(dp5189 +S'default_value' +p5190 +(dp5191 +S'editable' +p5192 +I00 +sS'value' +p5193 +NssS'summary_default' +p5194 +(dp5195 +S'editable' +p5196 +I01 +sS'value' +p5197 +S'none' +p5198 +ssS'valid_types' +p5199 +(dp5200 +S'editable' +p5201 +I00 +sS'value' +p5202 +(lp5203 +S'Asset' +p5204 +aS'Scene' +p5205 +aS'Sequence' +p5206 +aS'Shot' +p5207 +aS'Version' +p5208 +asssS'description' +p5209 +(dp5210 +S'editable' +p5211 +I01 +sS'value' +p5212 +g47 +sssS'file_size' +p5213 +(dp5214 +S'mandatory' +p5215 +(dp5216 +S'editable' +p5217 +I00 +sS'value' +p5218 +I00 +ssS'name' +p5219 +(dp5220 +S'editable' +p5221 +I01 +sS'value' +p5222 +S'File Size' +p5223 +ssS'data_type' +p5224 +(dp5225 +S'editable' +p5226 +I00 +sS'value' +p5227 +S'number' +p5228 +ssS'entity_type' +p5229 +(dp5230 +S'editable' +p5231 +I00 +sS'value' +p5232 +S'Attachment' +p5233 +ssS'editable' +p5234 +(dp5235 +S'editable' +p5236 +I00 +sS'value' +p5237 +I00 +ssS'unique' +p5238 +(dp5239 +S'editable' +p5240 +I00 +sS'value' +p5241 +I00 +ssS'properties' +p5242 +(dp5243 +S'default_value' +p5244 +(dp5245 +S'editable' +p5246 +I00 +sS'value' +p5247 +NssS'summary_default' +p5248 +(dp5249 +S'editable' +p5250 +I01 +sS'value' +p5251 +S'none' +p5252 +sssS'description' +p5253 +(dp5254 +S'editable' +p5255 +I01 +sS'value' +p5256 +g47 +sssS'cached_display_name' +p5257 +(dp5258 +S'mandatory' +p5259 +(dp5260 +S'editable' +p5261 +I00 +sS'value' +p5262 +I00 +ssS'name' +p5263 +(dp5264 +S'editable' +p5265 +I01 +sS'value' +p5266 +S'Cached Display Name' +p5267 +ssS'data_type' +p5268 +(dp5269 +S'editable' +p5270 +I00 +sS'value' +p5271 +S'text' +p5272 +ssS'entity_type' +p5273 +(dp5274 +S'editable' +p5275 +I00 +sS'value' +p5276 +S'Attachment' +p5277 +ssS'editable' +p5278 +(dp5279 +S'editable' +p5280 +I00 +sS'value' +p5281 +I01 +ssS'unique' +p5282 +(dp5283 +S'editable' +p5284 +I00 +sS'value' +p5285 +I00 +ssS'properties' +p5286 +(dp5287 +S'default_value' +p5288 +(dp5289 +S'editable' +p5290 +I00 +sS'value' +p5291 +NssS'summary_default' +p5292 +(dp5293 +S'editable' +p5294 +I00 +sS'value' +p5295 +S'none' +p5296 +sssS'description' +p5297 +(dp5298 +S'editable' +p5299 +I01 +sS'value' +p5300 +g47 +sssS'id' +p5301 +(dp5302 +S'mandatory' +p5303 +(dp5304 +S'editable' +p5305 +I00 +sS'value' +p5306 +I00 +ssS'name' +p5307 +(dp5308 +S'editable' +p5309 +I01 +sS'value' +p5310 +S'Id' +p5311 +ssS'data_type' +p5312 +(dp5313 +S'editable' +p5314 +I00 +sS'value' +p5315 +S'number' +p5316 +ssS'entity_type' +p5317 +(dp5318 +S'editable' +p5319 +I00 +sS'value' +p5320 +S'Attachment' +p5321 +ssS'editable' +p5322 +(dp5323 +S'editable' +p5324 +I00 +sS'value' +p5325 +I00 +ssS'unique' +p5326 +(dp5327 +S'editable' +p5328 +I00 +sS'value' +p5329 +I00 +ssS'properties' +p5330 +(dp5331 +S'default_value' +p5332 +(dp5333 +S'editable' +p5334 +I00 +sS'value' +p5335 +NssS'summary_default' +p5336 +(dp5337 +S'editable' +p5338 +I01 +sS'value' +p5339 +S'none' +p5340 +sssS'description' +p5341 +(dp5342 +S'editable' +p5343 +I01 +sS'value' +p5344 +g47 +sssS'updated_by' +p5345 +(dp5346 +S'mandatory' +p5347 +(dp5348 +S'editable' +p5349 +I00 +sS'value' +p5350 +I00 +ssS'name' +p5351 +(dp5352 +S'editable' +p5353 +I01 +sS'value' +p5354 +S'Updated by' +p5355 +ssS'data_type' +p5356 +(dp5357 +S'editable' +p5358 +I00 +sS'value' +p5359 +S'entity' +p5360 +ssS'entity_type' +p5361 +(dp5362 +S'editable' +p5363 +I00 +sS'value' +p5364 +S'Attachment' +p5365 +ssS'editable' +p5366 +(dp5367 +S'editable' +p5368 +I00 +sS'value' +p5369 +I00 +ssS'unique' +p5370 +(dp5371 +S'editable' +p5372 +I00 +sS'value' +p5373 +I00 +ssS'properties' +p5374 +(dp5375 +S'default_value' +p5376 +(dp5377 +S'editable' +p5378 +I00 +sS'value' +p5379 +NssS'summary_default' +p5380 +(dp5381 +S'editable' +p5382 +I01 +sS'value' +p5383 +S'none' +p5384 +ssS'valid_types' +p5385 +(dp5386 +S'editable' +p5387 +I01 +sS'value' +p5388 +(lp5389 +S'HumanUser' +p5390 +aS'ApiUser' +p5391 +asssS'description' +p5392 +(dp5393 +S'editable' +p5394 +I01 +sS'value' +p5395 +g47 +sssS'queue_for_s3_upload' +p5396 +(dp5397 +S'mandatory' +p5398 +(dp5399 +S'editable' +p5400 +I00 +sS'value' +p5401 +I00 +ssS'name' +p5402 +(dp5403 +S'editable' +p5404 +I01 +sS'value' +p5405 +S'Queue for S3 Upload' +p5406 +ssS'data_type' +p5407 +(dp5408 +S'editable' +p5409 +I00 +sS'value' +p5410 +S'checkbox' +p5411 +ssS'entity_type' +p5412 +(dp5413 +S'editable' +p5414 +I00 +sS'value' +p5415 +S'Attachment' +p5416 +ssS'editable' +p5417 +(dp5418 +S'editable' +p5419 +I00 +sS'value' +p5420 +I00 +ssS'unique' +p5421 +(dp5422 +S'editable' +p5423 +I00 +sS'value' +p5424 +I00 +ssS'properties' +p5425 +(dp5426 +S'default_value' +p5427 +(dp5428 +S'editable' +p5429 +I00 +sS'value' +p5430 +I0 +ssS'summary_default' +p5431 +(dp5432 +S'editable' +p5433 +I01 +sS'value' +p5434 +S'none' +p5435 +sssS'description' +p5436 +(dp5437 +S'editable' +p5438 +I01 +sS'value' +p5439 +g47 +sssS'display_name' +p5440 +(dp5441 +S'mandatory' +p5442 +(dp5443 +S'editable' +p5444 +I00 +sS'value' +p5445 +I00 +ssS'name' +p5446 +(dp5447 +S'editable' +p5448 +I01 +sS'value' +p5449 +S'File Display Name' +p5450 +ssS'data_type' +p5451 +(dp5452 +S'editable' +p5453 +I00 +sS'value' +p5454 +S'text' +p5455 +ssS'entity_type' +p5456 +(dp5457 +S'editable' +p5458 +I00 +sS'value' +p5459 +S'Attachment' +p5460 +ssS'editable' +p5461 +(dp5462 +S'editable' +p5463 +I00 +sS'value' +p5464 +I01 +ssS'unique' +p5465 +(dp5466 +S'editable' +p5467 +I00 +sS'value' +p5468 +I00 +ssS'properties' +p5469 +(dp5470 +S'default_value' +p5471 +(dp5472 +S'editable' +p5473 +I00 +sS'value' +p5474 +NssS'summary_default' +p5475 +(dp5476 +S'editable' +p5477 +I01 +sS'value' +p5478 +S'none' +p5479 +sssS'description' +p5480 +(dp5481 +S'editable' +p5482 +I01 +sS'value' +p5483 +g47 +sssS'image' +p5484 +(dp5485 +S'mandatory' +p5486 +(dp5487 +S'editable' +p5488 +I00 +sS'value' +p5489 +I00 +ssS'name' +p5490 +(dp5491 +S'editable' +p5492 +I01 +sS'value' +p5493 +S'Thumbnail' +p5494 +ssS'data_type' +p5495 +(dp5496 +S'editable' +p5497 +I00 +sS'value' +p5498 +S'image' +p5499 +ssS'entity_type' +p5500 +(dp5501 +S'editable' +p5502 +I00 +sS'value' +p5503 +S'Attachment' +p5504 +ssS'editable' +p5505 +(dp5506 +S'editable' +p5507 +I00 +sS'value' +p5508 +I01 +ssS'unique' +p5509 +(dp5510 +S'editable' +p5511 +I00 +sS'value' +p5512 +I00 +ssS'properties' +p5513 +(dp5514 +S'default_value' +p5515 +(dp5516 +S'editable' +p5517 +I00 +sS'value' +p5518 +NssS'summary_default' +p5519 +(dp5520 +S'editable' +p5521 +I01 +sS'value' +p5522 +S'none' +p5523 +sssS'description' +p5524 +(dp5525 +S'editable' +p5526 +I01 +sS'value' +p5527 +g47 +sssS'task_template' +p5528 +(dp5529 +S'mandatory' +p5530 +(dp5531 +S'editable' +p5532 +I00 +sS'value' +p5533 +I00 +ssS'name' +p5534 +(dp5535 +S'editable' +p5536 +I01 +sS'value' +p5537 +S'Task Template' +p5538 +ssS'data_type' +p5539 +(dp5540 +S'editable' +p5541 +I00 +sS'value' +p5542 +S'entity' +p5543 +ssS'entity_type' +p5544 +(dp5545 +S'editable' +p5546 +I00 +sS'value' +p5547 +S'Attachment' +p5548 +ssS'editable' +p5549 +(dp5550 +S'editable' +p5551 +I00 +sS'value' +p5552 +I01 +ssS'unique' +p5553 +(dp5554 +S'editable' +p5555 +I00 +sS'value' +p5556 +I00 +ssS'properties' +p5557 +(dp5558 +S'default_value' +p5559 +(dp5560 +S'editable' +p5561 +I00 +sS'value' +p5562 +NssS'summary_default' +p5563 +(dp5564 +S'editable' +p5565 +I01 +sS'value' +p5566 +S'none' +p5567 +ssS'valid_types' +p5568 +(dp5569 +S'editable' +p5570 +I01 +sS'value' +p5571 +(lp5572 +S'TaskTemplate' +p5573 +asssS'description' +p5574 +(dp5575 +S'editable' +p5576 +I01 +sS'value' +p5577 +g47 +sssS'created_by' +p5578 +(dp5579 +S'mandatory' +p5580 +(dp5581 +S'editable' +p5582 +I00 +sS'value' +p5583 +I00 +ssS'name' +p5584 +(dp5585 +S'editable' +p5586 +I01 +sS'value' +p5587 +S'Created by' +p5588 +ssS'data_type' +p5589 +(dp5590 +S'editable' +p5591 +I00 +sS'value' +p5592 +S'entity' +p5593 +ssS'entity_type' +p5594 +(dp5595 +S'editable' +p5596 +I00 +sS'value' +p5597 +S'Attachment' +p5598 +ssS'editable' +p5599 +(dp5600 +S'editable' +p5601 +I00 +sS'value' +p5602 +I00 +ssS'unique' +p5603 +(dp5604 +S'editable' +p5605 +I00 +sS'value' +p5606 +I00 +ssS'properties' +p5607 +(dp5608 +S'default_value' +p5609 +(dp5610 +S'editable' +p5611 +I00 +sS'value' +p5612 +NssS'summary_default' +p5613 +(dp5614 +S'editable' +p5615 +I01 +sS'value' +p5616 +S'none' +p5617 +ssS'valid_types' +p5618 +(dp5619 +S'editable' +p5620 +I01 +sS'value' +p5621 +(lp5622 +S'HumanUser' +p5623 +aS'ApiUser' +p5624 +asssS'description' +p5625 +(dp5626 +S'editable' +p5627 +I01 +sS'value' +p5628 +g47 +sssS'filename' +p5629 +(dp5630 +S'mandatory' +p5631 +(dp5632 +S'editable' +p5633 +I00 +sS'value' +p5634 +I00 +ssS'name' +p5635 +(dp5636 +S'editable' +p5637 +I01 +sS'value' +p5638 +S'File Name' +p5639 +ssS'data_type' +p5640 +(dp5641 +S'editable' +p5642 +I00 +sS'value' +p5643 +S'text' +p5644 +ssS'entity_type' +p5645 +(dp5646 +S'editable' +p5647 +I00 +sS'value' +p5648 +S'Attachment' +p5649 +ssS'editable' +p5650 +(dp5651 +S'editable' +p5652 +I00 +sS'value' +p5653 +I00 +ssS'unique' +p5654 +(dp5655 +S'editable' +p5656 +I00 +sS'value' +p5657 +I00 +ssS'properties' +p5658 +(dp5659 +S'default_value' +p5660 +(dp5661 +S'editable' +p5662 +I00 +sS'value' +p5663 +NssS'summary_default' +p5664 +(dp5665 +S'editable' +p5666 +I01 +sS'value' +p5667 +S'none' +p5668 +sssS'description' +p5669 +(dp5670 +S'editable' +p5671 +I01 +sS'value' +p5672 +g47 +sssS'sg_status_list' +p5673 +(dp5674 +S'mandatory' +p5675 +(dp5676 +S'editable' +p5677 +I00 +sS'value' +p5678 +I00 +ssS'name' +p5679 +(dp5680 +S'editable' +p5681 +I01 +sS'value' +p5682 +S'Status' +p5683 +ssS'data_type' +p5684 +(dp5685 +S'editable' +p5686 +I00 +sS'value' +p5687 +S'status_list' +p5688 +ssS'entity_type' +p5689 +(dp5690 +S'editable' +p5691 +I00 +sS'value' +p5692 +S'Attachment' +p5693 +ssS'editable' +p5694 +(dp5695 +S'editable' +p5696 +I00 +sS'value' +p5697 +I01 +ssS'unique' +p5698 +(dp5699 +S'editable' +p5700 +I00 +sS'value' +p5701 +I00 +ssS'properties' +p5702 +(dp5703 +S'default_value' +p5704 +(dp5705 +S'editable' +p5706 +I01 +sS'value' +p5707 +S'na' +p5708 +ssS'valid_values' +p5709 +(dp5710 +S'editable' +p5711 +I01 +sS'value' +p5712 +(lp5713 +S'fin' +p5714 +aS'na' +p5715 +assS'summary_default' +p5716 +(dp5717 +S'editable' +p5718 +I01 +sS'value' +p5719 +S'status_list' +p5720 +sssS'description' +p5721 +(dp5722 +S'editable' +p5723 +I01 +sS'value' +p5724 +g47 +sssS'attachment_links' +p5725 +(dp5726 +S'mandatory' +p5727 +(dp5728 +S'editable' +p5729 +I00 +sS'value' +p5730 +I00 +ssS'name' +p5731 +(dp5732 +S'editable' +p5733 +I01 +sS'value' +p5734 +S'Links' +p5735 +ssS'data_type' +p5736 +(dp5737 +S'editable' +p5738 +I00 +sS'value' +p5739 +S'multi_entity' +p5740 +ssS'entity_type' +p5741 +(dp5742 +S'editable' +p5743 +I00 +sS'value' +p5744 +S'Attachment' +p5745 +ssS'editable' +p5746 +(dp5747 +S'editable' +p5748 +I00 +sS'value' +p5749 +I01 +ssS'unique' +p5750 +(dp5751 +S'editable' +p5752 +I00 +sS'value' +p5753 +I00 +ssS'properties' +p5754 +(dp5755 +S'default_value' +p5756 +(dp5757 +S'editable' +p5758 +I00 +sS'value' +p5759 +NssS'summary_default' +p5760 +(dp5761 +S'editable' +p5762 +I01 +sS'value' +p5763 +S'none' +p5764 +ssS'valid_types' +p5765 +(dp5766 +S'editable' +p5767 +I00 +sS'value' +p5768 +(lp5769 +S'Asset' +p5770 +aS'Scene' +p5771 +aS'Sequence' +p5772 +aS'Shot' +p5773 +aS'Version' +p5774 +asssS'description' +p5775 +(dp5776 +S'editable' +p5777 +I01 +sS'value' +p5778 +g47 +sssS'description' +p5779 +(dp5780 +S'mandatory' +p5781 +(dp5782 +S'editable' +p5783 +I00 +sS'value' +p5784 +I00 +ssS'name' +p5785 +(dp5786 +S'editable' +p5787 +I01 +sS'value' +p5788 +S'Description' +p5789 +ssS'data_type' +p5790 +(dp5791 +S'editable' +p5792 +I00 +sS'value' +p5793 +S'text' +p5794 +ssS'entity_type' +p5795 +(dp5796 +S'editable' +p5797 +I00 +sS'value' +p5798 +S'Attachment' +p5799 +ssS'editable' +p5800 +(dp5801 +S'editable' +p5802 +I00 +sS'value' +p5803 +I01 +ssS'unique' +p5804 +(dp5805 +S'editable' +p5806 +I00 +sS'value' +p5807 +I00 +ssS'properties' +p5808 +(dp5809 +S'default_value' +p5810 +(dp5811 +S'editable' +p5812 +I00 +sS'value' +p5813 +NssS'summary_default' +p5814 +(dp5815 +S'editable' +p5816 +I01 +sS'value' +p5817 +S'none' +p5818 +sssS'description' +p5819 +(dp5820 +S'editable' +p5821 +I01 +sS'value' +p5822 +g47 +sssS'local_storage' +p5823 +(dp5824 +S'mandatory' +p5825 +(dp5826 +S'editable' +p5827 +I00 +sS'value' +p5828 +I00 +ssS'name' +p5829 +(dp5830 +S'editable' +p5831 +I01 +sS'value' +p5832 +S'Local File Storage' +p5833 +ssS'data_type' +p5834 +(dp5835 +S'editable' +p5836 +I00 +sS'value' +p5837 +S'entity' +p5838 +ssS'entity_type' +p5839 +(dp5840 +S'editable' +p5841 +I00 +sS'value' +p5842 +S'Attachment' +p5843 +ssS'editable' +p5844 +(dp5845 +S'editable' +p5846 +I00 +sS'value' +p5847 +I00 +ssS'unique' +p5848 +(dp5849 +S'editable' +p5850 +I00 +sS'value' +p5851 +I00 +ssS'properties' +p5852 +(dp5853 +S'default_value' +p5854 +(dp5855 +S'editable' +p5856 +I00 +sS'value' +p5857 +NssS'summary_default' +p5858 +(dp5859 +S'editable' +p5860 +I00 +sS'value' +p5861 +S'none' +p5862 +ssS'valid_types' +p5863 +(dp5864 +S'editable' +p5865 +I00 +sS'value' +p5866 +(lp5867 +S'LocalStorage' +p5868 +asssS'description' +p5869 +(dp5870 +S'editable' +p5871 +I01 +sS'value' +p5872 +g47 +sssS'open_notes' +p5873 +(dp5874 +S'mandatory' +p5875 +(dp5876 +S'editable' +p5877 +I00 +sS'value' +p5878 +I00 +ssS'name' +p5879 +(dp5880 +S'editable' +p5881 +I01 +sS'value' +p5882 +S'Open Notes' +p5883 +ssS'data_type' +p5884 +(dp5885 +S'editable' +p5886 +I00 +sS'value' +p5887 +S'multi_entity' +p5888 +ssS'entity_type' +p5889 +(dp5890 +S'editable' +p5891 +I00 +sS'value' +p5892 +S'Attachment' +p5893 +ssS'editable' +p5894 +(dp5895 +S'editable' +p5896 +I00 +sS'value' +p5897 +I00 +ssS'unique' +p5898 +(dp5899 +S'editable' +p5900 +I00 +sS'value' +p5901 +I00 +ssS'properties' +p5902 +(dp5903 +S'default_value' +p5904 +(dp5905 +S'editable' +p5906 +I00 +sS'value' +p5907 +NssS'summary_default' +p5908 +(dp5909 +S'editable' +p5910 +I01 +sS'value' +p5911 +S'none' +p5912 +ssS'valid_types' +p5913 +(dp5914 +S'editable' +p5915 +I01 +sS'value' +p5916 +(lp5917 +S'Note' +p5918 +asssS'description' +p5919 +(dp5920 +S'editable' +p5921 +I01 +sS'value' +p5922 +g47 +sssS'step_0' +p5923 +(dp5924 +S'mandatory' +p5925 +(dp5926 +S'editable' +p5927 +I00 +sS'value' +p5928 +I00 +ssS'name' +p5929 +(dp5930 +S'editable' +p5931 +I01 +sS'value' +p5932 +S'ALL TASKS' +p5933 +ssS'data_type' +p5934 +(dp5935 +S'editable' +p5936 +I00 +sS'value' +p5937 +S'pivot_column' +p5938 +ssS'entity_type' +p5939 +(dp5940 +S'editable' +p5941 +I00 +sS'value' +p5942 +S'Attachment' +p5943 +ssS'editable' +p5944 +(dp5945 +S'editable' +p5946 +I00 +sS'value' +p5947 +I00 +ssS'unique' +p5948 +(dp5949 +S'editable' +p5950 +I00 +sS'value' +p5951 +I00 +ssS'properties' +p5952 +(dp5953 +S'default_value' +p5954 +(dp5955 +S'editable' +p5956 +I00 +sS'value' +p5957 +NssS'summary_default' +p5958 +(dp5959 +S'editable' +p5960 +I00 +sS'value' +p5961 +S'none' +p5962 +sssS'description' +p5963 +(dp5964 +S'editable' +p5965 +I01 +sS'value' +p5966 +g47 +sssS'created_at' +p5967 +(dp5968 +S'mandatory' +p5969 +(dp5970 +S'editable' +p5971 +I00 +sS'value' +p5972 +I00 +ssS'name' +p5973 +(dp5974 +S'editable' +p5975 +I01 +sS'value' +p5976 +S'Date Created' +p5977 +ssS'data_type' +p5978 +(dp5979 +S'editable' +p5980 +I00 +sS'value' +p5981 +S'date_time' +p5982 +ssS'entity_type' +p5983 +(dp5984 +S'editable' +p5985 +I00 +sS'value' +p5986 +S'Attachment' +p5987 +ssS'editable' +p5988 +(dp5989 +S'editable' +p5990 +I00 +sS'value' +p5991 +I00 +ssS'unique' +p5992 +(dp5993 +S'editable' +p5994 +I00 +sS'value' +p5995 +I00 +ssS'properties' +p5996 +(dp5997 +S'default_value' +p5998 +(dp5999 +S'editable' +p6000 +I00 +sS'value' +p6001 +NssS'summary_default' +p6002 +(dp6003 +S'editable' +p6004 +I01 +sS'value' +p6005 +S'none' +p6006 +sssS'description' +p6007 +(dp6008 +S'editable' +p6009 +I01 +sS'value' +p6010 +g47 +sssS'project' +p6011 +(dp6012 +S'mandatory' +p6013 +(dp6014 +S'editable' +p6015 +I00 +sS'value' +p6016 +I00 +ssS'name' +p6017 +(dp6018 +S'editable' +p6019 +I01 +sS'value' +p6020 +S'Project' +p6021 +ssS'data_type' +p6022 +(dp6023 +S'editable' +p6024 +I00 +sS'value' +p6025 +S'entity' +p6026 +ssS'entity_type' +p6027 +(dp6028 +S'editable' +p6029 +I00 +sS'value' +p6030 +S'Attachment' +p6031 +ssS'editable' +p6032 +(dp6033 +S'editable' +p6034 +I00 +sS'value' +p6035 +I01 +ssS'unique' +p6036 +(dp6037 +S'editable' +p6038 +I00 +sS'value' +p6039 +I00 +ssS'properties' +p6040 +(dp6041 +S'default_value' +p6042 +(dp6043 +S'editable' +p6044 +I00 +sS'value' +p6045 +NssS'summary_default' +p6046 +(dp6047 +S'editable' +p6048 +I01 +sS'value' +p6049 +S'none' +p6050 +ssS'valid_types' +p6051 +(dp6052 +S'editable' +p6053 +I01 +sS'value' +p6054 +(lp6055 +S'Project' +p6056 +asssS'description' +p6057 +(dp6058 +S'editable' +p6059 +I01 +sS'value' +p6060 +g47 +sssS'filmstrip_image' +p6061 +(dp6062 +S'mandatory' +p6063 +(dp6064 +S'editable' +p6065 +I00 +sS'value' +p6066 +I00 +ssS'name' +p6067 +(dp6068 +S'editable' +p6069 +I01 +sS'value' +p6070 +S'Filmstrip Thumbnail' +p6071 +ssS'data_type' +p6072 +(dp6073 +S'editable' +p6074 +I00 +sS'value' +p6075 +S'image' +p6076 +ssS'entity_type' +p6077 +(dp6078 +S'editable' +p6079 +I00 +sS'value' +p6080 +S'Attachment' +p6081 +ssS'editable' +p6082 +(dp6083 +S'editable' +p6084 +I00 +sS'value' +p6085 +I01 +ssS'unique' +p6086 +(dp6087 +S'editable' +p6088 +I00 +sS'value' +p6089 +I00 +ssS'properties' +p6090 +(dp6091 +S'default_value' +p6092 +(dp6093 +S'editable' +p6094 +I00 +sS'value' +p6095 +NssS'summary_default' +p6096 +(dp6097 +S'editable' +p6098 +I01 +sS'value' +p6099 +S'none' +p6100 +sssS'description' +p6101 +(dp6102 +S'editable' +p6103 +I01 +sS'value' +p6104 +g47 +sssS'this_file' +p6105 +(dp6106 +S'mandatory' +p6107 +(dp6108 +S'editable' +p6109 +I00 +sS'value' +p6110 +I01 +ssS'name' +p6111 +(dp6112 +S'editable' +p6113 +I01 +sS'value' +p6114 +S'File' +p6115 +ssS'data_type' +p6116 +(dp6117 +S'editable' +p6118 +I00 +sS'value' +p6119 +S'url' +p6120 +ssS'entity_type' +p6121 +(dp6122 +S'editable' +p6123 +I00 +sS'value' +p6124 +S'Attachment' +p6125 +ssS'editable' +p6126 +(dp6127 +S'editable' +p6128 +I00 +sS'value' +p6129 +I00 +ssS'unique' +p6130 +(dp6131 +S'editable' +p6132 +I00 +sS'value' +p6133 +I00 +ssS'properties' +p6134 +(dp6135 +S'default_value' +p6136 +(dp6137 +S'editable' +p6138 +I00 +sS'value' +p6139 +NssS'open_in_new_window' +p6140 +(dp6141 +S'editable' +p6142 +I01 +sS'value' +p6143 +I01 +ssS'summary_default' +p6144 +(dp6145 +S'editable' +p6146 +I01 +sS'value' +p6147 +S'none' +p6148 +sssS'description' +p6149 +(dp6150 +S'editable' +p6151 +I01 +sS'value' +p6152 +g47 +sssS'sg_type' +p6153 +(dp6154 +S'mandatory' +p6155 +(dp6156 +S'editable' +p6157 +I00 +sS'value' +p6158 +I00 +ssS'name' +p6159 +(dp6160 +S'editable' +p6161 +I01 +sS'value' +p6162 +S'Type' +p6163 +ssS'data_type' +p6164 +(dp6165 +S'editable' +p6166 +I00 +sS'value' +p6167 +S'text' +p6168 +ssS'entity_type' +p6169 +(dp6170 +S'editable' +p6171 +I00 +sS'value' +p6172 +S'Attachment' +p6173 +ssS'editable' +p6174 +(dp6175 +S'editable' +p6176 +I00 +sS'value' +p6177 +I01 +ssS'unique' +p6178 +(dp6179 +S'editable' +p6180 +I00 +sS'value' +p6181 +I00 +ssS'properties' +p6182 +(dp6183 +S'default_value' +p6184 +(dp6185 +S'editable' +p6186 +I00 +sS'value' +p6187 +NssS'summary_default' +p6188 +(dp6189 +S'editable' +p6190 +I01 +sS'value' +p6191 +S'none' +p6192 +sssS'description' +p6193 +(dp6194 +S'editable' +p6195 +I01 +sS'value' +p6196 +g47 +sssS'tag_list' +p6197 +(dp6198 +S'mandatory' +p6199 +(dp6200 +S'editable' +p6201 +I00 +sS'value' +p6202 +I00 +ssS'name' +p6203 +(dp6204 +S'editable' +p6205 +I01 +sS'value' +p6206 +S'Tags' +p6207 +ssS'data_type' +p6208 +(dp6209 +S'editable' +p6210 +I00 +sS'value' +p6211 +S'tag_list' +p6212 +ssS'entity_type' +p6213 +(dp6214 +S'editable' +p6215 +I00 +sS'value' +p6216 +S'Attachment' +p6217 +ssS'editable' +p6218 +(dp6219 +S'editable' +p6220 +I00 +sS'value' +p6221 +I01 +ssS'unique' +p6222 +(dp6223 +S'editable' +p6224 +I00 +sS'value' +p6225 +I00 +ssS'properties' +p6226 +(dp6227 +S'default_value' +p6228 +(dp6229 +S'editable' +p6230 +I00 +sS'value' +p6231 +NssS'summary_default' +p6232 +(dp6233 +S'editable' +p6234 +I01 +sS'value' +p6235 +S'none' +p6236 +ssS'valid_types' +p6237 +(dp6238 +S'editable' +p6239 +I01 +sS'value' +p6240 +(lp6241 +S'Tag' +p6242 +asssS'description' +p6243 +(dp6244 +S'editable' +p6245 +I01 +sS'value' +p6246 +g47 +sssS'notes' +p6247 +(dp6248 +S'mandatory' +p6249 +(dp6250 +S'editable' +p6251 +I00 +sS'value' +p6252 +I00 +ssS'name' +p6253 +(dp6254 +S'editable' +p6255 +I01 +sS'value' +p6256 +S'Notes' +p6257 +ssS'data_type' +p6258 +(dp6259 +S'editable' +p6260 +I00 +sS'value' +p6261 +S'multi_entity' +p6262 +ssS'entity_type' +p6263 +(dp6264 +S'editable' +p6265 +I00 +sS'value' +p6266 +S'Attachment' +p6267 +ssS'editable' +p6268 +(dp6269 +S'editable' +p6270 +I00 +sS'value' +p6271 +I01 +ssS'unique' +p6272 +(dp6273 +S'editable' +p6274 +I00 +sS'value' +p6275 +I00 +ssS'properties' +p6276 +(dp6277 +S'default_value' +p6278 +(dp6279 +S'editable' +p6280 +I00 +sS'value' +p6281 +NssS'summary_default' +p6282 +(dp6283 +S'editable' +p6284 +I01 +sS'value' +p6285 +S'none' +p6286 +ssS'valid_types' +p6287 +(dp6288 +S'editable' +p6289 +I01 +sS'value' +p6290 +(lp6291 +S'Note' +p6292 +asssS'description' +p6293 +(dp6294 +S'editable' +p6295 +I01 +sS'value' +p6296 +g47 +ssssS'AssetMocapTakeConnection' +p6297 +(dp6298 +S'mocap_take' +p6299 +(dp6300 +S'mandatory' +p6301 +(dp6302 +S'editable' +p6303 +I00 +sS'value' +p6304 +I00 +ssS'name' +p6305 +(dp6306 +S'editable' +p6307 +I01 +sS'value' +p6308 +S'Mocap Take' +p6309 +ssS'data_type' +p6310 +(dp6311 +S'editable' +p6312 +I00 +sS'value' +p6313 +S'entity' +p6314 +ssS'entity_type' +p6315 +(dp6316 +S'editable' +p6317 +I00 +sS'value' +p6318 +S'AssetMocapTakeConnection' +p6319 +ssS'editable' +p6320 +(dp6321 +S'editable' +p6322 +I00 +sS'value' +p6323 +I00 +ssS'unique' +p6324 +(dp6325 +S'editable' +p6326 +I00 +sS'value' +p6327 +I00 +ssS'properties' +p6328 +(dp6329 +S'default_value' +p6330 +(dp6331 +S'editable' +p6332 +I00 +sS'value' +p6333 +NssS'summary_default' +p6334 +(dp6335 +S'editable' +p6336 +I00 +sS'value' +p6337 +S'none' +p6338 +ssS'valid_types' +p6339 +(dp6340 +S'editable' +p6341 +I00 +sS'value' +p6342 +(lp6343 +S'MocapTake' +p6344 +asssS'description' +p6345 +(dp6346 +S'editable' +p6347 +I01 +sS'value' +p6348 +g47 +sssS'cached_display_name' +p6349 +(dp6350 +S'mandatory' +p6351 +(dp6352 +S'editable' +p6353 +I00 +sS'value' +p6354 +I00 +ssS'name' +p6355 +(dp6356 +S'editable' +p6357 +I01 +sS'value' +p6358 +S'Cached Display Name' +p6359 +ssS'data_type' +p6360 +(dp6361 +S'editable' +p6362 +I00 +sS'value' +p6363 +S'text' +p6364 +ssS'entity_type' +p6365 +(dp6366 +S'editable' +p6367 +I00 +sS'value' +p6368 +S'AssetMocapTakeConnection' +p6369 +ssS'editable' +p6370 +(dp6371 +S'editable' +p6372 +I00 +sS'value' +p6373 +I01 +ssS'unique' +p6374 +(dp6375 +S'editable' +p6376 +I00 +sS'value' +p6377 +I00 +ssS'properties' +p6378 +(dp6379 +S'default_value' +p6380 +(dp6381 +S'editable' +p6382 +I00 +sS'value' +p6383 +NssS'summary_default' +p6384 +(dp6385 +S'editable' +p6386 +I00 +sS'value' +p6387 +S'none' +p6388 +sssS'description' +p6389 +(dp6390 +S'editable' +p6391 +I01 +sS'value' +p6392 +g47 +sssS'asset' +p6393 +(dp6394 +S'mandatory' +p6395 +(dp6396 +S'editable' +p6397 +I00 +sS'value' +p6398 +I00 +ssS'name' +p6399 +(dp6400 +S'editable' +p6401 +I01 +sS'value' +p6402 +S'Asset' +p6403 +ssS'data_type' +p6404 +(dp6405 +S'editable' +p6406 +I00 +sS'value' +p6407 +S'entity' +p6408 +ssS'entity_type' +p6409 +(dp6410 +S'editable' +p6411 +I00 +sS'value' +p6412 +S'AssetMocapTakeConnection' +p6413 +ssS'editable' +p6414 +(dp6415 +S'editable' +p6416 +I00 +sS'value' +p6417 +I00 +ssS'unique' +p6418 +(dp6419 +S'editable' +p6420 +I00 +sS'value' +p6421 +I00 +ssS'properties' +p6422 +(dp6423 +S'default_value' +p6424 +(dp6425 +S'editable' +p6426 +I00 +sS'value' +p6427 +NssS'summary_default' +p6428 +(dp6429 +S'editable' +p6430 +I00 +sS'value' +p6431 +S'none' +p6432 +ssS'valid_types' +p6433 +(dp6434 +S'editable' +p6435 +I00 +sS'value' +p6436 +(lp6437 +S'Asset' +p6438 +asssS'description' +p6439 +(dp6440 +S'editable' +p6441 +I01 +sS'value' +p6442 +g47 +sssS'id' +p6443 +(dp6444 +S'mandatory' +p6445 +(dp6446 +S'editable' +p6447 +I00 +sS'value' +p6448 +I01 +ssS'name' +p6449 +(dp6450 +S'editable' +p6451 +I01 +sS'value' +p6452 +S'Id' +p6453 +ssS'data_type' +p6454 +(dp6455 +S'editable' +p6456 +I00 +sS'value' +p6457 +S'number' +p6458 +ssS'entity_type' +p6459 +(dp6460 +S'editable' +p6461 +I00 +sS'value' +p6462 +S'AssetMocapTakeConnection' +p6463 +ssS'editable' +p6464 +(dp6465 +S'editable' +p6466 +I00 +sS'value' +p6467 +I00 +ssS'unique' +p6468 +(dp6469 +S'editable' +p6470 +I00 +sS'value' +p6471 +I00 +ssS'properties' +p6472 +(dp6473 +S'default_value' +p6474 +(dp6475 +S'editable' +p6476 +I00 +sS'value' +p6477 +NssS'summary_default' +p6478 +(dp6479 +S'editable' +p6480 +I00 +sS'value' +p6481 +S'none' +p6482 +sssS'description' +p6483 +(dp6484 +S'editable' +p6485 +I01 +sS'value' +p6486 +g47 +ssssS'Department' +p6487 +(dp6488 +S'open_notes_count' +p6489 +(dp6490 +S'mandatory' +p6491 +(dp6492 +S'editable' +p6493 +I00 +sS'value' +p6494 +I00 +ssS'name' +p6495 +(dp6496 +S'editable' +p6497 +I01 +sS'value' +p6498 +S'Open Notes Count' +p6499 +ssS'data_type' +p6500 +(dp6501 +S'editable' +p6502 +I00 +sS'value' +p6503 +S'text' +p6504 +ssS'entity_type' +p6505 +(dp6506 +S'editable' +p6507 +I00 +sS'value' +p6508 +S'Department' +p6509 +ssS'editable' +p6510 +(dp6511 +S'editable' +p6512 +I00 +sS'value' +p6513 +I00 +ssS'unique' +p6514 +(dp6515 +S'editable' +p6516 +I00 +sS'value' +p6517 +I00 +ssS'properties' +p6518 +(dp6519 +S'default_value' +p6520 +(dp6521 +S'editable' +p6522 +I00 +sS'value' +p6523 +NssS'summary_default' +p6524 +(dp6525 +S'editable' +p6526 +I01 +sS'value' +p6527 +S'none' +p6528 +sssS'description' +p6529 +(dp6530 +S'editable' +p6531 +I01 +sS'value' +p6532 +g47 +sssS'code' +p6533 +(dp6534 +S'mandatory' +p6535 +(dp6536 +S'editable' +p6537 +I00 +sS'value' +p6538 +I00 +ssS'name' +p6539 +(dp6540 +S'editable' +p6541 +I01 +sS'value' +p6542 +S'Department Short Name' +p6543 +ssS'data_type' +p6544 +(dp6545 +S'editable' +p6546 +I00 +sS'value' +p6547 +S'text' +p6548 +ssS'entity_type' +p6549 +(dp6550 +S'editable' +p6551 +I00 +sS'value' +p6552 +S'Department' +p6553 +ssS'editable' +p6554 +(dp6555 +S'editable' +p6556 +I00 +sS'value' +p6557 +I01 +ssS'unique' +p6558 +(dp6559 +S'editable' +p6560 +I00 +sS'value' +p6561 +I00 +ssS'properties' +p6562 +(dp6563 +S'default_value' +p6564 +(dp6565 +S'editable' +p6566 +I00 +sS'value' +p6567 +NssS'summary_default' +p6568 +(dp6569 +S'editable' +p6570 +I01 +sS'value' +p6571 +S'none' +p6572 +sssS'description' +p6573 +(dp6574 +S'editable' +p6575 +I01 +sS'value' +p6576 +g47 +sssS'open_notes' +p6577 +(dp6578 +S'mandatory' +p6579 +(dp6580 +S'editable' +p6581 +I00 +sS'value' +p6582 +I00 +ssS'name' +p6583 +(dp6584 +S'editable' +p6585 +I01 +sS'value' +p6586 +S'Open Notes' +p6587 +ssS'data_type' +p6588 +(dp6589 +S'editable' +p6590 +I00 +sS'value' +p6591 +S'multi_entity' +p6592 +ssS'entity_type' +p6593 +(dp6594 +S'editable' +p6595 +I00 +sS'value' +p6596 +S'Department' +p6597 +ssS'editable' +p6598 +(dp6599 +S'editable' +p6600 +I00 +sS'value' +p6601 +I00 +ssS'unique' +p6602 +(dp6603 +S'editable' +p6604 +I00 +sS'value' +p6605 +I00 +ssS'properties' +p6606 +(dp6607 +S'default_value' +p6608 +(dp6609 +S'editable' +p6610 +I00 +sS'value' +p6611 +NssS'summary_default' +p6612 +(dp6613 +S'editable' +p6614 +I01 +sS'value' +p6615 +S'none' +p6616 +ssS'valid_types' +p6617 +(dp6618 +S'editable' +p6619 +I01 +sS'value' +p6620 +(lp6621 +S'Note' +p6622 +asssS'description' +p6623 +(dp6624 +S'editable' +p6625 +I01 +sS'value' +p6626 +g47 +sssS'users' +p6627 +(dp6628 +S'mandatory' +p6629 +(dp6630 +S'editable' +p6631 +I00 +sS'value' +p6632 +I00 +ssS'name' +p6633 +(dp6634 +S'editable' +p6635 +I01 +sS'value' +p6636 +S'People' +p6637 +ssS'data_type' +p6638 +(dp6639 +S'editable' +p6640 +I00 +sS'value' +p6641 +S'multi_entity' +p6642 +ssS'entity_type' +p6643 +(dp6644 +S'editable' +p6645 +I00 +sS'value' +p6646 +S'Department' +p6647 +ssS'editable' +p6648 +(dp6649 +S'editable' +p6650 +I00 +sS'value' +p6651 +I01 +ssS'unique' +p6652 +(dp6653 +S'editable' +p6654 +I00 +sS'value' +p6655 +I00 +ssS'properties' +p6656 +(dp6657 +S'default_value' +p6658 +(dp6659 +S'editable' +p6660 +I00 +sS'value' +p6661 +NssS'summary_default' +p6662 +(dp6663 +S'editable' +p6664 +I01 +sS'value' +p6665 +S'none' +p6666 +ssS'valid_types' +p6667 +(dp6668 +S'editable' +p6669 +I01 +sS'value' +p6670 +(lp6671 +S'HumanUser' +p6672 +asssS'description' +p6673 +(dp6674 +S'editable' +p6675 +I01 +sS'value' +p6676 +g47 +sssS'list_order' +p6677 +(dp6678 +S'mandatory' +p6679 +(dp6680 +S'editable' +p6681 +I00 +sS'value' +p6682 +I00 +ssS'name' +p6683 +(dp6684 +S'editable' +p6685 +I01 +sS'value' +p6686 +S'Order' +p6687 +ssS'data_type' +p6688 +(dp6689 +S'editable' +p6690 +I00 +sS'value' +p6691 +S'number' +p6692 +ssS'entity_type' +p6693 +(dp6694 +S'editable' +p6695 +I00 +sS'value' +p6696 +S'Department' +p6697 +ssS'editable' +p6698 +(dp6699 +S'editable' +p6700 +I00 +sS'value' +p6701 +I01 +ssS'unique' +p6702 +(dp6703 +S'editable' +p6704 +I00 +sS'value' +p6705 +I00 +ssS'properties' +p6706 +(dp6707 +S'default_value' +p6708 +(dp6709 +S'editable' +p6710 +I00 +sS'value' +p6711 +NssS'summary_default' +p6712 +(dp6713 +S'editable' +p6714 +I00 +sS'value' +p6715 +S'none' +p6716 +sssS'description' +p6717 +(dp6718 +S'editable' +p6719 +I01 +sS'value' +p6720 +g47 +sssS'color' +p6721 +(dp6722 +S'mandatory' +p6723 +(dp6724 +S'editable' +p6725 +I00 +sS'value' +p6726 +I00 +ssS'name' +p6727 +(dp6728 +S'editable' +p6729 +I01 +sS'value' +p6730 +S'Color' +p6731 +ssS'data_type' +p6732 +(dp6733 +S'editable' +p6734 +I00 +sS'value' +p6735 +S'color' +p6736 +ssS'entity_type' +p6737 +(dp6738 +S'editable' +p6739 +I00 +sS'value' +p6740 +S'Department' +p6741 +ssS'editable' +p6742 +(dp6743 +S'editable' +p6744 +I00 +sS'value' +p6745 +I01 +ssS'unique' +p6746 +(dp6747 +S'editable' +p6748 +I00 +sS'value' +p6749 +I00 +ssS'properties' +p6750 +(dp6751 +S'default_value' +p6752 +(dp6753 +S'editable' +p6754 +I00 +sS'value' +p6755 +NssS'summary_default' +p6756 +(dp6757 +S'editable' +p6758 +I01 +sS'value' +p6759 +S'none' +p6760 +sssS'description' +p6761 +(dp6762 +S'editable' +p6763 +I01 +sS'value' +p6764 +g47 +sssS'created_at' +p6765 +(dp6766 +S'mandatory' +p6767 +(dp6768 +S'editable' +p6769 +I00 +sS'value' +p6770 +I00 +ssS'name' +p6771 +(dp6772 +S'editable' +p6773 +I01 +sS'value' +p6774 +S'Date Created' +p6775 +ssS'data_type' +p6776 +(dp6777 +S'editable' +p6778 +I00 +sS'value' +p6779 +S'date_time' +p6780 +ssS'entity_type' +p6781 +(dp6782 +S'editable' +p6783 +I00 +sS'value' +p6784 +S'Department' +p6785 +ssS'editable' +p6786 +(dp6787 +S'editable' +p6788 +I00 +sS'value' +p6789 +I00 +ssS'unique' +p6790 +(dp6791 +S'editable' +p6792 +I00 +sS'value' +p6793 +I00 +ssS'properties' +p6794 +(dp6795 +S'default_value' +p6796 +(dp6797 +S'editable' +p6798 +I00 +sS'value' +p6799 +NssS'summary_default' +p6800 +(dp6801 +S'editable' +p6802 +I01 +sS'value' +p6803 +S'none' +p6804 +sssS'description' +p6805 +(dp6806 +S'editable' +p6807 +I01 +sS'value' +p6808 +g47 +sssS'updated_at' +p6809 +(dp6810 +S'mandatory' +p6811 +(dp6812 +S'editable' +p6813 +I00 +sS'value' +p6814 +I00 +ssS'name' +p6815 +(dp6816 +S'editable' +p6817 +I01 +sS'value' +p6818 +S'Date Updated' +p6819 +ssS'data_type' +p6820 +(dp6821 +S'editable' +p6822 +I00 +sS'value' +p6823 +S'date_time' +p6824 +ssS'entity_type' +p6825 +(dp6826 +S'editable' +p6827 +I00 +sS'value' +p6828 +S'Department' +p6829 +ssS'editable' +p6830 +(dp6831 +S'editable' +p6832 +I00 +sS'value' +p6833 +I00 +ssS'unique' +p6834 +(dp6835 +S'editable' +p6836 +I00 +sS'value' +p6837 +I00 +ssS'properties' +p6838 +(dp6839 +S'default_value' +p6840 +(dp6841 +S'editable' +p6842 +I00 +sS'value' +p6843 +NssS'summary_default' +p6844 +(dp6845 +S'editable' +p6846 +I01 +sS'value' +p6847 +S'none' +p6848 +sssS'description' +p6849 +(dp6850 +S'editable' +p6851 +I01 +sS'value' +p6852 +g47 +sssS'created_by' +p6853 +(dp6854 +S'mandatory' +p6855 +(dp6856 +S'editable' +p6857 +I00 +sS'value' +p6858 +I00 +ssS'name' +p6859 +(dp6860 +S'editable' +p6861 +I01 +sS'value' +p6862 +S'Created by' +p6863 +ssS'data_type' +p6864 +(dp6865 +S'editable' +p6866 +I00 +sS'value' +p6867 +S'entity' +p6868 +ssS'entity_type' +p6869 +(dp6870 +S'editable' +p6871 +I00 +sS'value' +p6872 +S'Department' +p6873 +ssS'editable' +p6874 +(dp6875 +S'editable' +p6876 +I00 +sS'value' +p6877 +I00 +ssS'unique' +p6878 +(dp6879 +S'editable' +p6880 +I00 +sS'value' +p6881 +I00 +ssS'properties' +p6882 +(dp6883 +S'default_value' +p6884 +(dp6885 +S'editable' +p6886 +I00 +sS'value' +p6887 +NssS'summary_default' +p6888 +(dp6889 +S'editable' +p6890 +I01 +sS'value' +p6891 +S'none' +p6892 +ssS'valid_types' +p6893 +(dp6894 +S'editable' +p6895 +I01 +sS'value' +p6896 +(lp6897 +S'HumanUser' +p6898 +aS'ApiUser' +p6899 +asssS'description' +p6900 +(dp6901 +S'editable' +p6902 +I01 +sS'value' +p6903 +g47 +sssS'sg_status_list' +p6904 +(dp6905 +S'mandatory' +p6906 +(dp6907 +S'editable' +p6908 +I00 +sS'value' +p6909 +I00 +ssS'name' +p6910 +(dp6911 +S'editable' +p6912 +I01 +sS'value' +p6913 +S'Status' +p6914 +ssS'data_type' +p6915 +(dp6916 +S'editable' +p6917 +I00 +sS'value' +p6918 +S'status_list' +p6919 +ssS'entity_type' +p6920 +(dp6921 +S'editable' +p6922 +I00 +sS'value' +p6923 +S'Department' +p6924 +ssS'editable' +p6925 +(dp6926 +S'editable' +p6927 +I00 +sS'value' +p6928 +I01 +ssS'unique' +p6929 +(dp6930 +S'editable' +p6931 +I00 +sS'value' +p6932 +I00 +ssS'properties' +p6933 +(dp6934 +S'default_value' +p6935 +(dp6936 +S'editable' +p6937 +I01 +sS'value' +p6938 +S'act' +p6939 +ssS'valid_values' +p6940 +(dp6941 +S'editable' +p6942 +I01 +sS'value' +p6943 +(lp6944 +S'act' +p6945 +aS'dis' +p6946 +assS'summary_default' +p6947 +(dp6948 +S'editable' +p6949 +I01 +sS'value' +p6950 +S'none' +p6951 +sssS'description' +p6952 +(dp6953 +S'editable' +p6954 +I01 +sS'value' +p6955 +g47 +sssS'department_type' +p6956 +(dp6957 +S'mandatory' +p6958 +(dp6959 +S'editable' +p6960 +I00 +sS'value' +p6961 +I00 +ssS'name' +p6962 +(dp6963 +S'editable' +p6964 +I01 +sS'value' +p6965 +S'Department Type' +p6966 +ssS'data_type' +p6967 +(dp6968 +S'editable' +p6969 +I00 +sS'value' +p6970 +S'list' +p6971 +ssS'entity_type' +p6972 +(dp6973 +S'editable' +p6974 +I00 +sS'value' +p6975 +S'Department' +p6976 +ssS'editable' +p6977 +(dp6978 +S'editable' +p6979 +I00 +sS'value' +p6980 +I01 +ssS'unique' +p6981 +(dp6982 +S'editable' +p6983 +I00 +sS'value' +p6984 +I00 +ssS'properties' +p6985 +(dp6986 +S'default_value' +p6987 +(dp6988 +S'editable' +p6989 +I00 +sS'value' +p6990 +NssS'valid_values' +p6991 +(dp6992 +S'editable' +p6993 +I01 +sS'value' +p6994 +(lp6995 +ssS'summary_default' +p6996 +(dp6997 +S'editable' +p6998 +I01 +sS'value' +p6999 +S'none' +p7000 +sssS'description' +p7001 +(dp7002 +S'editable' +p7003 +I01 +sS'value' +p7004 +g47 +sssS'image' +p7005 +(dp7006 +S'mandatory' +p7007 +(dp7008 +S'editable' +p7009 +I00 +sS'value' +p7010 +I00 +ssS'name' +p7011 +(dp7012 +S'editable' +p7013 +I01 +sS'value' +p7014 +S'Thumbnail' +p7015 +ssS'data_type' +p7016 +(dp7017 +S'editable' +p7018 +I00 +sS'value' +p7019 +S'image' +p7020 +ssS'entity_type' +p7021 +(dp7022 +S'editable' +p7023 +I00 +sS'value' +p7024 +S'Department' +p7025 +ssS'editable' +p7026 +(dp7027 +S'editable' +p7028 +I00 +sS'value' +p7029 +I01 +ssS'unique' +p7030 +(dp7031 +S'editable' +p7032 +I00 +sS'value' +p7033 +I00 +ssS'properties' +p7034 +(dp7035 +S'default_value' +p7036 +(dp7037 +S'editable' +p7038 +I00 +sS'value' +p7039 +NssS'summary_default' +p7040 +(dp7041 +S'editable' +p7042 +I01 +sS'value' +p7043 +S'none' +p7044 +sssS'description' +p7045 +(dp7046 +S'editable' +p7047 +I01 +sS'value' +p7048 +g47 +sssS'updated_by' +p7049 +(dp7050 +S'mandatory' +p7051 +(dp7052 +S'editable' +p7053 +I00 +sS'value' +p7054 +I00 +ssS'name' +p7055 +(dp7056 +S'editable' +p7057 +I01 +sS'value' +p7058 +S'Updated by' +p7059 +ssS'data_type' +p7060 +(dp7061 +S'editable' +p7062 +I00 +sS'value' +p7063 +S'entity' +p7064 +ssS'entity_type' +p7065 +(dp7066 +S'editable' +p7067 +I00 +sS'value' +p7068 +S'Department' +p7069 +ssS'editable' +p7070 +(dp7071 +S'editable' +p7072 +I00 +sS'value' +p7073 +I00 +ssS'unique' +p7074 +(dp7075 +S'editable' +p7076 +I00 +sS'value' +p7077 +I00 +ssS'properties' +p7078 +(dp7079 +S'default_value' +p7080 +(dp7081 +S'editable' +p7082 +I00 +sS'value' +p7083 +NssS'summary_default' +p7084 +(dp7085 +S'editable' +p7086 +I01 +sS'value' +p7087 +S'none' +p7088 +ssS'valid_types' +p7089 +(dp7090 +S'editable' +p7091 +I01 +sS'value' +p7092 +(lp7093 +S'HumanUser' +p7094 +aS'ApiUser' +p7095 +asssS'description' +p7096 +(dp7097 +S'editable' +p7098 +I01 +sS'value' +p7099 +g47 +sssS'notes' +p7100 +(dp7101 +S'mandatory' +p7102 +(dp7103 +S'editable' +p7104 +I00 +sS'value' +p7105 +I00 +ssS'name' +p7106 +(dp7107 +S'editable' +p7108 +I01 +sS'value' +p7109 +S'Notes' +p7110 +ssS'data_type' +p7111 +(dp7112 +S'editable' +p7113 +I00 +sS'value' +p7114 +S'multi_entity' +p7115 +ssS'entity_type' +p7116 +(dp7117 +S'editable' +p7118 +I00 +sS'value' +p7119 +S'Department' +p7120 +ssS'editable' +p7121 +(dp7122 +S'editable' +p7123 +I00 +sS'value' +p7124 +I01 +ssS'unique' +p7125 +(dp7126 +S'editable' +p7127 +I00 +sS'value' +p7128 +I00 +ssS'properties' +p7129 +(dp7130 +S'default_value' +p7131 +(dp7132 +S'editable' +p7133 +I00 +sS'value' +p7134 +NssS'summary_default' +p7135 +(dp7136 +S'editable' +p7137 +I01 +sS'value' +p7138 +S'none' +p7139 +ssS'valid_types' +p7140 +(dp7141 +S'editable' +p7142 +I01 +sS'value' +p7143 +(lp7144 +S'Note' +p7145 +asssS'description' +p7146 +(dp7147 +S'editable' +p7148 +I01 +sS'value' +p7149 +g47 +sssS'cached_display_name' +p7150 +(dp7151 +S'mandatory' +p7152 +(dp7153 +S'editable' +p7154 +I00 +sS'value' +p7155 +I00 +ssS'name' +p7156 +(dp7157 +S'editable' +p7158 +I01 +sS'value' +p7159 +S'Cached Display Name' +p7160 +ssS'data_type' +p7161 +(dp7162 +S'editable' +p7163 +I00 +sS'value' +p7164 +S'text' +p7165 +ssS'entity_type' +p7166 +(dp7167 +S'editable' +p7168 +I00 +sS'value' +p7169 +S'Department' +p7170 +ssS'editable' +p7171 +(dp7172 +S'editable' +p7173 +I00 +sS'value' +p7174 +I01 +ssS'unique' +p7175 +(dp7176 +S'editable' +p7177 +I00 +sS'value' +p7178 +I00 +ssS'properties' +p7179 +(dp7180 +S'default_value' +p7181 +(dp7182 +S'editable' +p7183 +I00 +sS'value' +p7184 +NssS'summary_default' +p7185 +(dp7186 +S'editable' +p7187 +I00 +sS'value' +p7188 +S'none' +p7189 +sssS'description' +p7190 +(dp7191 +S'editable' +p7192 +I01 +sS'value' +p7193 +g47 +sssS'tag_list' +p7194 +(dp7195 +S'mandatory' +p7196 +(dp7197 +S'editable' +p7198 +I00 +sS'value' +p7199 +I00 +ssS'name' +p7200 +(dp7201 +S'editable' +p7202 +I01 +sS'value' +p7203 +S'Tags' +p7204 +ssS'data_type' +p7205 +(dp7206 +S'editable' +p7207 +I00 +sS'value' +p7208 +S'tag_list' +p7209 +ssS'entity_type' +p7210 +(dp7211 +S'editable' +p7212 +I00 +sS'value' +p7213 +S'Department' +p7214 +ssS'editable' +p7215 +(dp7216 +S'editable' +p7217 +I00 +sS'value' +p7218 +I01 +ssS'unique' +p7219 +(dp7220 +S'editable' +p7221 +I00 +sS'value' +p7222 +I00 +ssS'properties' +p7223 +(dp7224 +S'default_value' +p7225 +(dp7226 +S'editable' +p7227 +I00 +sS'value' +p7228 +NssS'summary_default' +p7229 +(dp7230 +S'editable' +p7231 +I01 +sS'value' +p7232 +S'none' +p7233 +ssS'valid_types' +p7234 +(dp7235 +S'editable' +p7236 +I01 +sS'value' +p7237 +(lp7238 +S'Tag' +p7239 +asssS'description' +p7240 +(dp7241 +S'editable' +p7242 +I01 +sS'value' +p7243 +g47 +sssS'id' +p7244 +(dp7245 +S'mandatory' +p7246 +(dp7247 +S'editable' +p7248 +I00 +sS'value' +p7249 +I00 +ssS'name' +p7250 +(dp7251 +S'editable' +p7252 +I01 +sS'value' +p7253 +S'Id' +p7254 +ssS'data_type' +p7255 +(dp7256 +S'editable' +p7257 +I00 +sS'value' +p7258 +S'number' +p7259 +ssS'entity_type' +p7260 +(dp7261 +S'editable' +p7262 +I00 +sS'value' +p7263 +S'Department' +p7264 +ssS'editable' +p7265 +(dp7266 +S'editable' +p7267 +I00 +sS'value' +p7268 +I00 +ssS'unique' +p7269 +(dp7270 +S'editable' +p7271 +I00 +sS'value' +p7272 +I00 +ssS'properties' +p7273 +(dp7274 +S'default_value' +p7275 +(dp7276 +S'editable' +p7277 +I00 +sS'value' +p7278 +NssS'summary_default' +p7279 +(dp7280 +S'editable' +p7281 +I01 +sS'value' +p7282 +S'none' +p7283 +sssS'description' +p7284 +(dp7285 +S'editable' +p7286 +I01 +sS'value' +p7287 +g47 +sssS'name' +p7288 +(dp7289 +S'mandatory' +p7290 +(dp7291 +S'editable' +p7292 +I00 +sS'value' +p7293 +I01 +ssS'name' +p7294 +(dp7295 +S'editable' +p7296 +I01 +sS'value' +p7297 +S'Department Name' +p7298 +ssS'data_type' +p7299 +(dp7300 +S'editable' +p7301 +I00 +sS'value' +p7302 +S'text' +p7303 +ssS'entity_type' +p7304 +(dp7305 +S'editable' +p7306 +I00 +sS'value' +p7307 +S'Department' +p7308 +ssS'editable' +p7309 +(dp7310 +S'editable' +p7311 +I00 +sS'value' +p7312 +I01 +ssS'unique' +p7313 +(dp7314 +S'editable' +p7315 +I00 +sS'value' +p7316 +I00 +ssS'properties' +p7317 +(dp7318 +S'default_value' +p7319 +(dp7320 +S'editable' +p7321 +I00 +sS'value' +p7322 +NssS'summary_default' +p7323 +(dp7324 +S'editable' +p7325 +I01 +sS'value' +p7326 +S'none' +p7327 +sssS'description' +p7328 +(dp7329 +S'editable' +p7330 +I01 +sS'value' +p7331 +g47 +ssssS'AssetSceneConnection' +p7332 +(dp7333 +S'id' +p7334 +(dp7335 +S'mandatory' +p7336 +(dp7337 +S'editable' +p7338 +I00 +sS'value' +p7339 +I01 +ssS'name' +p7340 +(dp7341 +S'editable' +p7342 +I01 +sS'value' +p7343 +S'Id' +p7344 +ssS'data_type' +p7345 +(dp7346 +S'editable' +p7347 +I00 +sS'value' +p7348 +S'number' +p7349 +ssS'entity_type' +p7350 +(dp7351 +S'editable' +p7352 +I00 +sS'value' +p7353 +S'AssetSceneConnection' +p7354 +ssS'editable' +p7355 +(dp7356 +S'editable' +p7357 +I00 +sS'value' +p7358 +I00 +ssS'unique' +p7359 +(dp7360 +S'editable' +p7361 +I00 +sS'value' +p7362 +I00 +ssS'properties' +p7363 +(dp7364 +S'default_value' +p7365 +(dp7366 +S'editable' +p7367 +I00 +sS'value' +p7368 +NssS'summary_default' +p7369 +(dp7370 +S'editable' +p7371 +I00 +sS'value' +p7372 +S'none' +p7373 +sssS'description' +p7374 +(dp7375 +S'editable' +p7376 +I01 +sS'value' +p7377 +g47 +sssS'cached_display_name' +p7378 +(dp7379 +S'mandatory' +p7380 +(dp7381 +S'editable' +p7382 +I00 +sS'value' +p7383 +I00 +ssS'name' +p7384 +(dp7385 +S'editable' +p7386 +I01 +sS'value' +p7387 +S'Cached Display Name' +p7388 +ssS'data_type' +p7389 +(dp7390 +S'editable' +p7391 +I00 +sS'value' +p7392 +S'text' +p7393 +ssS'entity_type' +p7394 +(dp7395 +S'editable' +p7396 +I00 +sS'value' +p7397 +S'AssetSceneConnection' +p7398 +ssS'editable' +p7399 +(dp7400 +S'editable' +p7401 +I00 +sS'value' +p7402 +I01 +ssS'unique' +p7403 +(dp7404 +S'editable' +p7405 +I00 +sS'value' +p7406 +I00 +ssS'properties' +p7407 +(dp7408 +S'default_value' +p7409 +(dp7410 +S'editable' +p7411 +I00 +sS'value' +p7412 +NssS'summary_default' +p7413 +(dp7414 +S'editable' +p7415 +I00 +sS'value' +p7416 +S'none' +p7417 +sssS'description' +p7418 +(dp7419 +S'editable' +p7420 +I01 +sS'value' +p7421 +g47 +sssS'asset' +p7422 +(dp7423 +S'mandatory' +p7424 +(dp7425 +S'editable' +p7426 +I00 +sS'value' +p7427 +I00 +ssS'name' +p7428 +(dp7429 +S'editable' +p7430 +I01 +sS'value' +p7431 +S'Asset' +p7432 +ssS'data_type' +p7433 +(dp7434 +S'editable' +p7435 +I00 +sS'value' +p7436 +S'entity' +p7437 +ssS'entity_type' +p7438 +(dp7439 +S'editable' +p7440 +I00 +sS'value' +p7441 +S'AssetSceneConnection' +p7442 +ssS'editable' +p7443 +(dp7444 +S'editable' +p7445 +I00 +sS'value' +p7446 +I00 +ssS'unique' +p7447 +(dp7448 +S'editable' +p7449 +I00 +sS'value' +p7450 +I00 +ssS'properties' +p7451 +(dp7452 +S'default_value' +p7453 +(dp7454 +S'editable' +p7455 +I00 +sS'value' +p7456 +NssS'summary_default' +p7457 +(dp7458 +S'editable' +p7459 +I00 +sS'value' +p7460 +S'none' +p7461 +ssS'valid_types' +p7462 +(dp7463 +S'editable' +p7464 +I00 +sS'value' +p7465 +(lp7466 +S'Asset' +p7467 +asssS'description' +p7468 +(dp7469 +S'editable' +p7470 +I01 +sS'value' +p7471 +g47 +sssS'scene' +p7472 +(dp7473 +S'mandatory' +p7474 +(dp7475 +S'editable' +p7476 +I00 +sS'value' +p7477 +I00 +ssS'name' +p7478 +(dp7479 +S'editable' +p7480 +I01 +sS'value' +p7481 +S'Scene' +p7482 +ssS'data_type' +p7483 +(dp7484 +S'editable' +p7485 +I00 +sS'value' +p7486 +S'entity' +p7487 +ssS'entity_type' +p7488 +(dp7489 +S'editable' +p7490 +I00 +sS'value' +p7491 +S'AssetSceneConnection' +p7492 +ssS'editable' +p7493 +(dp7494 +S'editable' +p7495 +I00 +sS'value' +p7496 +I00 +ssS'unique' +p7497 +(dp7498 +S'editable' +p7499 +I00 +sS'value' +p7500 +I00 +ssS'properties' +p7501 +(dp7502 +S'default_value' +p7503 +(dp7504 +S'editable' +p7505 +I00 +sS'value' +p7506 +NssS'summary_default' +p7507 +(dp7508 +S'editable' +p7509 +I00 +sS'value' +p7510 +S'none' +p7511 +ssS'valid_types' +p7512 +(dp7513 +S'editable' +p7514 +I00 +sS'value' +p7515 +(lp7516 +S'Scene' +p7517 +asssS'description' +p7518 +(dp7519 +S'editable' +p7520 +I01 +sS'value' +p7521 +g47 +ssssS'CameraMocapTakeConnection' +p7522 +(dp7523 +S'mocap_take' +p7524 +(dp7525 +S'mandatory' +p7526 +(dp7527 +S'editable' +p7528 +I00 +sS'value' +p7529 +I00 +ssS'name' +p7530 +(dp7531 +S'editable' +p7532 +I01 +sS'value' +p7533 +S'Mocap Take' +p7534 +ssS'data_type' +p7535 +(dp7536 +S'editable' +p7537 +I00 +sS'value' +p7538 +S'entity' +p7539 +ssS'entity_type' +p7540 +(dp7541 +S'editable' +p7542 +I00 +sS'value' +p7543 +S'CameraMocapTakeConnection' +p7544 +ssS'editable' +p7545 +(dp7546 +S'editable' +p7547 +I00 +sS'value' +p7548 +I00 +ssS'unique' +p7549 +(dp7550 +S'editable' +p7551 +I00 +sS'value' +p7552 +I00 +ssS'properties' +p7553 +(dp7554 +S'default_value' +p7555 +(dp7556 +S'editable' +p7557 +I00 +sS'value' +p7558 +NssS'summary_default' +p7559 +(dp7560 +S'editable' +p7561 +I00 +sS'value' +p7562 +S'none' +p7563 +ssS'valid_types' +p7564 +(dp7565 +S'editable' +p7566 +I00 +sS'value' +p7567 +(lp7568 +S'MocapTake' +p7569 +asssS'description' +p7570 +(dp7571 +S'editable' +p7572 +I01 +sS'value' +p7573 +g47 +sssS'cached_display_name' +p7574 +(dp7575 +S'mandatory' +p7576 +(dp7577 +S'editable' +p7578 +I00 +sS'value' +p7579 +I00 +ssS'name' +p7580 +(dp7581 +S'editable' +p7582 +I01 +sS'value' +p7583 +S'Cached Display Name' +p7584 +ssS'data_type' +p7585 +(dp7586 +S'editable' +p7587 +I00 +sS'value' +p7588 +S'text' +p7589 +ssS'entity_type' +p7590 +(dp7591 +S'editable' +p7592 +I00 +sS'value' +p7593 +S'CameraMocapTakeConnection' +p7594 +ssS'editable' +p7595 +(dp7596 +S'editable' +p7597 +I00 +sS'value' +p7598 +I01 +ssS'unique' +p7599 +(dp7600 +S'editable' +p7601 +I00 +sS'value' +p7602 +I00 +ssS'properties' +p7603 +(dp7604 +S'default_value' +p7605 +(dp7606 +S'editable' +p7607 +I00 +sS'value' +p7608 +NssS'summary_default' +p7609 +(dp7610 +S'editable' +p7611 +I00 +sS'value' +p7612 +S'none' +p7613 +sssS'description' +p7614 +(dp7615 +S'editable' +p7616 +I01 +sS'value' +p7617 +g47 +sssS'camera' +p7618 +(dp7619 +S'mandatory' +p7620 +(dp7621 +S'editable' +p7622 +I00 +sS'value' +p7623 +I00 +ssS'name' +p7624 +(dp7625 +S'editable' +p7626 +I01 +sS'value' +p7627 +S'Camera' +p7628 +ssS'data_type' +p7629 +(dp7630 +S'editable' +p7631 +I00 +sS'value' +p7632 +S'entity' +p7633 +ssS'entity_type' +p7634 +(dp7635 +S'editable' +p7636 +I00 +sS'value' +p7637 +S'CameraMocapTakeConnection' +p7638 +ssS'editable' +p7639 +(dp7640 +S'editable' +p7641 +I00 +sS'value' +p7642 +I00 +ssS'unique' +p7643 +(dp7644 +S'editable' +p7645 +I00 +sS'value' +p7646 +I00 +ssS'properties' +p7647 +(dp7648 +S'default_value' +p7649 +(dp7650 +S'editable' +p7651 +I00 +sS'value' +p7652 +NssS'summary_default' +p7653 +(dp7654 +S'editable' +p7655 +I00 +sS'value' +p7656 +S'none' +p7657 +ssS'valid_types' +p7658 +(dp7659 +S'editable' +p7660 +I00 +sS'value' +p7661 +(lp7662 +S'Camera' +p7663 +asssS'description' +p7664 +(dp7665 +S'editable' +p7666 +I01 +sS'value' +p7667 +g47 +sssS'id' +p7668 +(dp7669 +S'mandatory' +p7670 +(dp7671 +S'editable' +p7672 +I00 +sS'value' +p7673 +I01 +ssS'name' +p7674 +(dp7675 +S'editable' +p7676 +I01 +sS'value' +p7677 +S'Id' +p7678 +ssS'data_type' +p7679 +(dp7680 +S'editable' +p7681 +I00 +sS'value' +p7682 +S'number' +p7683 +ssS'entity_type' +p7684 +(dp7685 +S'editable' +p7686 +I00 +sS'value' +p7687 +S'CameraMocapTakeConnection' +p7688 +ssS'editable' +p7689 +(dp7690 +S'editable' +p7691 +I00 +sS'value' +p7692 +I00 +ssS'unique' +p7693 +(dp7694 +S'editable' +p7695 +I00 +sS'value' +p7696 +I00 +ssS'properties' +p7697 +(dp7698 +S'default_value' +p7699 +(dp7700 +S'editable' +p7701 +I00 +sS'value' +p7702 +NssS'summary_default' +p7703 +(dp7704 +S'editable' +p7705 +I00 +sS'value' +p7706 +S'none' +p7707 +sssS'description' +p7708 +(dp7709 +S'editable' +p7710 +I01 +sS'value' +p7711 +g47 +ssssS'Booking' +p7712 +(dp7713 +S'project' +p7714 +(dp7715 +S'mandatory' +p7716 +(dp7717 +S'editable' +p7718 +I00 +sS'value' +p7719 +I00 +ssS'name' +p7720 +(dp7721 +S'editable' +p7722 +I01 +sS'value' +p7723 +S'Project' +p7724 +ssS'data_type' +p7725 +(dp7726 +S'editable' +p7727 +I00 +sS'value' +p7728 +S'entity' +p7729 +ssS'entity_type' +p7730 +(dp7731 +S'editable' +p7732 +I00 +sS'value' +p7733 +S'Booking' +p7734 +ssS'editable' +p7735 +(dp7736 +S'editable' +p7737 +I00 +sS'value' +p7738 +I01 +ssS'unique' +p7739 +(dp7740 +S'editable' +p7741 +I00 +sS'value' +p7742 +I00 +ssS'properties' +p7743 +(dp7744 +S'default_value' +p7745 +(dp7746 +S'editable' +p7747 +I00 +sS'value' +p7748 +NssS'summary_default' +p7749 +(dp7750 +S'editable' +p7751 +I01 +sS'value' +p7752 +S'none' +p7753 +ssS'valid_types' +p7754 +(dp7755 +S'editable' +p7756 +I01 +sS'value' +p7757 +(lp7758 +S'Project' +p7759 +asssS'description' +p7760 +(dp7761 +S'editable' +p7762 +I01 +sS'value' +p7763 +g47 +sssS'open_notes_count' +p7764 +(dp7765 +S'mandatory' +p7766 +(dp7767 +S'editable' +p7768 +I00 +sS'value' +p7769 +I00 +ssS'name' +p7770 +(dp7771 +S'editable' +p7772 +I01 +sS'value' +p7773 +S'Open Notes Count' +p7774 +ssS'data_type' +p7775 +(dp7776 +S'editable' +p7777 +I00 +sS'value' +p7778 +S'text' +p7779 +ssS'entity_type' +p7780 +(dp7781 +S'editable' +p7782 +I00 +sS'value' +p7783 +S'Booking' +p7784 +ssS'editable' +p7785 +(dp7786 +S'editable' +p7787 +I00 +sS'value' +p7788 +I00 +ssS'unique' +p7789 +(dp7790 +S'editable' +p7791 +I00 +sS'value' +p7792 +I00 +ssS'properties' +p7793 +(dp7794 +S'default_value' +p7795 +(dp7796 +S'editable' +p7797 +I00 +sS'value' +p7798 +NssS'summary_default' +p7799 +(dp7800 +S'editable' +p7801 +I01 +sS'value' +p7802 +S'none' +p7803 +sssS'description' +p7804 +(dp7805 +S'editable' +p7806 +I01 +sS'value' +p7807 +g47 +sssS'open_notes' +p7808 +(dp7809 +S'mandatory' +p7810 +(dp7811 +S'editable' +p7812 +I00 +sS'value' +p7813 +I00 +ssS'name' +p7814 +(dp7815 +S'editable' +p7816 +I01 +sS'value' +p7817 +S'Open Notes' +p7818 +ssS'data_type' +p7819 +(dp7820 +S'editable' +p7821 +I00 +sS'value' +p7822 +S'multi_entity' +p7823 +ssS'entity_type' +p7824 +(dp7825 +S'editable' +p7826 +I00 +sS'value' +p7827 +S'Booking' +p7828 +ssS'editable' +p7829 +(dp7830 +S'editable' +p7831 +I00 +sS'value' +p7832 +I00 +ssS'unique' +p7833 +(dp7834 +S'editable' +p7835 +I00 +sS'value' +p7836 +I00 +ssS'properties' +p7837 +(dp7838 +S'default_value' +p7839 +(dp7840 +S'editable' +p7841 +I00 +sS'value' +p7842 +NssS'summary_default' +p7843 +(dp7844 +S'editable' +p7845 +I01 +sS'value' +p7846 +S'none' +p7847 +ssS'valid_types' +p7848 +(dp7849 +S'editable' +p7850 +I01 +sS'value' +p7851 +(lp7852 +S'Note' +p7853 +asssS'description' +p7854 +(dp7855 +S'editable' +p7856 +I01 +sS'value' +p7857 +g47 +sssS'updated_by' +p7858 +(dp7859 +S'mandatory' +p7860 +(dp7861 +S'editable' +p7862 +I00 +sS'value' +p7863 +I00 +ssS'name' +p7864 +(dp7865 +S'editable' +p7866 +I01 +sS'value' +p7867 +S'Updated by' +p7868 +ssS'data_type' +p7869 +(dp7870 +S'editable' +p7871 +I00 +sS'value' +p7872 +S'entity' +p7873 +ssS'entity_type' +p7874 +(dp7875 +S'editable' +p7876 +I00 +sS'value' +p7877 +S'Booking' +p7878 +ssS'editable' +p7879 +(dp7880 +S'editable' +p7881 +I00 +sS'value' +p7882 +I00 +ssS'unique' +p7883 +(dp7884 +S'editable' +p7885 +I00 +sS'value' +p7886 +I00 +ssS'properties' +p7887 +(dp7888 +S'default_value' +p7889 +(dp7890 +S'editable' +p7891 +I00 +sS'value' +p7892 +NssS'summary_default' +p7893 +(dp7894 +S'editable' +p7895 +I01 +sS'value' +p7896 +S'none' +p7897 +ssS'valid_types' +p7898 +(dp7899 +S'editable' +p7900 +I01 +sS'value' +p7901 +(lp7902 +S'HumanUser' +p7903 +aS'ApiUser' +p7904 +asssS'description' +p7905 +(dp7906 +S'editable' +p7907 +I01 +sS'value' +p7908 +g47 +sssS'end_date' +p7909 +(dp7910 +S'mandatory' +p7911 +(dp7912 +S'editable' +p7913 +I00 +sS'value' +p7914 +I00 +ssS'name' +p7915 +(dp7916 +S'editable' +p7917 +I01 +sS'value' +p7918 +S'End Date' +p7919 +ssS'data_type' +p7920 +(dp7921 +S'editable' +p7922 +I00 +sS'value' +p7923 +S'date' +p7924 +ssS'entity_type' +p7925 +(dp7926 +S'editable' +p7927 +I00 +sS'value' +p7928 +S'Booking' +p7929 +ssS'editable' +p7930 +(dp7931 +S'editable' +p7932 +I00 +sS'value' +p7933 +I01 +ssS'unique' +p7934 +(dp7935 +S'editable' +p7936 +I00 +sS'value' +p7937 +I00 +ssS'properties' +p7938 +(dp7939 +S'default_value' +p7940 +(dp7941 +S'editable' +p7942 +I00 +sS'value' +p7943 +NssS'summary_default' +p7944 +(dp7945 +S'editable' +p7946 +I01 +sS'value' +p7947 +S'none' +p7948 +sssS'description' +p7949 +(dp7950 +S'editable' +p7951 +I01 +sS'value' +p7952 +g47 +sssS'created_at' +p7953 +(dp7954 +S'mandatory' +p7955 +(dp7956 +S'editable' +p7957 +I00 +sS'value' +p7958 +I00 +ssS'name' +p7959 +(dp7960 +S'editable' +p7961 +I01 +sS'value' +p7962 +S'Date Created' +p7963 +ssS'data_type' +p7964 +(dp7965 +S'editable' +p7966 +I00 +sS'value' +p7967 +S'date_time' +p7968 +ssS'entity_type' +p7969 +(dp7970 +S'editable' +p7971 +I00 +sS'value' +p7972 +S'Booking' +p7973 +ssS'editable' +p7974 +(dp7975 +S'editable' +p7976 +I00 +sS'value' +p7977 +I00 +ssS'unique' +p7978 +(dp7979 +S'editable' +p7980 +I00 +sS'value' +p7981 +I00 +ssS'properties' +p7982 +(dp7983 +S'default_value' +p7984 +(dp7985 +S'editable' +p7986 +I00 +sS'value' +p7987 +NssS'summary_default' +p7988 +(dp7989 +S'editable' +p7990 +I01 +sS'value' +p7991 +S'none' +p7992 +sssS'description' +p7993 +(dp7994 +S'editable' +p7995 +I01 +sS'value' +p7996 +g47 +sssS'notes' +p7997 +(dp7998 +S'mandatory' +p7999 +(dp8000 +S'editable' +p8001 +I00 +sS'value' +p8002 +I00 +ssS'name' +p8003 +(dp8004 +S'editable' +p8005 +I01 +sS'value' +p8006 +S'Notes' +p8007 +ssS'data_type' +p8008 +(dp8009 +S'editable' +p8010 +I00 +sS'value' +p8011 +S'multi_entity' +p8012 +ssS'entity_type' +p8013 +(dp8014 +S'editable' +p8015 +I00 +sS'value' +p8016 +S'Booking' +p8017 +ssS'editable' +p8018 +(dp8019 +S'editable' +p8020 +I00 +sS'value' +p8021 +I01 +ssS'unique' +p8022 +(dp8023 +S'editable' +p8024 +I00 +sS'value' +p8025 +I00 +ssS'properties' +p8026 +(dp8027 +S'default_value' +p8028 +(dp8029 +S'editable' +p8030 +I00 +sS'value' +p8031 +NssS'summary_default' +p8032 +(dp8033 +S'editable' +p8034 +I01 +sS'value' +p8035 +S'none' +p8036 +ssS'valid_types' +p8037 +(dp8038 +S'editable' +p8039 +I01 +sS'value' +p8040 +(lp8041 +S'Note' +p8042 +asssS'description' +p8043 +(dp8044 +S'editable' +p8045 +I01 +sS'value' +p8046 +g47 +sssS'vacation' +p8047 +(dp8048 +S'mandatory' +p8049 +(dp8050 +S'editable' +p8051 +I00 +sS'value' +p8052 +I00 +ssS'name' +p8053 +(dp8054 +S'editable' +p8055 +I01 +sS'value' +p8056 +S'Vacation' +p8057 +ssS'data_type' +p8058 +(dp8059 +S'editable' +p8060 +I00 +sS'value' +p8061 +S'checkbox' +p8062 +ssS'entity_type' +p8063 +(dp8064 +S'editable' +p8065 +I00 +sS'value' +p8066 +S'Booking' +p8067 +ssS'editable' +p8068 +(dp8069 +S'editable' +p8070 +I00 +sS'value' +p8071 +I01 +ssS'unique' +p8072 +(dp8073 +S'editable' +p8074 +I00 +sS'value' +p8075 +I00 +ssS'properties' +p8076 +(dp8077 +S'default_value' +p8078 +(dp8079 +S'editable' +p8080 +I00 +sS'value' +p8081 +NssS'summary_default' +p8082 +(dp8083 +S'editable' +p8084 +I01 +sS'value' +p8085 +S'none' +p8086 +sssS'description' +p8087 +(dp8088 +S'editable' +p8089 +I01 +sS'value' +p8090 +g47 +sssS'created_by' +p8091 +(dp8092 +S'mandatory' +p8093 +(dp8094 +S'editable' +p8095 +I00 +sS'value' +p8096 +I00 +ssS'name' +p8097 +(dp8098 +S'editable' +p8099 +I01 +sS'value' +p8100 +S'Created by' +p8101 +ssS'data_type' +p8102 +(dp8103 +S'editable' +p8104 +I00 +sS'value' +p8105 +S'entity' +p8106 +ssS'entity_type' +p8107 +(dp8108 +S'editable' +p8109 +I00 +sS'value' +p8110 +S'Booking' +p8111 +ssS'editable' +p8112 +(dp8113 +S'editable' +p8114 +I00 +sS'value' +p8115 +I00 +ssS'unique' +p8116 +(dp8117 +S'editable' +p8118 +I00 +sS'value' +p8119 +I00 +ssS'properties' +p8120 +(dp8121 +S'default_value' +p8122 +(dp8123 +S'editable' +p8124 +I00 +sS'value' +p8125 +NssS'summary_default' +p8126 +(dp8127 +S'editable' +p8128 +I01 +sS'value' +p8129 +S'none' +p8130 +ssS'valid_types' +p8131 +(dp8132 +S'editable' +p8133 +I01 +sS'value' +p8134 +(lp8135 +S'HumanUser' +p8136 +aS'ApiUser' +p8137 +asssS'description' +p8138 +(dp8139 +S'editable' +p8140 +I01 +sS'value' +p8141 +g47 +sssS'updated_at' +p8142 +(dp8143 +S'mandatory' +p8144 +(dp8145 +S'editable' +p8146 +I00 +sS'value' +p8147 +I00 +ssS'name' +p8148 +(dp8149 +S'editable' +p8150 +I01 +sS'value' +p8151 +S'Date Updated' +p8152 +ssS'data_type' +p8153 +(dp8154 +S'editable' +p8155 +I00 +sS'value' +p8156 +S'date_time' +p8157 +ssS'entity_type' +p8158 +(dp8159 +S'editable' +p8160 +I00 +sS'value' +p8161 +S'Booking' +p8162 +ssS'editable' +p8163 +(dp8164 +S'editable' +p8165 +I00 +sS'value' +p8166 +I00 +ssS'unique' +p8167 +(dp8168 +S'editable' +p8169 +I00 +sS'value' +p8170 +I00 +ssS'properties' +p8171 +(dp8172 +S'default_value' +p8173 +(dp8174 +S'editable' +p8175 +I00 +sS'value' +p8176 +NssS'summary_default' +p8177 +(dp8178 +S'editable' +p8179 +I01 +sS'value' +p8180 +S'none' +p8181 +sssS'description' +p8182 +(dp8183 +S'editable' +p8184 +I01 +sS'value' +p8185 +g47 +sssS'note' +p8186 +(dp8187 +S'mandatory' +p8188 +(dp8189 +S'editable' +p8190 +I00 +sS'value' +p8191 +I00 +ssS'name' +p8192 +(dp8193 +S'editable' +p8194 +I01 +sS'value' +p8195 +S'Note' +p8196 +ssS'data_type' +p8197 +(dp8198 +S'editable' +p8199 +I00 +sS'value' +p8200 +S'text' +p8201 +ssS'entity_type' +p8202 +(dp8203 +S'editable' +p8204 +I00 +sS'value' +p8205 +S'Booking' +p8206 +ssS'editable' +p8207 +(dp8208 +S'editable' +p8209 +I00 +sS'value' +p8210 +I01 +ssS'unique' +p8211 +(dp8212 +S'editable' +p8213 +I00 +sS'value' +p8214 +I00 +ssS'properties' +p8215 +(dp8216 +S'default_value' +p8217 +(dp8218 +S'editable' +p8219 +I00 +sS'value' +p8220 +NssS'summary_default' +p8221 +(dp8222 +S'editable' +p8223 +I01 +sS'value' +p8224 +S'none' +p8225 +sssS'description' +p8226 +(dp8227 +S'editable' +p8228 +I01 +sS'value' +p8229 +g47 +sssS'user' +p8230 +(dp8231 +S'mandatory' +p8232 +(dp8233 +S'editable' +p8234 +I00 +sS'value' +p8235 +I00 +ssS'name' +p8236 +(dp8237 +S'editable' +p8238 +I01 +sS'value' +p8239 +S'Assigned To' +p8240 +ssS'data_type' +p8241 +(dp8242 +S'editable' +p8243 +I00 +sS'value' +p8244 +S'entity' +p8245 +ssS'entity_type' +p8246 +(dp8247 +S'editable' +p8248 +I00 +sS'value' +p8249 +S'Booking' +p8250 +ssS'editable' +p8251 +(dp8252 +S'editable' +p8253 +I00 +sS'value' +p8254 +I01 +ssS'unique' +p8255 +(dp8256 +S'editable' +p8257 +I00 +sS'value' +p8258 +I00 +ssS'properties' +p8259 +(dp8260 +S'default_value' +p8261 +(dp8262 +S'editable' +p8263 +I00 +sS'value' +p8264 +NssS'summary_default' +p8265 +(dp8266 +S'editable' +p8267 +I01 +sS'value' +p8268 +S'none' +p8269 +ssS'valid_types' +p8270 +(dp8271 +S'editable' +p8272 +I01 +sS'value' +p8273 +(lp8274 +S'HumanUser' +p8275 +asssS'description' +p8276 +(dp8277 +S'editable' +p8278 +I01 +sS'value' +p8279 +g47 +sssS'id' +p8280 +(dp8281 +S'mandatory' +p8282 +(dp8283 +S'editable' +p8284 +I00 +sS'value' +p8285 +I01 +ssS'name' +p8286 +(dp8287 +S'editable' +p8288 +I01 +sS'value' +p8289 +S'Id' +p8290 +ssS'data_type' +p8291 +(dp8292 +S'editable' +p8293 +I00 +sS'value' +p8294 +S'number' +p8295 +ssS'entity_type' +p8296 +(dp8297 +S'editable' +p8298 +I00 +sS'value' +p8299 +S'Booking' +p8300 +ssS'editable' +p8301 +(dp8302 +S'editable' +p8303 +I00 +sS'value' +p8304 +I00 +ssS'unique' +p8305 +(dp8306 +S'editable' +p8307 +I00 +sS'value' +p8308 +I00 +ssS'properties' +p8309 +(dp8310 +S'default_value' +p8311 +(dp8312 +S'editable' +p8313 +I00 +sS'value' +p8314 +NssS'summary_default' +p8315 +(dp8316 +S'editable' +p8317 +I01 +sS'value' +p8318 +S'none' +p8319 +sssS'description' +p8320 +(dp8321 +S'editable' +p8322 +I01 +sS'value' +p8323 +g47 +sssS'cached_display_name' +p8324 +(dp8325 +S'mandatory' +p8326 +(dp8327 +S'editable' +p8328 +I00 +sS'value' +p8329 +I00 +ssS'name' +p8330 +(dp8331 +S'editable' +p8332 +I01 +sS'value' +p8333 +S'Cached Display Name' +p8334 +ssS'data_type' +p8335 +(dp8336 +S'editable' +p8337 +I00 +sS'value' +p8338 +S'text' +p8339 +ssS'entity_type' +p8340 +(dp8341 +S'editable' +p8342 +I00 +sS'value' +p8343 +S'Booking' +p8344 +ssS'editable' +p8345 +(dp8346 +S'editable' +p8347 +I00 +sS'value' +p8348 +I01 +ssS'unique' +p8349 +(dp8350 +S'editable' +p8351 +I00 +sS'value' +p8352 +I00 +ssS'properties' +p8353 +(dp8354 +S'default_value' +p8355 +(dp8356 +S'editable' +p8357 +I00 +sS'value' +p8358 +NssS'summary_default' +p8359 +(dp8360 +S'editable' +p8361 +I00 +sS'value' +p8362 +S'none' +p8363 +sssS'description' +p8364 +(dp8365 +S'editable' +p8366 +I01 +sS'value' +p8367 +g47 +sssS'start_date' +p8368 +(dp8369 +S'mandatory' +p8370 +(dp8371 +S'editable' +p8372 +I00 +sS'value' +p8373 +I00 +ssS'name' +p8374 +(dp8375 +S'editable' +p8376 +I01 +sS'value' +p8377 +S'Start Date' +p8378 +ssS'data_type' +p8379 +(dp8380 +S'editable' +p8381 +I00 +sS'value' +p8382 +S'date' +p8383 +ssS'entity_type' +p8384 +(dp8385 +S'editable' +p8386 +I00 +sS'value' +p8387 +S'Booking' +p8388 +ssS'editable' +p8389 +(dp8390 +S'editable' +p8391 +I00 +sS'value' +p8392 +I01 +ssS'unique' +p8393 +(dp8394 +S'editable' +p8395 +I00 +sS'value' +p8396 +I00 +ssS'properties' +p8397 +(dp8398 +S'default_value' +p8399 +(dp8400 +S'editable' +p8401 +I00 +sS'value' +p8402 +NssS'summary_default' +p8403 +(dp8404 +S'editable' +p8405 +I01 +sS'value' +p8406 +S'none' +p8407 +sssS'description' +p8408 +(dp8409 +S'editable' +p8410 +I01 +sS'value' +p8411 +g47 +ssssS'CutVersionConnection' +p8412 +(dp8413 +S'sg_cut_in' +p8414 +(dp8415 +S'mandatory' +p8416 +(dp8417 +S'editable' +p8418 +I00 +sS'value' +p8419 +I00 +ssS'name' +p8420 +(dp8421 +S'editable' +p8422 +I01 +sS'value' +p8423 +S'Cut In' +p8424 +ssS'data_type' +p8425 +(dp8426 +S'editable' +p8427 +I00 +sS'value' +p8428 +S'number' +p8429 +ssS'entity_type' +p8430 +(dp8431 +S'editable' +p8432 +I00 +sS'value' +p8433 +S'CutVersionConnection' +p8434 +ssS'editable' +p8435 +(dp8436 +S'editable' +p8437 +I00 +sS'value' +p8438 +I01 +ssS'unique' +p8439 +(dp8440 +S'editable' +p8441 +I00 +sS'value' +p8442 +I00 +ssS'properties' +p8443 +(dp8444 +S'default_value' +p8445 +(dp8446 +S'editable' +p8447 +I00 +sS'value' +p8448 +NssS'summary_default' +p8449 +(dp8450 +S'editable' +p8451 +I01 +sS'value' +p8452 +S'none' +p8453 +sssS'description' +p8454 +(dp8455 +S'editable' +p8456 +I01 +sS'value' +p8457 +g47 +sssS'cut' +p8458 +(dp8459 +S'mandatory' +p8460 +(dp8461 +S'editable' +p8462 +I00 +sS'value' +p8463 +I00 +ssS'name' +p8464 +(dp8465 +S'editable' +p8466 +I01 +sS'value' +p8467 +S'Cut' +p8468 +ssS'data_type' +p8469 +(dp8470 +S'editable' +p8471 +I00 +sS'value' +p8472 +S'entity' +p8473 +ssS'entity_type' +p8474 +(dp8475 +S'editable' +p8476 +I00 +sS'value' +p8477 +S'CutVersionConnection' +p8478 +ssS'editable' +p8479 +(dp8480 +S'editable' +p8481 +I00 +sS'value' +p8482 +I00 +ssS'unique' +p8483 +(dp8484 +S'editable' +p8485 +I00 +sS'value' +p8486 +I00 +ssS'properties' +p8487 +(dp8488 +S'default_value' +p8489 +(dp8490 +S'editable' +p8491 +I00 +sS'value' +p8492 +NssS'summary_default' +p8493 +(dp8494 +S'editable' +p8495 +I00 +sS'value' +p8496 +S'none' +p8497 +ssS'valid_types' +p8498 +(dp8499 +S'editable' +p8500 +I00 +sS'value' +p8501 +(lp8502 +S'Cut' +p8503 +asssS'description' +p8504 +(dp8505 +S'editable' +p8506 +I01 +sS'value' +p8507 +g47 +sssS'sg_cut_out' +p8508 +(dp8509 +S'mandatory' +p8510 +(dp8511 +S'editable' +p8512 +I00 +sS'value' +p8513 +I00 +ssS'name' +p8514 +(dp8515 +S'editable' +p8516 +I01 +sS'value' +p8517 +S'Cut Out' +p8518 +ssS'data_type' +p8519 +(dp8520 +S'editable' +p8521 +I00 +sS'value' +p8522 +S'number' +p8523 +ssS'entity_type' +p8524 +(dp8525 +S'editable' +p8526 +I00 +sS'value' +p8527 +S'CutVersionConnection' +p8528 +ssS'editable' +p8529 +(dp8530 +S'editable' +p8531 +I00 +sS'value' +p8532 +I01 +ssS'unique' +p8533 +(dp8534 +S'editable' +p8535 +I00 +sS'value' +p8536 +I00 +ssS'properties' +p8537 +(dp8538 +S'default_value' +p8539 +(dp8540 +S'editable' +p8541 +I00 +sS'value' +p8542 +NssS'summary_default' +p8543 +(dp8544 +S'editable' +p8545 +I01 +sS'value' +p8546 +S'none' +p8547 +sssS'description' +p8548 +(dp8549 +S'editable' +p8550 +I01 +sS'value' +p8551 +g47 +sssS'sg_cut_order' +p8552 +(dp8553 +S'mandatory' +p8554 +(dp8555 +S'editable' +p8556 +I00 +sS'value' +p8557 +I00 +ssS'name' +p8558 +(dp8559 +S'editable' +p8560 +I01 +sS'value' +p8561 +S'Cut Order' +p8562 +ssS'data_type' +p8563 +(dp8564 +S'editable' +p8565 +I00 +sS'value' +p8566 +S'number' +p8567 +ssS'entity_type' +p8568 +(dp8569 +S'editable' +p8570 +I00 +sS'value' +p8571 +S'CutVersionConnection' +p8572 +ssS'editable' +p8573 +(dp8574 +S'editable' +p8575 +I00 +sS'value' +p8576 +I01 +ssS'unique' +p8577 +(dp8578 +S'editable' +p8579 +I00 +sS'value' +p8580 +I00 +ssS'properties' +p8581 +(dp8582 +S'default_value' +p8583 +(dp8584 +S'editable' +p8585 +I00 +sS'value' +p8586 +NssS'summary_default' +p8587 +(dp8588 +S'editable' +p8589 +I01 +sS'value' +p8590 +S'none' +p8591 +sssS'description' +p8592 +(dp8593 +S'editable' +p8594 +I01 +sS'value' +p8595 +g47 +sssS'version' +p8596 +(dp8597 +S'mandatory' +p8598 +(dp8599 +S'editable' +p8600 +I00 +sS'value' +p8601 +I00 +ssS'name' +p8602 +(dp8603 +S'editable' +p8604 +I01 +sS'value' +p8605 +S'Version' +p8606 +ssS'data_type' +p8607 +(dp8608 +S'editable' +p8609 +I00 +sS'value' +p8610 +S'entity' +p8611 +ssS'entity_type' +p8612 +(dp8613 +S'editable' +p8614 +I00 +sS'value' +p8615 +S'CutVersionConnection' +p8616 +ssS'editable' +p8617 +(dp8618 +S'editable' +p8619 +I00 +sS'value' +p8620 +I00 +ssS'unique' +p8621 +(dp8622 +S'editable' +p8623 +I00 +sS'value' +p8624 +I00 +ssS'properties' +p8625 +(dp8626 +S'default_value' +p8627 +(dp8628 +S'editable' +p8629 +I00 +sS'value' +p8630 +NssS'summary_default' +p8631 +(dp8632 +S'editable' +p8633 +I00 +sS'value' +p8634 +S'none' +p8635 +ssS'valid_types' +p8636 +(dp8637 +S'editable' +p8638 +I00 +sS'value' +p8639 +(lp8640 +S'Version' +p8641 +asssS'description' +p8642 +(dp8643 +S'editable' +p8644 +I01 +sS'value' +p8645 +g47 +sssS'sg_cut_duration' +p8646 +(dp8647 +S'mandatory' +p8648 +(dp8649 +S'editable' +p8650 +I00 +sS'value' +p8651 +I00 +ssS'name' +p8652 +(dp8653 +S'editable' +p8654 +I01 +sS'value' +p8655 +S'Cut Duration' +p8656 +ssS'data_type' +p8657 +(dp8658 +S'editable' +p8659 +I00 +sS'value' +p8660 +S'number' +p8661 +ssS'entity_type' +p8662 +(dp8663 +S'editable' +p8664 +I00 +sS'value' +p8665 +S'CutVersionConnection' +p8666 +ssS'editable' +p8667 +(dp8668 +S'editable' +p8669 +I00 +sS'value' +p8670 +I01 +ssS'unique' +p8671 +(dp8672 +S'editable' +p8673 +I00 +sS'value' +p8674 +I00 +ssS'properties' +p8675 +(dp8676 +S'default_value' +p8677 +(dp8678 +S'editable' +p8679 +I00 +sS'value' +p8680 +NssS'summary_default' +p8681 +(dp8682 +S'editable' +p8683 +I01 +sS'value' +p8684 +S'none' +p8685 +sssS'description' +p8686 +(dp8687 +S'editable' +p8688 +I01 +sS'value' +p8689 +g47 +sssS'cached_display_name' +p8690 +(dp8691 +S'mandatory' +p8692 +(dp8693 +S'editable' +p8694 +I00 +sS'value' +p8695 +I00 +ssS'name' +p8696 +(dp8697 +S'editable' +p8698 +I01 +sS'value' +p8699 +S'Cached Display Name' +p8700 +ssS'data_type' +p8701 +(dp8702 +S'editable' +p8703 +I00 +sS'value' +p8704 +S'text' +p8705 +ssS'entity_type' +p8706 +(dp8707 +S'editable' +p8708 +I00 +sS'value' +p8709 +S'CutVersionConnection' +p8710 +ssS'editable' +p8711 +(dp8712 +S'editable' +p8713 +I00 +sS'value' +p8714 +I01 +ssS'unique' +p8715 +(dp8716 +S'editable' +p8717 +I00 +sS'value' +p8718 +I00 +ssS'properties' +p8719 +(dp8720 +S'default_value' +p8721 +(dp8722 +S'editable' +p8723 +I00 +sS'value' +p8724 +NssS'summary_default' +p8725 +(dp8726 +S'editable' +p8727 +I00 +sS'value' +p8728 +S'none' +p8729 +sssS'description' +p8730 +(dp8731 +S'editable' +p8732 +I01 +sS'value' +p8733 +g47 +sssS'id' +p8734 +(dp8735 +S'mandatory' +p8736 +(dp8737 +S'editable' +p8738 +I00 +sS'value' +p8739 +I01 +ssS'name' +p8740 +(dp8741 +S'editable' +p8742 +I01 +sS'value' +p8743 +S'Id' +p8744 +ssS'data_type' +p8745 +(dp8746 +S'editable' +p8747 +I00 +sS'value' +p8748 +S'number' +p8749 +ssS'entity_type' +p8750 +(dp8751 +S'editable' +p8752 +I00 +sS'value' +p8753 +S'CutVersionConnection' +p8754 +ssS'editable' +p8755 +(dp8756 +S'editable' +p8757 +I00 +sS'value' +p8758 +I00 +ssS'unique' +p8759 +(dp8760 +S'editable' +p8761 +I00 +sS'value' +p8762 +I00 +ssS'properties' +p8763 +(dp8764 +S'default_value' +p8765 +(dp8766 +S'editable' +p8767 +I00 +sS'value' +p8768 +NssS'summary_default' +p8769 +(dp8770 +S'editable' +p8771 +I00 +sS'value' +p8772 +S'none' +p8773 +sssS'description' +p8774 +(dp8775 +S'editable' +p8776 +I01 +sS'value' +p8777 +g47 +sssS'sg_cut_comments' +p8778 +(dp8779 +S'mandatory' +p8780 +(dp8781 +S'editable' +p8782 +I00 +sS'value' +p8783 +I00 +ssS'name' +p8784 +(dp8785 +S'editable' +p8786 +I01 +sS'value' +p8787 +S'Cut Comments' +p8788 +ssS'data_type' +p8789 +(dp8790 +S'editable' +p8791 +I00 +sS'value' +p8792 +S'text' +p8793 +ssS'entity_type' +p8794 +(dp8795 +S'editable' +p8796 +I00 +sS'value' +p8797 +S'CutVersionConnection' +p8798 +ssS'editable' +p8799 +(dp8800 +S'editable' +p8801 +I00 +sS'value' +p8802 +I01 +ssS'unique' +p8803 +(dp8804 +S'editable' +p8805 +I00 +sS'value' +p8806 +I00 +ssS'properties' +p8807 +(dp8808 +S'default_value' +p8809 +(dp8810 +S'editable' +p8811 +I00 +sS'value' +p8812 +NssS'summary_default' +p8813 +(dp8814 +S'editable' +p8815 +I01 +sS'value' +p8816 +S'none' +p8817 +sssS'description' +p8818 +(dp8819 +S'editable' +p8820 +I01 +sS'value' +p8821 +g47 +ssssS'TimeLog' +p8822 +(dp8823 +S'description' +p8824 +(dp8825 +S'mandatory' +p8826 +(dp8827 +S'editable' +p8828 +I00 +sS'value' +p8829 +I00 +ssS'name' +p8830 +(dp8831 +S'editable' +p8832 +I01 +sS'value' +p8833 +S'Description' +p8834 +ssS'data_type' +p8835 +(dp8836 +S'editable' +p8837 +I00 +sS'value' +p8838 +S'text' +p8839 +ssS'entity_type' +p8840 +(dp8841 +S'editable' +p8842 +I00 +sS'value' +p8843 +S'TimeLog' +p8844 +ssS'editable' +p8845 +(dp8846 +S'editable' +p8847 +I00 +sS'value' +p8848 +I01 +ssS'unique' +p8849 +(dp8850 +S'editable' +p8851 +I00 +sS'value' +p8852 +I00 +ssS'properties' +p8853 +(dp8854 +S'default_value' +p8855 +(dp8856 +S'editable' +p8857 +I00 +sS'value' +p8858 +NssS'summary_default' +p8859 +(dp8860 +S'editable' +p8861 +I01 +sS'value' +p8862 +S'none' +p8863 +sssS'description' +p8864 +(dp8865 +S'editable' +p8866 +I01 +sS'value' +p8867 +g47 +sssS'created_at' +p8868 +(dp8869 +S'mandatory' +p8870 +(dp8871 +S'editable' +p8872 +I00 +sS'value' +p8873 +I00 +ssS'name' +p8874 +(dp8875 +S'editable' +p8876 +I01 +sS'value' +p8877 +S'Date Created' +p8878 +ssS'data_type' +p8879 +(dp8880 +S'editable' +p8881 +I00 +sS'value' +p8882 +S'date_time' +p8883 +ssS'entity_type' +p8884 +(dp8885 +S'editable' +p8886 +I00 +sS'value' +p8887 +S'TimeLog' +p8888 +ssS'editable' +p8889 +(dp8890 +S'editable' +p8891 +I00 +sS'value' +p8892 +I00 +ssS'unique' +p8893 +(dp8894 +S'editable' +p8895 +I00 +sS'value' +p8896 +I00 +ssS'properties' +p8897 +(dp8898 +S'default_value' +p8899 +(dp8900 +S'editable' +p8901 +I00 +sS'value' +p8902 +NssS'summary_default' +p8903 +(dp8904 +S'editable' +p8905 +I01 +sS'value' +p8906 +S'none' +p8907 +sssS'description' +p8908 +(dp8909 +S'editable' +p8910 +I01 +sS'value' +p8911 +g47 +sssS'updated_at' +p8912 +(dp8913 +S'mandatory' +p8914 +(dp8915 +S'editable' +p8916 +I00 +sS'value' +p8917 +I00 +ssS'name' +p8918 +(dp8919 +S'editable' +p8920 +I01 +sS'value' +p8921 +S'Date Updated' +p8922 +ssS'data_type' +p8923 +(dp8924 +S'editable' +p8925 +I00 +sS'value' +p8926 +S'date_time' +p8927 +ssS'entity_type' +p8928 +(dp8929 +S'editable' +p8930 +I00 +sS'value' +p8931 +S'TimeLog' +p8932 +ssS'editable' +p8933 +(dp8934 +S'editable' +p8935 +I00 +sS'value' +p8936 +I00 +ssS'unique' +p8937 +(dp8938 +S'editable' +p8939 +I00 +sS'value' +p8940 +I00 +ssS'properties' +p8941 +(dp8942 +S'default_value' +p8943 +(dp8944 +S'editable' +p8945 +I00 +sS'value' +p8946 +NssS'summary_default' +p8947 +(dp8948 +S'editable' +p8949 +I01 +sS'value' +p8950 +S'none' +p8951 +sssS'description' +p8952 +(dp8953 +S'editable' +p8954 +I01 +sS'value' +p8955 +g47 +sssS'created_by' +p8956 +(dp8957 +S'mandatory' +p8958 +(dp8959 +S'editable' +p8960 +I00 +sS'value' +p8961 +I00 +ssS'name' +p8962 +(dp8963 +S'editable' +p8964 +I01 +sS'value' +p8965 +S'Created by' +p8966 +ssS'data_type' +p8967 +(dp8968 +S'editable' +p8969 +I00 +sS'value' +p8970 +S'entity' +p8971 +ssS'entity_type' +p8972 +(dp8973 +S'editable' +p8974 +I00 +sS'value' +p8975 +S'TimeLog' +p8976 +ssS'editable' +p8977 +(dp8978 +S'editable' +p8979 +I00 +sS'value' +p8980 +I00 +ssS'unique' +p8981 +(dp8982 +S'editable' +p8983 +I00 +sS'value' +p8984 +I00 +ssS'properties' +p8985 +(dp8986 +S'default_value' +p8987 +(dp8988 +S'editable' +p8989 +I00 +sS'value' +p8990 +NssS'summary_default' +p8991 +(dp8992 +S'editable' +p8993 +I01 +sS'value' +p8994 +S'none' +p8995 +ssS'valid_types' +p8996 +(dp8997 +S'editable' +p8998 +I01 +sS'value' +p8999 +(lp9000 +S'HumanUser' +p9001 +aS'ApiUser' +p9002 +asssS'description' +p9003 +(dp9004 +S'editable' +p9005 +I01 +sS'value' +p9006 +g47 +sssS'entity' +p9007 +(dp9008 +S'mandatory' +p9009 +(dp9010 +S'editable' +p9011 +I00 +sS'value' +p9012 +I00 +ssS'name' +p9013 +(dp9014 +S'editable' +p9015 +I01 +sS'value' +p9016 +S'Link' +p9017 +ssS'data_type' +p9018 +(dp9019 +S'editable' +p9020 +I00 +sS'value' +p9021 +S'entity' +p9022 +ssS'entity_type' +p9023 +(dp9024 +S'editable' +p9025 +I00 +sS'value' +p9026 +S'TimeLog' +p9027 +ssS'editable' +p9028 +(dp9029 +S'editable' +p9030 +I00 +sS'value' +p9031 +I01 +ssS'unique' +p9032 +(dp9033 +S'editable' +p9034 +I00 +sS'value' +p9035 +I00 +ssS'properties' +p9036 +(dp9037 +S'default_value' +p9038 +(dp9039 +S'editable' +p9040 +I00 +sS'value' +p9041 +NssS'summary_default' +p9042 +(dp9043 +S'editable' +p9044 +I01 +sS'value' +p9045 +S'none' +p9046 +ssS'valid_types' +p9047 +(dp9048 +S'editable' +p9049 +I01 +sS'value' +p9050 +(lp9051 +S'Task' +p9052 +aS'Ticket' +p9053 +asssS'description' +p9054 +(dp9055 +S'editable' +p9056 +I01 +sS'value' +p9057 +g47 +sssS'project' +p9058 +(dp9059 +S'mandatory' +p9060 +(dp9061 +S'editable' +p9062 +I00 +sS'value' +p9063 +I00 +ssS'name' +p9064 +(dp9065 +S'editable' +p9066 +I01 +sS'value' +p9067 +S'Project' +p9068 +ssS'data_type' +p9069 +(dp9070 +S'editable' +p9071 +I00 +sS'value' +p9072 +S'entity' +p9073 +ssS'entity_type' +p9074 +(dp9075 +S'editable' +p9076 +I00 +sS'value' +p9077 +S'TimeLog' +p9078 +ssS'editable' +p9079 +(dp9080 +S'editable' +p9081 +I00 +sS'value' +p9082 +I01 +ssS'unique' +p9083 +(dp9084 +S'editable' +p9085 +I00 +sS'value' +p9086 +I00 +ssS'properties' +p9087 +(dp9088 +S'default_value' +p9089 +(dp9090 +S'editable' +p9091 +I00 +sS'value' +p9092 +NssS'summary_default' +p9093 +(dp9094 +S'editable' +p9095 +I01 +sS'value' +p9096 +S'none' +p9097 +ssS'valid_types' +p9098 +(dp9099 +S'editable' +p9100 +I01 +sS'value' +p9101 +(lp9102 +S'Project' +p9103 +asssS'description' +p9104 +(dp9105 +S'editable' +p9106 +I01 +sS'value' +p9107 +g47 +sssS'duration' +p9108 +(dp9109 +S'mandatory' +p9110 +(dp9111 +S'editable' +p9112 +I00 +sS'value' +p9113 +I00 +ssS'name' +p9114 +(dp9115 +S'editable' +p9116 +I01 +sS'value' +p9117 +S'Duration' +p9118 +ssS'data_type' +p9119 +(dp9120 +S'editable' +p9121 +I00 +sS'value' +p9122 +S'duration' +p9123 +ssS'entity_type' +p9124 +(dp9125 +S'editable' +p9126 +I00 +sS'value' +p9127 +S'TimeLog' +p9128 +ssS'editable' +p9129 +(dp9130 +S'editable' +p9131 +I00 +sS'value' +p9132 +I01 +ssS'unique' +p9133 +(dp9134 +S'editable' +p9135 +I00 +sS'value' +p9136 +I00 +ssS'properties' +p9137 +(dp9138 +S'default_value' +p9139 +(dp9140 +S'editable' +p9141 +I00 +sS'value' +p9142 +I0 +ssS'summary_default' +p9143 +(dp9144 +S'editable' +p9145 +I01 +sS'value' +p9146 +S'sum' +p9147 +sssS'description' +p9148 +(dp9149 +S'editable' +p9150 +I01 +sS'value' +p9151 +g47 +sssS'user' +p9152 +(dp9153 +S'mandatory' +p9154 +(dp9155 +S'editable' +p9156 +I00 +sS'value' +p9157 +I00 +ssS'name' +p9158 +(dp9159 +S'editable' +p9160 +I01 +sS'value' +p9161 +S'Person' +p9162 +ssS'data_type' +p9163 +(dp9164 +S'editable' +p9165 +I00 +sS'value' +p9166 +S'entity' +p9167 +ssS'entity_type' +p9168 +(dp9169 +S'editable' +p9170 +I00 +sS'value' +p9171 +S'TimeLog' +p9172 +ssS'editable' +p9173 +(dp9174 +S'editable' +p9175 +I00 +sS'value' +p9176 +I01 +ssS'unique' +p9177 +(dp9178 +S'editable' +p9179 +I00 +sS'value' +p9180 +I00 +ssS'properties' +p9181 +(dp9182 +S'default_value' +p9183 +(dp9184 +S'editable' +p9185 +I00 +sS'value' +p9186 +NssS'summary_default' +p9187 +(dp9188 +S'editable' +p9189 +I01 +sS'value' +p9190 +S'none' +p9191 +ssS'valid_types' +p9192 +(dp9193 +S'editable' +p9194 +I01 +sS'value' +p9195 +(lp9196 +S'HumanUser' +p9197 +asssS'description' +p9198 +(dp9199 +S'editable' +p9200 +I01 +sS'value' +p9201 +g47 +sssS'date' +p9202 +(dp9203 +S'mandatory' +p9204 +(dp9205 +S'editable' +p9206 +I00 +sS'value' +p9207 +I00 +ssS'name' +p9208 +(dp9209 +S'editable' +p9210 +I01 +sS'value' +p9211 +S'Date' +p9212 +ssS'data_type' +p9213 +(dp9214 +S'editable' +p9215 +I00 +sS'value' +p9216 +S'date' +p9217 +ssS'entity_type' +p9218 +(dp9219 +S'editable' +p9220 +I00 +sS'value' +p9221 +S'TimeLog' +p9222 +ssS'editable' +p9223 +(dp9224 +S'editable' +p9225 +I00 +sS'value' +p9226 +I01 +ssS'unique' +p9227 +(dp9228 +S'editable' +p9229 +I00 +sS'value' +p9230 +I00 +ssS'properties' +p9231 +(dp9232 +S'default_value' +p9233 +(dp9234 +S'editable' +p9235 +I00 +sS'value' +p9236 +NssS'summary_default' +p9237 +(dp9238 +S'editable' +p9239 +I01 +sS'value' +p9240 +S'none' +p9241 +sssS'description' +p9242 +(dp9243 +S'editable' +p9244 +I01 +sS'value' +p9245 +g47 +sssS'cached_display_name' +p9246 +(dp9247 +S'mandatory' +p9248 +(dp9249 +S'editable' +p9250 +I00 +sS'value' +p9251 +I00 +ssS'name' +p9252 +(dp9253 +S'editable' +p9254 +I01 +sS'value' +p9255 +S'Cached Display Name' +p9256 +ssS'data_type' +p9257 +(dp9258 +S'editable' +p9259 +I00 +sS'value' +p9260 +S'text' +p9261 +ssS'entity_type' +p9262 +(dp9263 +S'editable' +p9264 +I00 +sS'value' +p9265 +S'TimeLog' +p9266 +ssS'editable' +p9267 +(dp9268 +S'editable' +p9269 +I00 +sS'value' +p9270 +I01 +ssS'unique' +p9271 +(dp9272 +S'editable' +p9273 +I00 +sS'value' +p9274 +I00 +ssS'properties' +p9275 +(dp9276 +S'default_value' +p9277 +(dp9278 +S'editable' +p9279 +I00 +sS'value' +p9280 +NssS'summary_default' +p9281 +(dp9282 +S'editable' +p9283 +I00 +sS'value' +p9284 +S'none' +p9285 +sssS'description' +p9286 +(dp9287 +S'editable' +p9288 +I01 +sS'value' +p9289 +g47 +sssS'id' +p9290 +(dp9291 +S'mandatory' +p9292 +(dp9293 +S'editable' +p9294 +I00 +sS'value' +p9295 +I01 +ssS'name' +p9296 +(dp9297 +S'editable' +p9298 +I01 +sS'value' +p9299 +S'Id' +p9300 +ssS'data_type' +p9301 +(dp9302 +S'editable' +p9303 +I00 +sS'value' +p9304 +S'number' +p9305 +ssS'entity_type' +p9306 +(dp9307 +S'editable' +p9308 +I00 +sS'value' +p9309 +S'TimeLog' +p9310 +ssS'editable' +p9311 +(dp9312 +S'editable' +p9313 +I00 +sS'value' +p9314 +I00 +ssS'unique' +p9315 +(dp9316 +S'editable' +p9317 +I00 +sS'value' +p9318 +I00 +ssS'properties' +p9319 +(dp9320 +S'default_value' +p9321 +(dp9322 +S'editable' +p9323 +I00 +sS'value' +p9324 +NssS'summary_default' +p9325 +(dp9326 +S'editable' +p9327 +I01 +sS'value' +p9328 +S'none' +p9329 +sssS'description' +p9330 +(dp9331 +S'editable' +p9332 +I01 +sS'value' +p9333 +g47 +sssS'updated_by' +p9334 +(dp9335 +S'mandatory' +p9336 +(dp9337 +S'editable' +p9338 +I00 +sS'value' +p9339 +I00 +ssS'name' +p9340 +(dp9341 +S'editable' +p9342 +I01 +sS'value' +p9343 +S'Updated by' +p9344 +ssS'data_type' +p9345 +(dp9346 +S'editable' +p9347 +I00 +sS'value' +p9348 +S'entity' +p9349 +ssS'entity_type' +p9350 +(dp9351 +S'editable' +p9352 +I00 +sS'value' +p9353 +S'TimeLog' +p9354 +ssS'editable' +p9355 +(dp9356 +S'editable' +p9357 +I00 +sS'value' +p9358 +I00 +ssS'unique' +p9359 +(dp9360 +S'editable' +p9361 +I00 +sS'value' +p9362 +I00 +ssS'properties' +p9363 +(dp9364 +S'default_value' +p9365 +(dp9366 +S'editable' +p9367 +I00 +sS'value' +p9368 +NssS'summary_default' +p9369 +(dp9370 +S'editable' +p9371 +I01 +sS'value' +p9372 +S'none' +p9373 +ssS'valid_types' +p9374 +(dp9375 +S'editable' +p9376 +I01 +sS'value' +p9377 +(lp9378 +S'HumanUser' +p9379 +aS'ApiUser' +p9380 +asssS'description' +p9381 +(dp9382 +S'editable' +p9383 +I01 +sS'value' +p9384 +g47 +ssssS'PlaylistVersionConnection' +p9385 +(dp9386 +S'cached_display_name' +p9387 +(dp9388 +S'mandatory' +p9389 +(dp9390 +S'editable' +p9391 +I00 +sS'value' +p9392 +I00 +ssS'name' +p9393 +(dp9394 +S'editable' +p9395 +I01 +sS'value' +p9396 +S'Cached Display Name' +p9397 +ssS'data_type' +p9398 +(dp9399 +S'editable' +p9400 +I00 +sS'value' +p9401 +S'text' +p9402 +ssS'entity_type' +p9403 +(dp9404 +S'editable' +p9405 +I00 +sS'value' +p9406 +S'PlaylistVersionConnection' +p9407 +ssS'editable' +p9408 +(dp9409 +S'editable' +p9410 +I00 +sS'value' +p9411 +I01 +ssS'unique' +p9412 +(dp9413 +S'editable' +p9414 +I00 +sS'value' +p9415 +I00 +ssS'properties' +p9416 +(dp9417 +S'default_value' +p9418 +(dp9419 +S'editable' +p9420 +I00 +sS'value' +p9421 +NssS'summary_default' +p9422 +(dp9423 +S'editable' +p9424 +I00 +sS'value' +p9425 +S'none' +p9426 +sssS'description' +p9427 +(dp9428 +S'editable' +p9429 +I01 +sS'value' +p9430 +g47 +sssS'version' +p9431 +(dp9432 +S'mandatory' +p9433 +(dp9434 +S'editable' +p9435 +I00 +sS'value' +p9436 +I00 +ssS'name' +p9437 +(dp9438 +S'editable' +p9439 +I01 +sS'value' +p9440 +S'Version' +p9441 +ssS'data_type' +p9442 +(dp9443 +S'editable' +p9444 +I00 +sS'value' +p9445 +S'entity' +p9446 +ssS'entity_type' +p9447 +(dp9448 +S'editable' +p9449 +I00 +sS'value' +p9450 +S'PlaylistVersionConnection' +p9451 +ssS'editable' +p9452 +(dp9453 +S'editable' +p9454 +I00 +sS'value' +p9455 +I00 +ssS'unique' +p9456 +(dp9457 +S'editable' +p9458 +I00 +sS'value' +p9459 +I00 +ssS'properties' +p9460 +(dp9461 +S'default_value' +p9462 +(dp9463 +S'editable' +p9464 +I00 +sS'value' +p9465 +NssS'summary_default' +p9466 +(dp9467 +S'editable' +p9468 +I00 +sS'value' +p9469 +S'none' +p9470 +ssS'valid_types' +p9471 +(dp9472 +S'editable' +p9473 +I00 +sS'value' +p9474 +(lp9475 +S'Version' +p9476 +asssS'description' +p9477 +(dp9478 +S'editable' +p9479 +I01 +sS'value' +p9480 +g47 +sssS'sg_sort_order' +p9481 +(dp9482 +S'mandatory' +p9483 +(dp9484 +S'editable' +p9485 +I00 +sS'value' +p9486 +I00 +ssS'name' +p9487 +(dp9488 +S'editable' +p9489 +I01 +sS'value' +p9490 +S'Sort Order' +p9491 +ssS'data_type' +p9492 +(dp9493 +S'editable' +p9494 +I00 +sS'value' +p9495 +S'number' +p9496 +ssS'entity_type' +p9497 +(dp9498 +S'editable' +p9499 +I00 +sS'value' +p9500 +S'PlaylistVersionConnection' +p9501 +ssS'editable' +p9502 +(dp9503 +S'editable' +p9504 +I00 +sS'value' +p9505 +I01 +ssS'unique' +p9506 +(dp9507 +S'editable' +p9508 +I00 +sS'value' +p9509 +I00 +ssS'properties' +p9510 +(dp9511 +S'default_value' +p9512 +(dp9513 +S'editable' +p9514 +I00 +sS'value' +p9515 +NssS'summary_default' +p9516 +(dp9517 +S'editable' +p9518 +I01 +sS'value' +p9519 +S'none' +p9520 +sssS'description' +p9521 +(dp9522 +S'editable' +p9523 +I01 +sS'value' +p9524 +g47 +sssS'playlist' +p9525 +(dp9526 +S'mandatory' +p9527 +(dp9528 +S'editable' +p9529 +I00 +sS'value' +p9530 +I00 +ssS'name' +p9531 +(dp9532 +S'editable' +p9533 +I01 +sS'value' +p9534 +S'Playlist' +p9535 +ssS'data_type' +p9536 +(dp9537 +S'editable' +p9538 +I00 +sS'value' +p9539 +S'entity' +p9540 +ssS'entity_type' +p9541 +(dp9542 +S'editable' +p9543 +I00 +sS'value' +p9544 +S'PlaylistVersionConnection' +p9545 +ssS'editable' +p9546 +(dp9547 +S'editable' +p9548 +I00 +sS'value' +p9549 +I00 +ssS'unique' +p9550 +(dp9551 +S'editable' +p9552 +I00 +sS'value' +p9553 +I00 +ssS'properties' +p9554 +(dp9555 +S'default_value' +p9556 +(dp9557 +S'editable' +p9558 +I00 +sS'value' +p9559 +NssS'summary_default' +p9560 +(dp9561 +S'editable' +p9562 +I00 +sS'value' +p9563 +S'none' +p9564 +ssS'valid_types' +p9565 +(dp9566 +S'editable' +p9567 +I00 +sS'value' +p9568 +(lp9569 +S'Playlist' +p9570 +asssS'description' +p9571 +(dp9572 +S'editable' +p9573 +I01 +sS'value' +p9574 +g47 +sssS'id' +p9575 +(dp9576 +S'mandatory' +p9577 +(dp9578 +S'editable' +p9579 +I00 +sS'value' +p9580 +I01 +ssS'name' +p9581 +(dp9582 +S'editable' +p9583 +I01 +sS'value' +p9584 +S'Id' +p9585 +ssS'data_type' +p9586 +(dp9587 +S'editable' +p9588 +I00 +sS'value' +p9589 +S'number' +p9590 +ssS'entity_type' +p9591 +(dp9592 +S'editable' +p9593 +I00 +sS'value' +p9594 +S'PlaylistVersionConnection' +p9595 +ssS'editable' +p9596 +(dp9597 +S'editable' +p9598 +I00 +sS'value' +p9599 +I00 +ssS'unique' +p9600 +(dp9601 +S'editable' +p9602 +I00 +sS'value' +p9603 +I00 +ssS'properties' +p9604 +(dp9605 +S'default_value' +p9606 +(dp9607 +S'editable' +p9608 +I00 +sS'value' +p9609 +NssS'summary_default' +p9610 +(dp9611 +S'editable' +p9612 +I00 +sS'value' +p9613 +S'none' +p9614 +sssS'description' +p9615 +(dp9616 +S'editable' +p9617 +I01 +sS'value' +p9618 +g47 +ssssS'CustomNonProjectEntity02' +p9619 +(dp9620 +S'open_notes_count' +p9621 +(dp9622 +S'mandatory' +p9623 +(dp9624 +S'editable' +p9625 +I00 +sS'value' +p9626 +I00 +ssS'name' +p9627 +(dp9628 +S'editable' +p9629 +I01 +sS'value' +p9630 +S'Open Notes Count' +p9631 +ssS'data_type' +p9632 +(dp9633 +S'editable' +p9634 +I00 +sS'value' +p9635 +S'text' +p9636 +ssS'entity_type' +p9637 +(dp9638 +S'editable' +p9639 +I00 +sS'value' +p9640 +S'CustomNonProjectEntity02' +p9641 +ssS'editable' +p9642 +(dp9643 +S'editable' +p9644 +I00 +sS'value' +p9645 +I00 +ssS'unique' +p9646 +(dp9647 +S'editable' +p9648 +I00 +sS'value' +p9649 +I00 +ssS'properties' +p9650 +(dp9651 +S'default_value' +p9652 +(dp9653 +S'editable' +p9654 +I00 +sS'value' +p9655 +NssS'summary_default' +p9656 +(dp9657 +S'editable' +p9658 +I01 +sS'value' +p9659 +S'none' +p9660 +sssS'description' +p9661 +(dp9662 +S'editable' +p9663 +I01 +sS'value' +p9664 +g47 +sssS'code' +p9665 +(dp9666 +S'mandatory' +p9667 +(dp9668 +S'editable' +p9669 +I00 +sS'value' +p9670 +I01 +ssS'name' +p9671 +(dp9672 +S'editable' +p9673 +I01 +sS'value' +p9674 +S'Custom Non Project Entity02 Name' +p9675 +ssS'data_type' +p9676 +(dp9677 +S'editable' +p9678 +I00 +sS'value' +p9679 +S'text' +p9680 +ssS'entity_type' +p9681 +(dp9682 +S'editable' +p9683 +I00 +sS'value' +p9684 +S'CustomNonProjectEntity02' +p9685 +ssS'editable' +p9686 +(dp9687 +S'editable' +p9688 +I00 +sS'value' +p9689 +I01 +ssS'unique' +p9690 +(dp9691 +S'editable' +p9692 +I00 +sS'value' +p9693 +I00 +ssS'properties' +p9694 +(dp9695 +S'default_value' +p9696 +(dp9697 +S'editable' +p9698 +I00 +sS'value' +p9699 +NssS'summary_default' +p9700 +(dp9701 +S'editable' +p9702 +I01 +sS'value' +p9703 +S'none' +p9704 +sssS'description' +p9705 +(dp9706 +S'editable' +p9707 +I01 +sS'value' +p9708 +g47 +sssS'open_notes' +p9709 +(dp9710 +S'mandatory' +p9711 +(dp9712 +S'editable' +p9713 +I00 +sS'value' +p9714 +I00 +ssS'name' +p9715 +(dp9716 +S'editable' +p9717 +I01 +sS'value' +p9718 +S'Open Notes' +p9719 +ssS'data_type' +p9720 +(dp9721 +S'editable' +p9722 +I00 +sS'value' +p9723 +S'multi_entity' +p9724 +ssS'entity_type' +p9725 +(dp9726 +S'editable' +p9727 +I00 +sS'value' +p9728 +S'CustomNonProjectEntity02' +p9729 +ssS'editable' +p9730 +(dp9731 +S'editable' +p9732 +I00 +sS'value' +p9733 +I00 +ssS'unique' +p9734 +(dp9735 +S'editable' +p9736 +I00 +sS'value' +p9737 +I00 +ssS'properties' +p9738 +(dp9739 +S'default_value' +p9740 +(dp9741 +S'editable' +p9742 +I00 +sS'value' +p9743 +NssS'summary_default' +p9744 +(dp9745 +S'editable' +p9746 +I01 +sS'value' +p9747 +S'none' +p9748 +ssS'valid_types' +p9749 +(dp9750 +S'editable' +p9751 +I01 +sS'value' +p9752 +(lp9753 +S'Note' +p9754 +asssS'description' +p9755 +(dp9756 +S'editable' +p9757 +I01 +sS'value' +p9758 +g47 +sssS'description' +p9759 +(dp9760 +S'mandatory' +p9761 +(dp9762 +S'editable' +p9763 +I00 +sS'value' +p9764 +I00 +ssS'name' +p9765 +(dp9766 +S'editable' +p9767 +I01 +sS'value' +p9768 +S'Description' +p9769 +ssS'data_type' +p9770 +(dp9771 +S'editable' +p9772 +I00 +sS'value' +p9773 +S'text' +p9774 +ssS'entity_type' +p9775 +(dp9776 +S'editable' +p9777 +I00 +sS'value' +p9778 +S'CustomNonProjectEntity02' +p9779 +ssS'editable' +p9780 +(dp9781 +S'editable' +p9782 +I00 +sS'value' +p9783 +I01 +ssS'unique' +p9784 +(dp9785 +S'editable' +p9786 +I00 +sS'value' +p9787 +I00 +ssS'properties' +p9788 +(dp9789 +S'default_value' +p9790 +(dp9791 +S'editable' +p9792 +I00 +sS'value' +p9793 +NssS'summary_default' +p9794 +(dp9795 +S'editable' +p9796 +I01 +sS'value' +p9797 +S'none' +p9798 +sssS'description' +p9799 +(dp9800 +S'editable' +p9801 +I01 +sS'value' +p9802 +g47 +sssS'created_at' +p9803 +(dp9804 +S'mandatory' +p9805 +(dp9806 +S'editable' +p9807 +I00 +sS'value' +p9808 +I00 +ssS'name' +p9809 +(dp9810 +S'editable' +p9811 +I01 +sS'value' +p9812 +S'Date Created' +p9813 +ssS'data_type' +p9814 +(dp9815 +S'editable' +p9816 +I00 +sS'value' +p9817 +S'date_time' +p9818 +ssS'entity_type' +p9819 +(dp9820 +S'editable' +p9821 +I00 +sS'value' +p9822 +S'CustomNonProjectEntity02' +p9823 +ssS'editable' +p9824 +(dp9825 +S'editable' +p9826 +I00 +sS'value' +p9827 +I00 +ssS'unique' +p9828 +(dp9829 +S'editable' +p9830 +I00 +sS'value' +p9831 +I00 +ssS'properties' +p9832 +(dp9833 +S'default_value' +p9834 +(dp9835 +S'editable' +p9836 +I00 +sS'value' +p9837 +NssS'summary_default' +p9838 +(dp9839 +S'editable' +p9840 +I01 +sS'value' +p9841 +S'none' +p9842 +sssS'description' +p9843 +(dp9844 +S'editable' +p9845 +I01 +sS'value' +p9846 +g47 +sssS'updated_at' +p9847 +(dp9848 +S'mandatory' +p9849 +(dp9850 +S'editable' +p9851 +I00 +sS'value' +p9852 +I00 +ssS'name' +p9853 +(dp9854 +S'editable' +p9855 +I01 +sS'value' +p9856 +S'Date Updated' +p9857 +ssS'data_type' +p9858 +(dp9859 +S'editable' +p9860 +I00 +sS'value' +p9861 +S'date_time' +p9862 +ssS'entity_type' +p9863 +(dp9864 +S'editable' +p9865 +I00 +sS'value' +p9866 +S'CustomNonProjectEntity02' +p9867 +ssS'editable' +p9868 +(dp9869 +S'editable' +p9870 +I00 +sS'value' +p9871 +I00 +ssS'unique' +p9872 +(dp9873 +S'editable' +p9874 +I00 +sS'value' +p9875 +I00 +ssS'properties' +p9876 +(dp9877 +S'default_value' +p9878 +(dp9879 +S'editable' +p9880 +I00 +sS'value' +p9881 +NssS'summary_default' +p9882 +(dp9883 +S'editable' +p9884 +I01 +sS'value' +p9885 +S'none' +p9886 +sssS'description' +p9887 +(dp9888 +S'editable' +p9889 +I01 +sS'value' +p9890 +g47 +sssS'created_by' +p9891 +(dp9892 +S'mandatory' +p9893 +(dp9894 +S'editable' +p9895 +I00 +sS'value' +p9896 +I00 +ssS'name' +p9897 +(dp9898 +S'editable' +p9899 +I01 +sS'value' +p9900 +S'Created by' +p9901 +ssS'data_type' +p9902 +(dp9903 +S'editable' +p9904 +I00 +sS'value' +p9905 +S'entity' +p9906 +ssS'entity_type' +p9907 +(dp9908 +S'editable' +p9909 +I00 +sS'value' +p9910 +S'CustomNonProjectEntity02' +p9911 +ssS'editable' +p9912 +(dp9913 +S'editable' +p9914 +I00 +sS'value' +p9915 +I00 +ssS'unique' +p9916 +(dp9917 +S'editable' +p9918 +I00 +sS'value' +p9919 +I00 +ssS'properties' +p9920 +(dp9921 +S'default_value' +p9922 +(dp9923 +S'editable' +p9924 +I00 +sS'value' +p9925 +NssS'summary_default' +p9926 +(dp9927 +S'editable' +p9928 +I01 +sS'value' +p9929 +S'none' +p9930 +ssS'valid_types' +p9931 +(dp9932 +S'editable' +p9933 +I01 +sS'value' +p9934 +(lp9935 +S'HumanUser' +p9936 +aS'ApiUser' +p9937 +asssS'description' +p9938 +(dp9939 +S'editable' +p9940 +I01 +sS'value' +p9941 +g47 +sssS'filmstrip_image' +p9942 +(dp9943 +S'mandatory' +p9944 +(dp9945 +S'editable' +p9946 +I00 +sS'value' +p9947 +I00 +ssS'name' +p9948 +(dp9949 +S'editable' +p9950 +I01 +sS'value' +p9951 +S'Filmstrip Thumbnail' +p9952 +ssS'data_type' +p9953 +(dp9954 +S'editable' +p9955 +I00 +sS'value' +p9956 +S'image' +p9957 +ssS'entity_type' +p9958 +(dp9959 +S'editable' +p9960 +I00 +sS'value' +p9961 +S'CustomNonProjectEntity02' +p9962 +ssS'editable' +p9963 +(dp9964 +S'editable' +p9965 +I00 +sS'value' +p9966 +I01 +ssS'unique' +p9967 +(dp9968 +S'editable' +p9969 +I00 +sS'value' +p9970 +I00 +ssS'properties' +p9971 +(dp9972 +S'default_value' +p9973 +(dp9974 +S'editable' +p9975 +I00 +sS'value' +p9976 +NssS'summary_default' +p9977 +(dp9978 +S'editable' +p9979 +I01 +sS'value' +p9980 +S'none' +p9981 +sssS'description' +p9982 +(dp9983 +S'editable' +p9984 +I01 +sS'value' +p9985 +g47 +sssS'sg_status_list' +p9986 +(dp9987 +S'mandatory' +p9988 +(dp9989 +S'editable' +p9990 +I00 +sS'value' +p9991 +I00 +ssS'name' +p9992 +(dp9993 +S'editable' +p9994 +I01 +sS'value' +p9995 +S'Status' +p9996 +ssS'data_type' +p9997 +(dp9998 +S'editable' +p9999 +I00 +sS'value' +p10000 +S'status_list' +p10001 +ssS'entity_type' +p10002 +(dp10003 +S'editable' +p10004 +I00 +sS'value' +p10005 +S'CustomNonProjectEntity02' +p10006 +ssS'editable' +p10007 +(dp10008 +S'editable' +p10009 +I00 +sS'value' +p10010 +I01 +ssS'unique' +p10011 +(dp10012 +S'editable' +p10013 +I00 +sS'value' +p10014 +I00 +ssS'properties' +p10015 +(dp10016 +S'default_value' +p10017 +(dp10018 +S'editable' +p10019 +I01 +sS'value' +p10020 +S'wtg' +p10021 +ssS'valid_values' +p10022 +(dp10023 +S'editable' +p10024 +I01 +sS'value' +p10025 +(lp10026 +S'cmpt' +p10027 +aS'ip' +p10028 +aS'wtg' +p10029 +assS'summary_default' +p10030 +(dp10031 +S'editable' +p10032 +I01 +sS'value' +p10033 +S'none' +p10034 +sssS'description' +p10035 +(dp10036 +S'editable' +p10037 +I01 +sS'value' +p10038 +g47 +sssS'notes' +p10039 +(dp10040 +S'mandatory' +p10041 +(dp10042 +S'editable' +p10043 +I00 +sS'value' +p10044 +I00 +ssS'name' +p10045 +(dp10046 +S'editable' +p10047 +I01 +sS'value' +p10048 +S'Notes' +p10049 +ssS'data_type' +p10050 +(dp10051 +S'editable' +p10052 +I00 +sS'value' +p10053 +S'multi_entity' +p10054 +ssS'entity_type' +p10055 +(dp10056 +S'editable' +p10057 +I00 +sS'value' +p10058 +S'CustomNonProjectEntity02' +p10059 +ssS'editable' +p10060 +(dp10061 +S'editable' +p10062 +I00 +sS'value' +p10063 +I01 +ssS'unique' +p10064 +(dp10065 +S'editable' +p10066 +I00 +sS'value' +p10067 +I00 +ssS'properties' +p10068 +(dp10069 +S'default_value' +p10070 +(dp10071 +S'editable' +p10072 +I00 +sS'value' +p10073 +NssS'summary_default' +p10074 +(dp10075 +S'editable' +p10076 +I01 +sS'value' +p10077 +S'none' +p10078 +ssS'valid_types' +p10079 +(dp10080 +S'editable' +p10081 +I01 +sS'value' +p10082 +(lp10083 +S'Note' +p10084 +asssS'description' +p10085 +(dp10086 +S'editable' +p10087 +I01 +sS'value' +p10088 +g47 +sssS'image' +p10089 +(dp10090 +S'mandatory' +p10091 +(dp10092 +S'editable' +p10093 +I00 +sS'value' +p10094 +I00 +ssS'name' +p10095 +(dp10096 +S'editable' +p10097 +I01 +sS'value' +p10098 +S'Thumbnail' +p10099 +ssS'data_type' +p10100 +(dp10101 +S'editable' +p10102 +I00 +sS'value' +p10103 +S'image' +p10104 +ssS'entity_type' +p10105 +(dp10106 +S'editable' +p10107 +I00 +sS'value' +p10108 +S'CustomNonProjectEntity02' +p10109 +ssS'editable' +p10110 +(dp10111 +S'editable' +p10112 +I00 +sS'value' +p10113 +I01 +ssS'unique' +p10114 +(dp10115 +S'editable' +p10116 +I00 +sS'value' +p10117 +I00 +ssS'properties' +p10118 +(dp10119 +S'default_value' +p10120 +(dp10121 +S'editable' +p10122 +I00 +sS'value' +p10123 +NssS'summary_default' +p10124 +(dp10125 +S'editable' +p10126 +I01 +sS'value' +p10127 +S'none' +p10128 +sssS'description' +p10129 +(dp10130 +S'editable' +p10131 +I01 +sS'value' +p10132 +g47 +sssS'cached_display_name' +p10133 +(dp10134 +S'mandatory' +p10135 +(dp10136 +S'editable' +p10137 +I00 +sS'value' +p10138 +I00 +ssS'name' +p10139 +(dp10140 +S'editable' +p10141 +I01 +sS'value' +p10142 +S'Cached Display Name' +p10143 +ssS'data_type' +p10144 +(dp10145 +S'editable' +p10146 +I00 +sS'value' +p10147 +S'text' +p10148 +ssS'entity_type' +p10149 +(dp10150 +S'editable' +p10151 +I00 +sS'value' +p10152 +S'CustomNonProjectEntity02' +p10153 +ssS'editable' +p10154 +(dp10155 +S'editable' +p10156 +I00 +sS'value' +p10157 +I01 +ssS'unique' +p10158 +(dp10159 +S'editable' +p10160 +I00 +sS'value' +p10161 +I00 +ssS'properties' +p10162 +(dp10163 +S'default_value' +p10164 +(dp10165 +S'editable' +p10166 +I00 +sS'value' +p10167 +NssS'summary_default' +p10168 +(dp10169 +S'editable' +p10170 +I00 +sS'value' +p10171 +S'none' +p10172 +sssS'description' +p10173 +(dp10174 +S'editable' +p10175 +I01 +sS'value' +p10176 +g47 +sssS'tag_list' +p10177 +(dp10178 +S'mandatory' +p10179 +(dp10180 +S'editable' +p10181 +I00 +sS'value' +p10182 +I00 +ssS'name' +p10183 +(dp10184 +S'editable' +p10185 +I01 +sS'value' +p10186 +S'Tags' +p10187 +ssS'data_type' +p10188 +(dp10189 +S'editable' +p10190 +I00 +sS'value' +p10191 +S'tag_list' +p10192 +ssS'entity_type' +p10193 +(dp10194 +S'editable' +p10195 +I00 +sS'value' +p10196 +S'CustomNonProjectEntity02' +p10197 +ssS'editable' +p10198 +(dp10199 +S'editable' +p10200 +I00 +sS'value' +p10201 +I01 +ssS'unique' +p10202 +(dp10203 +S'editable' +p10204 +I00 +sS'value' +p10205 +I00 +ssS'properties' +p10206 +(dp10207 +S'default_value' +p10208 +(dp10209 +S'editable' +p10210 +I00 +sS'value' +p10211 +NssS'summary_default' +p10212 +(dp10213 +S'editable' +p10214 +I01 +sS'value' +p10215 +S'none' +p10216 +ssS'valid_types' +p10217 +(dp10218 +S'editable' +p10219 +I01 +sS'value' +p10220 +(lp10221 +S'Tag' +p10222 +asssS'description' +p10223 +(dp10224 +S'editable' +p10225 +I01 +sS'value' +p10226 +g47 +sssS'id' +p10227 +(dp10228 +S'mandatory' +p10229 +(dp10230 +S'editable' +p10231 +I00 +sS'value' +p10232 +I00 +ssS'name' +p10233 +(dp10234 +S'editable' +p10235 +I01 +sS'value' +p10236 +S'Id' +p10237 +ssS'data_type' +p10238 +(dp10239 +S'editable' +p10240 +I00 +sS'value' +p10241 +S'number' +p10242 +ssS'entity_type' +p10243 +(dp10244 +S'editable' +p10245 +I00 +sS'value' +p10246 +S'CustomNonProjectEntity02' +p10247 +ssS'editable' +p10248 +(dp10249 +S'editable' +p10250 +I00 +sS'value' +p10251 +I00 +ssS'unique' +p10252 +(dp10253 +S'editable' +p10254 +I00 +sS'value' +p10255 +I00 +ssS'properties' +p10256 +(dp10257 +S'default_value' +p10258 +(dp10259 +S'editable' +p10260 +I00 +sS'value' +p10261 +NssS'summary_default' +p10262 +(dp10263 +S'editable' +p10264 +I01 +sS'value' +p10265 +S'none' +p10266 +sssS'description' +p10267 +(dp10268 +S'editable' +p10269 +I01 +sS'value' +p10270 +g47 +sssS'updated_by' +p10271 +(dp10272 +S'mandatory' +p10273 +(dp10274 +S'editable' +p10275 +I00 +sS'value' +p10276 +I00 +ssS'name' +p10277 +(dp10278 +S'editable' +p10279 +I01 +sS'value' +p10280 +S'Updated by' +p10281 +ssS'data_type' +p10282 +(dp10283 +S'editable' +p10284 +I00 +sS'value' +p10285 +S'entity' +p10286 +ssS'entity_type' +p10287 +(dp10288 +S'editable' +p10289 +I00 +sS'value' +p10290 +S'CustomNonProjectEntity02' +p10291 +ssS'editable' +p10292 +(dp10293 +S'editable' +p10294 +I00 +sS'value' +p10295 +I00 +ssS'unique' +p10296 +(dp10297 +S'editable' +p10298 +I00 +sS'value' +p10299 +I00 +ssS'properties' +p10300 +(dp10301 +S'default_value' +p10302 +(dp10303 +S'editable' +p10304 +I00 +sS'value' +p10305 +NssS'summary_default' +p10306 +(dp10307 +S'editable' +p10308 +I01 +sS'value' +p10309 +S'none' +p10310 +ssS'valid_types' +p10311 +(dp10312 +S'editable' +p10313 +I01 +sS'value' +p10314 +(lp10315 +S'HumanUser' +p10316 +aS'ApiUser' +p10317 +asssS'description' +p10318 +(dp10319 +S'editable' +p10320 +I01 +sS'value' +p10321 +g47 +ssssS'AssetElementConnection' +p10322 +(dp10323 +S'cached_display_name' +p10324 +(dp10325 +S'mandatory' +p10326 +(dp10327 +S'editable' +p10328 +I00 +sS'value' +p10329 +I00 +ssS'name' +p10330 +(dp10331 +S'editable' +p10332 +I01 +sS'value' +p10333 +S'Cached Display Name' +p10334 +ssS'data_type' +p10335 +(dp10336 +S'editable' +p10337 +I00 +sS'value' +p10338 +S'text' +p10339 +ssS'entity_type' +p10340 +(dp10341 +S'editable' +p10342 +I00 +sS'value' +p10343 +S'AssetElementConnection' +p10344 +ssS'editable' +p10345 +(dp10346 +S'editable' +p10347 +I00 +sS'value' +p10348 +I01 +ssS'unique' +p10349 +(dp10350 +S'editable' +p10351 +I00 +sS'value' +p10352 +I00 +ssS'properties' +p10353 +(dp10354 +S'default_value' +p10355 +(dp10356 +S'editable' +p10357 +I00 +sS'value' +p10358 +NssS'summary_default' +p10359 +(dp10360 +S'editable' +p10361 +I00 +sS'value' +p10362 +S'none' +p10363 +sssS'description' +p10364 +(dp10365 +S'editable' +p10366 +I01 +sS'value' +p10367 +g47 +sssS'element' +p10368 +(dp10369 +S'mandatory' +p10370 +(dp10371 +S'editable' +p10372 +I00 +sS'value' +p10373 +I00 +ssS'name' +p10374 +(dp10375 +S'editable' +p10376 +I01 +sS'value' +p10377 +S'Element' +p10378 +ssS'data_type' +p10379 +(dp10380 +S'editable' +p10381 +I00 +sS'value' +p10382 +S'entity' +p10383 +ssS'entity_type' +p10384 +(dp10385 +S'editable' +p10386 +I00 +sS'value' +p10387 +S'AssetElementConnection' +p10388 +ssS'editable' +p10389 +(dp10390 +S'editable' +p10391 +I00 +sS'value' +p10392 +I00 +ssS'unique' +p10393 +(dp10394 +S'editable' +p10395 +I00 +sS'value' +p10396 +I00 +ssS'properties' +p10397 +(dp10398 +S'default_value' +p10399 +(dp10400 +S'editable' +p10401 +I00 +sS'value' +p10402 +NssS'summary_default' +p10403 +(dp10404 +S'editable' +p10405 +I00 +sS'value' +p10406 +S'none' +p10407 +ssS'valid_types' +p10408 +(dp10409 +S'editable' +p10410 +I00 +sS'value' +p10411 +(lp10412 +S'Element' +p10413 +asssS'description' +p10414 +(dp10415 +S'editable' +p10416 +I01 +sS'value' +p10417 +g47 +sssS'asset' +p10418 +(dp10419 +S'mandatory' +p10420 +(dp10421 +S'editable' +p10422 +I00 +sS'value' +p10423 +I00 +ssS'name' +p10424 +(dp10425 +S'editable' +p10426 +I01 +sS'value' +p10427 +S'Asset' +p10428 +ssS'data_type' +p10429 +(dp10430 +S'editable' +p10431 +I00 +sS'value' +p10432 +S'entity' +p10433 +ssS'entity_type' +p10434 +(dp10435 +S'editable' +p10436 +I00 +sS'value' +p10437 +S'AssetElementConnection' +p10438 +ssS'editable' +p10439 +(dp10440 +S'editable' +p10441 +I00 +sS'value' +p10442 +I00 +ssS'unique' +p10443 +(dp10444 +S'editable' +p10445 +I00 +sS'value' +p10446 +I00 +ssS'properties' +p10447 +(dp10448 +S'default_value' +p10449 +(dp10450 +S'editable' +p10451 +I00 +sS'value' +p10452 +NssS'summary_default' +p10453 +(dp10454 +S'editable' +p10455 +I00 +sS'value' +p10456 +S'none' +p10457 +ssS'valid_types' +p10458 +(dp10459 +S'editable' +p10460 +I00 +sS'value' +p10461 +(lp10462 +S'Asset' +p10463 +asssS'description' +p10464 +(dp10465 +S'editable' +p10466 +I01 +sS'value' +p10467 +g47 +sssS'id' +p10468 +(dp10469 +S'mandatory' +p10470 +(dp10471 +S'editable' +p10472 +I00 +sS'value' +p10473 +I01 +ssS'name' +p10474 +(dp10475 +S'editable' +p10476 +I01 +sS'value' +p10477 +S'Id' +p10478 +ssS'data_type' +p10479 +(dp10480 +S'editable' +p10481 +I00 +sS'value' +p10482 +S'number' +p10483 +ssS'entity_type' +p10484 +(dp10485 +S'editable' +p10486 +I00 +sS'value' +p10487 +S'AssetElementConnection' +p10488 +ssS'editable' +p10489 +(dp10490 +S'editable' +p10491 +I00 +sS'value' +p10492 +I00 +ssS'unique' +p10493 +(dp10494 +S'editable' +p10495 +I00 +sS'value' +p10496 +I00 +ssS'properties' +p10497 +(dp10498 +S'default_value' +p10499 +(dp10500 +S'editable' +p10501 +I00 +sS'value' +p10502 +NssS'summary_default' +p10503 +(dp10504 +S'editable' +p10505 +I00 +sS'value' +p10506 +S'none' +p10507 +sssS'description' +p10508 +(dp10509 +S'editable' +p10510 +I01 +sS'value' +p10511 +g47 +ssssS'ReleaseTicketConnection' +p10512 +(dp10513 +S'release' +p10514 +(dp10515 +S'mandatory' +p10516 +(dp10517 +S'editable' +p10518 +I00 +sS'value' +p10519 +I00 +ssS'name' +p10520 +(dp10521 +S'editable' +p10522 +I01 +sS'value' +p10523 +S'Release' +p10524 +ssS'data_type' +p10525 +(dp10526 +S'editable' +p10527 +I00 +sS'value' +p10528 +S'entity' +p10529 +ssS'entity_type' +p10530 +(dp10531 +S'editable' +p10532 +I00 +sS'value' +p10533 +S'ReleaseTicketConnection' +p10534 +ssS'editable' +p10535 +(dp10536 +S'editable' +p10537 +I00 +sS'value' +p10538 +I00 +ssS'unique' +p10539 +(dp10540 +S'editable' +p10541 +I00 +sS'value' +p10542 +I00 +ssS'properties' +p10543 +(dp10544 +S'default_value' +p10545 +(dp10546 +S'editable' +p10547 +I00 +sS'value' +p10548 +NssS'summary_default' +p10549 +(dp10550 +S'editable' +p10551 +I00 +sS'value' +p10552 +S'none' +p10553 +ssS'valid_types' +p10554 +(dp10555 +S'editable' +p10556 +I00 +sS'value' +p10557 +(lp10558 +S'Release' +p10559 +asssS'description' +p10560 +(dp10561 +S'editable' +p10562 +I01 +sS'value' +p10563 +g47 +sssS'ticket' +p10564 +(dp10565 +S'mandatory' +p10566 +(dp10567 +S'editable' +p10568 +I00 +sS'value' +p10569 +I00 +ssS'name' +p10570 +(dp10571 +S'editable' +p10572 +I01 +sS'value' +p10573 +S'Ticket' +p10574 +ssS'data_type' +p10575 +(dp10576 +S'editable' +p10577 +I00 +sS'value' +p10578 +S'entity' +p10579 +ssS'entity_type' +p10580 +(dp10581 +S'editable' +p10582 +I00 +sS'value' +p10583 +S'ReleaseTicketConnection' +p10584 +ssS'editable' +p10585 +(dp10586 +S'editable' +p10587 +I00 +sS'value' +p10588 +I00 +ssS'unique' +p10589 +(dp10590 +S'editable' +p10591 +I00 +sS'value' +p10592 +I00 +ssS'properties' +p10593 +(dp10594 +S'default_value' +p10595 +(dp10596 +S'editable' +p10597 +I00 +sS'value' +p10598 +NssS'summary_default' +p10599 +(dp10600 +S'editable' +p10601 +I00 +sS'value' +p10602 +S'none' +p10603 +ssS'valid_types' +p10604 +(dp10605 +S'editable' +p10606 +I00 +sS'value' +p10607 +(lp10608 +S'Ticket' +p10609 +asssS'description' +p10610 +(dp10611 +S'editable' +p10612 +I01 +sS'value' +p10613 +g47 +sssS'id' +p10614 +(dp10615 +S'mandatory' +p10616 +(dp10617 +S'editable' +p10618 +I00 +sS'value' +p10619 +I01 +ssS'name' +p10620 +(dp10621 +S'editable' +p10622 +I01 +sS'value' +p10623 +S'Id' +p10624 +ssS'data_type' +p10625 +(dp10626 +S'editable' +p10627 +I00 +sS'value' +p10628 +S'number' +p10629 +ssS'entity_type' +p10630 +(dp10631 +S'editable' +p10632 +I00 +sS'value' +p10633 +S'ReleaseTicketConnection' +p10634 +ssS'editable' +p10635 +(dp10636 +S'editable' +p10637 +I00 +sS'value' +p10638 +I00 +ssS'unique' +p10639 +(dp10640 +S'editable' +p10641 +I00 +sS'value' +p10642 +I00 +ssS'properties' +p10643 +(dp10644 +S'default_value' +p10645 +(dp10646 +S'editable' +p10647 +I00 +sS'value' +p10648 +NssS'summary_default' +p10649 +(dp10650 +S'editable' +p10651 +I00 +sS'value' +p10652 +S'none' +p10653 +sssS'description' +p10654 +(dp10655 +S'editable' +p10656 +I01 +sS'value' +p10657 +g47 +sssS'cached_display_name' +p10658 +(dp10659 +S'mandatory' +p10660 +(dp10661 +S'editable' +p10662 +I00 +sS'value' +p10663 +I00 +ssS'name' +p10664 +(dp10665 +S'editable' +p10666 +I01 +sS'value' +p10667 +S'Cached Display Name' +p10668 +ssS'data_type' +p10669 +(dp10670 +S'editable' +p10671 +I00 +sS'value' +p10672 +S'text' +p10673 +ssS'entity_type' +p10674 +(dp10675 +S'editable' +p10676 +I00 +sS'value' +p10677 +S'ReleaseTicketConnection' +p10678 +ssS'editable' +p10679 +(dp10680 +S'editable' +p10681 +I00 +sS'value' +p10682 +I01 +ssS'unique' +p10683 +(dp10684 +S'editable' +p10685 +I00 +sS'value' +p10686 +I00 +ssS'properties' +p10687 +(dp10688 +S'default_value' +p10689 +(dp10690 +S'editable' +p10691 +I00 +sS'value' +p10692 +NssS'summary_default' +p10693 +(dp10694 +S'editable' +p10695 +I00 +sS'value' +p10696 +S'none' +p10697 +sssS'description' +p10698 +(dp10699 +S'editable' +p10700 +I01 +sS'value' +p10701 +g47 +ssssS'RevisionRevisionConnection' +p10702 +(dp10703 +S'dest_revision' +p10704 +(dp10705 +S'mandatory' +p10706 +(dp10707 +S'editable' +p10708 +I00 +sS'value' +p10709 +I00 +ssS'name' +p10710 +(dp10711 +S'editable' +p10712 +I01 +sS'value' +p10713 +S'Destination Revision' +p10714 +ssS'data_type' +p10715 +(dp10716 +S'editable' +p10717 +I00 +sS'value' +p10718 +S'entity' +p10719 +ssS'entity_type' +p10720 +(dp10721 +S'editable' +p10722 +I00 +sS'value' +p10723 +S'RevisionRevisionConnection' +p10724 +ssS'editable' +p10725 +(dp10726 +S'editable' +p10727 +I00 +sS'value' +p10728 +I00 +ssS'unique' +p10729 +(dp10730 +S'editable' +p10731 +I00 +sS'value' +p10732 +I00 +ssS'properties' +p10733 +(dp10734 +S'default_value' +p10735 +(dp10736 +S'editable' +p10737 +I00 +sS'value' +p10738 +NssS'summary_default' +p10739 +(dp10740 +S'editable' +p10741 +I00 +sS'value' +p10742 +S'none' +p10743 +ssS'valid_types' +p10744 +(dp10745 +S'editable' +p10746 +I00 +sS'value' +p10747 +(lp10748 +S'Revision' +p10749 +asssS'description' +p10750 +(dp10751 +S'editable' +p10752 +I01 +sS'value' +p10753 +g47 +sssS'source_revision' +p10754 +(dp10755 +S'mandatory' +p10756 +(dp10757 +S'editable' +p10758 +I00 +sS'value' +p10759 +I00 +ssS'name' +p10760 +(dp10761 +S'editable' +p10762 +I01 +sS'value' +p10763 +S'Source Revision' +p10764 +ssS'data_type' +p10765 +(dp10766 +S'editable' +p10767 +I00 +sS'value' +p10768 +S'entity' +p10769 +ssS'entity_type' +p10770 +(dp10771 +S'editable' +p10772 +I00 +sS'value' +p10773 +S'RevisionRevisionConnection' +p10774 +ssS'editable' +p10775 +(dp10776 +S'editable' +p10777 +I00 +sS'value' +p10778 +I00 +ssS'unique' +p10779 +(dp10780 +S'editable' +p10781 +I00 +sS'value' +p10782 +I00 +ssS'properties' +p10783 +(dp10784 +S'default_value' +p10785 +(dp10786 +S'editable' +p10787 +I00 +sS'value' +p10788 +NssS'summary_default' +p10789 +(dp10790 +S'editable' +p10791 +I00 +sS'value' +p10792 +S'none' +p10793 +ssS'valid_types' +p10794 +(dp10795 +S'editable' +p10796 +I00 +sS'value' +p10797 +(lp10798 +S'Revision' +p10799 +asssS'description' +p10800 +(dp10801 +S'editable' +p10802 +I01 +sS'value' +p10803 +g47 +sssS'id' +p10804 +(dp10805 +S'mandatory' +p10806 +(dp10807 +S'editable' +p10808 +I00 +sS'value' +p10809 +I01 +ssS'name' +p10810 +(dp10811 +S'editable' +p10812 +I01 +sS'value' +p10813 +S'Id' +p10814 +ssS'data_type' +p10815 +(dp10816 +S'editable' +p10817 +I00 +sS'value' +p10818 +S'number' +p10819 +ssS'entity_type' +p10820 +(dp10821 +S'editable' +p10822 +I00 +sS'value' +p10823 +S'RevisionRevisionConnection' +p10824 +ssS'editable' +p10825 +(dp10826 +S'editable' +p10827 +I00 +sS'value' +p10828 +I00 +ssS'unique' +p10829 +(dp10830 +S'editable' +p10831 +I00 +sS'value' +p10832 +I00 +ssS'properties' +p10833 +(dp10834 +S'default_value' +p10835 +(dp10836 +S'editable' +p10837 +I00 +sS'value' +p10838 +NssS'summary_default' +p10839 +(dp10840 +S'editable' +p10841 +I00 +sS'value' +p10842 +S'none' +p10843 +sssS'description' +p10844 +(dp10845 +S'editable' +p10846 +I01 +sS'value' +p10847 +g47 +sssS'cached_display_name' +p10848 +(dp10849 +S'mandatory' +p10850 +(dp10851 +S'editable' +p10852 +I00 +sS'value' +p10853 +I00 +ssS'name' +p10854 +(dp10855 +S'editable' +p10856 +I01 +sS'value' +p10857 +S'Cached Display Name' +p10858 +ssS'data_type' +p10859 +(dp10860 +S'editable' +p10861 +I00 +sS'value' +p10862 +S'text' +p10863 +ssS'entity_type' +p10864 +(dp10865 +S'editable' +p10866 +I00 +sS'value' +p10867 +S'RevisionRevisionConnection' +p10868 +ssS'editable' +p10869 +(dp10870 +S'editable' +p10871 +I00 +sS'value' +p10872 +I01 +ssS'unique' +p10873 +(dp10874 +S'editable' +p10875 +I00 +sS'value' +p10876 +I00 +ssS'properties' +p10877 +(dp10878 +S'default_value' +p10879 +(dp10880 +S'editable' +p10881 +I00 +sS'value' +p10882 +NssS'summary_default' +p10883 +(dp10884 +S'editable' +p10885 +I00 +sS'value' +p10886 +S'none' +p10887 +sssS'description' +p10888 +(dp10889 +S'editable' +p10890 +I01 +sS'value' +p10891 +g47 +ssssS'ProjectUserConnection' +p10892 +(dp10893 +S'project' +p10894 +(dp10895 +S'mandatory' +p10896 +(dp10897 +S'editable' +p10898 +I00 +sS'value' +p10899 +I00 +ssS'name' +p10900 +(dp10901 +S'editable' +p10902 +I01 +sS'value' +p10903 +S'Project' +p10904 +ssS'data_type' +p10905 +(dp10906 +S'editable' +p10907 +I00 +sS'value' +p10908 +S'entity' +p10909 +ssS'entity_type' +p10910 +(dp10911 +S'editable' +p10912 +I00 +sS'value' +p10913 +S'ProjectUserConnection' +p10914 +ssS'editable' +p10915 +(dp10916 +S'editable' +p10917 +I00 +sS'value' +p10918 +I00 +ssS'unique' +p10919 +(dp10920 +S'editable' +p10921 +I00 +sS'value' +p10922 +I00 +ssS'properties' +p10923 +(dp10924 +S'default_value' +p10925 +(dp10926 +S'editable' +p10927 +I00 +sS'value' +p10928 +NssS'summary_default' +p10929 +(dp10930 +S'editable' +p10931 +I00 +sS'value' +p10932 +S'none' +p10933 +ssS'valid_types' +p10934 +(dp10935 +S'editable' +p10936 +I00 +sS'value' +p10937 +(lp10938 +S'Project' +p10939 +asssS'description' +p10940 +(dp10941 +S'editable' +p10942 +I01 +sS'value' +p10943 +g47 +sssS'cached_display_name' +p10944 +(dp10945 +S'mandatory' +p10946 +(dp10947 +S'editable' +p10948 +I00 +sS'value' +p10949 +I00 +ssS'name' +p10950 +(dp10951 +S'editable' +p10952 +I01 +sS'value' +p10953 +S'Cached Display Name' +p10954 +ssS'data_type' +p10955 +(dp10956 +S'editable' +p10957 +I00 +sS'value' +p10958 +S'text' +p10959 +ssS'entity_type' +p10960 +(dp10961 +S'editable' +p10962 +I00 +sS'value' +p10963 +S'ProjectUserConnection' +p10964 +ssS'editable' +p10965 +(dp10966 +S'editable' +p10967 +I00 +sS'value' +p10968 +I01 +ssS'unique' +p10969 +(dp10970 +S'editable' +p10971 +I00 +sS'value' +p10972 +I00 +ssS'properties' +p10973 +(dp10974 +S'default_value' +p10975 +(dp10976 +S'editable' +p10977 +I00 +sS'value' +p10978 +NssS'summary_default' +p10979 +(dp10980 +S'editable' +p10981 +I00 +sS'value' +p10982 +S'none' +p10983 +sssS'description' +p10984 +(dp10985 +S'editable' +p10986 +I01 +sS'value' +p10987 +g47 +sssS'id' +p10988 +(dp10989 +S'mandatory' +p10990 +(dp10991 +S'editable' +p10992 +I00 +sS'value' +p10993 +I01 +ssS'name' +p10994 +(dp10995 +S'editable' +p10996 +I01 +sS'value' +p10997 +S'Id' +p10998 +ssS'data_type' +p10999 +(dp11000 +S'editable' +p11001 +I00 +sS'value' +p11002 +S'number' +p11003 +ssS'entity_type' +p11004 +(dp11005 +S'editable' +p11006 +I00 +sS'value' +p11007 +S'ProjectUserConnection' +p11008 +ssS'editable' +p11009 +(dp11010 +S'editable' +p11011 +I00 +sS'value' +p11012 +I00 +ssS'unique' +p11013 +(dp11014 +S'editable' +p11015 +I00 +sS'value' +p11016 +I00 +ssS'properties' +p11017 +(dp11018 +S'default_value' +p11019 +(dp11020 +S'editable' +p11021 +I00 +sS'value' +p11022 +NssS'summary_default' +p11023 +(dp11024 +S'editable' +p11025 +I00 +sS'value' +p11026 +S'none' +p11027 +sssS'description' +p11028 +(dp11029 +S'editable' +p11030 +I01 +sS'value' +p11031 +g47 +sssS'user' +p11032 +(dp11033 +S'mandatory' +p11034 +(dp11035 +S'editable' +p11036 +I00 +sS'value' +p11037 +I00 +ssS'name' +p11038 +(dp11039 +S'editable' +p11040 +I01 +sS'value' +p11041 +S'Person' +p11042 +ssS'data_type' +p11043 +(dp11044 +S'editable' +p11045 +I00 +sS'value' +p11046 +S'entity' +p11047 +ssS'entity_type' +p11048 +(dp11049 +S'editable' +p11050 +I00 +sS'value' +p11051 +S'ProjectUserConnection' +p11052 +ssS'editable' +p11053 +(dp11054 +S'editable' +p11055 +I00 +sS'value' +p11056 +I00 +ssS'unique' +p11057 +(dp11058 +S'editable' +p11059 +I00 +sS'value' +p11060 +I00 +ssS'properties' +p11061 +(dp11062 +S'default_value' +p11063 +(dp11064 +S'editable' +p11065 +I00 +sS'value' +p11066 +NssS'summary_default' +p11067 +(dp11068 +S'editable' +p11069 +I00 +sS'value' +p11070 +S'none' +p11071 +ssS'valid_types' +p11072 +(dp11073 +S'editable' +p11074 +I00 +sS'value' +p11075 +(lp11076 +S'HumanUser' +p11077 +asssS'description' +p11078 +(dp11079 +S'editable' +p11080 +I01 +sS'value' +p11081 +g47 +ssssS'MocapTakeRangeShotConnection' +p11082 +(dp11083 +S'mocap_take_range' +p11084 +(dp11085 +S'mandatory' +p11086 +(dp11087 +S'editable' +p11088 +I00 +sS'value' +p11089 +I00 +ssS'name' +p11090 +(dp11091 +S'editable' +p11092 +I01 +sS'value' +p11093 +S'Mocap Take Range' +p11094 +ssS'data_type' +p11095 +(dp11096 +S'editable' +p11097 +I00 +sS'value' +p11098 +S'entity' +p11099 +ssS'entity_type' +p11100 +(dp11101 +S'editable' +p11102 +I00 +sS'value' +p11103 +S'MocapTakeRangeShotConnection' +p11104 +ssS'editable' +p11105 +(dp11106 +S'editable' +p11107 +I00 +sS'value' +p11108 +I00 +ssS'unique' +p11109 +(dp11110 +S'editable' +p11111 +I00 +sS'value' +p11112 +I00 +ssS'properties' +p11113 +(dp11114 +S'default_value' +p11115 +(dp11116 +S'editable' +p11117 +I00 +sS'value' +p11118 +NssS'summary_default' +p11119 +(dp11120 +S'editable' +p11121 +I00 +sS'value' +p11122 +S'none' +p11123 +ssS'valid_types' +p11124 +(dp11125 +S'editable' +p11126 +I00 +sS'value' +p11127 +(lp11128 +S'MocapTakeRange' +p11129 +asssS'description' +p11130 +(dp11131 +S'editable' +p11132 +I01 +sS'value' +p11133 +g47 +sssS'cached_display_name' +p11134 +(dp11135 +S'mandatory' +p11136 +(dp11137 +S'editable' +p11138 +I00 +sS'value' +p11139 +I00 +ssS'name' +p11140 +(dp11141 +S'editable' +p11142 +I01 +sS'value' +p11143 +S'Cached Display Name' +p11144 +ssS'data_type' +p11145 +(dp11146 +S'editable' +p11147 +I00 +sS'value' +p11148 +S'text' +p11149 +ssS'entity_type' +p11150 +(dp11151 +S'editable' +p11152 +I00 +sS'value' +p11153 +S'MocapTakeRangeShotConnection' +p11154 +ssS'editable' +p11155 +(dp11156 +S'editable' +p11157 +I00 +sS'value' +p11158 +I01 +ssS'unique' +p11159 +(dp11160 +S'editable' +p11161 +I00 +sS'value' +p11162 +I00 +ssS'properties' +p11163 +(dp11164 +S'default_value' +p11165 +(dp11166 +S'editable' +p11167 +I00 +sS'value' +p11168 +NssS'summary_default' +p11169 +(dp11170 +S'editable' +p11171 +I00 +sS'value' +p11172 +S'none' +p11173 +sssS'description' +p11174 +(dp11175 +S'editable' +p11176 +I01 +sS'value' +p11177 +g47 +sssS'shot' +p11178 +(dp11179 +S'mandatory' +p11180 +(dp11181 +S'editable' +p11182 +I00 +sS'value' +p11183 +I00 +ssS'name' +p11184 +(dp11185 +S'editable' +p11186 +I01 +sS'value' +p11187 +S'Shot' +p11188 +ssS'data_type' +p11189 +(dp11190 +S'editable' +p11191 +I00 +sS'value' +p11192 +S'entity' +p11193 +ssS'entity_type' +p11194 +(dp11195 +S'editable' +p11196 +I00 +sS'value' +p11197 +S'MocapTakeRangeShotConnection' +p11198 +ssS'editable' +p11199 +(dp11200 +S'editable' +p11201 +I00 +sS'value' +p11202 +I00 +ssS'unique' +p11203 +(dp11204 +S'editable' +p11205 +I00 +sS'value' +p11206 +I00 +ssS'properties' +p11207 +(dp11208 +S'default_value' +p11209 +(dp11210 +S'editable' +p11211 +I00 +sS'value' +p11212 +NssS'summary_default' +p11213 +(dp11214 +S'editable' +p11215 +I00 +sS'value' +p11216 +S'none' +p11217 +ssS'valid_types' +p11218 +(dp11219 +S'editable' +p11220 +I00 +sS'value' +p11221 +(lp11222 +S'Shot' +p11223 +asssS'description' +p11224 +(dp11225 +S'editable' +p11226 +I01 +sS'value' +p11227 +g47 +sssS'id' +p11228 +(dp11229 +S'mandatory' +p11230 +(dp11231 +S'editable' +p11232 +I00 +sS'value' +p11233 +I01 +ssS'name' +p11234 +(dp11235 +S'editable' +p11236 +I01 +sS'value' +p11237 +S'Id' +p11238 +ssS'data_type' +p11239 +(dp11240 +S'editable' +p11241 +I00 +sS'value' +p11242 +S'number' +p11243 +ssS'entity_type' +p11244 +(dp11245 +S'editable' +p11246 +I00 +sS'value' +p11247 +S'MocapTakeRangeShotConnection' +p11248 +ssS'editable' +p11249 +(dp11250 +S'editable' +p11251 +I00 +sS'value' +p11252 +I00 +ssS'unique' +p11253 +(dp11254 +S'editable' +p11255 +I00 +sS'value' +p11256 +I00 +ssS'properties' +p11257 +(dp11258 +S'default_value' +p11259 +(dp11260 +S'editable' +p11261 +I00 +sS'value' +p11262 +NssS'summary_default' +p11263 +(dp11264 +S'editable' +p11265 +I00 +sS'value' +p11266 +S'none' +p11267 +sssS'description' +p11268 +(dp11269 +S'editable' +p11270 +I01 +sS'value' +p11271 +g47 +ssssS'PublishedFileDependency' +p11272 +(dp11273 +S'cached_display_name' +p11274 +(dp11275 +S'mandatory' +p11276 +(dp11277 +S'editable' +p11278 +I00 +sS'value' +p11279 +I00 +ssS'name' +p11280 +(dp11281 +S'editable' +p11282 +I01 +sS'value' +p11283 +S'Cached Display Name' +p11284 +ssS'data_type' +p11285 +(dp11286 +S'editable' +p11287 +I00 +sS'value' +p11288 +S'text' +p11289 +ssS'entity_type' +p11290 +(dp11291 +S'editable' +p11292 +I00 +sS'value' +p11293 +S'PublishedFileDependency' +p11294 +ssS'editable' +p11295 +(dp11296 +S'editable' +p11297 +I00 +sS'value' +p11298 +I01 +ssS'unique' +p11299 +(dp11300 +S'editable' +p11301 +I00 +sS'value' +p11302 +I00 +ssS'properties' +p11303 +(dp11304 +S'default_value' +p11305 +(dp11306 +S'editable' +p11307 +I00 +sS'value' +p11308 +NssS'summary_default' +p11309 +(dp11310 +S'editable' +p11311 +I00 +sS'value' +p11312 +S'none' +p11313 +sssS'description' +p11314 +(dp11315 +S'editable' +p11316 +I01 +sS'value' +p11317 +g47 +sssS'dependent_published_file' +p11318 +(dp11319 +S'mandatory' +p11320 +(dp11321 +S'editable' +p11322 +I00 +sS'value' +p11323 +I00 +ssS'name' +p11324 +(dp11325 +S'editable' +p11326 +I01 +sS'value' +p11327 +S'Dependent Published File' +p11328 +ssS'data_type' +p11329 +(dp11330 +S'editable' +p11331 +I00 +sS'value' +p11332 +S'entity' +p11333 +ssS'entity_type' +p11334 +(dp11335 +S'editable' +p11336 +I00 +sS'value' +p11337 +S'PublishedFileDependency' +p11338 +ssS'editable' +p11339 +(dp11340 +S'editable' +p11341 +I00 +sS'value' +p11342 +I01 +ssS'unique' +p11343 +(dp11344 +S'editable' +p11345 +I00 +sS'value' +p11346 +I00 +ssS'properties' +p11347 +(dp11348 +S'default_value' +p11349 +(dp11350 +S'editable' +p11351 +I00 +sS'value' +p11352 +NssS'summary_default' +p11353 +(dp11354 +S'editable' +p11355 +I00 +sS'value' +p11356 +S'none' +p11357 +ssS'valid_types' +p11358 +(dp11359 +S'editable' +p11360 +I00 +sS'value' +p11361 +(lp11362 +S'PublishedFile' +p11363 +asssS'description' +p11364 +(dp11365 +S'editable' +p11366 +I01 +sS'value' +p11367 +g47 +sssS'id' +p11368 +(dp11369 +S'mandatory' +p11370 +(dp11371 +S'editable' +p11372 +I00 +sS'value' +p11373 +I00 +ssS'name' +p11374 +(dp11375 +S'editable' +p11376 +I01 +sS'value' +p11377 +S'Id' +p11378 +ssS'data_type' +p11379 +(dp11380 +S'editable' +p11381 +I00 +sS'value' +p11382 +S'number' +p11383 +ssS'entity_type' +p11384 +(dp11385 +S'editable' +p11386 +I00 +sS'value' +p11387 +S'PublishedFileDependency' +p11388 +ssS'editable' +p11389 +(dp11390 +S'editable' +p11391 +I00 +sS'value' +p11392 +I00 +ssS'unique' +p11393 +(dp11394 +S'editable' +p11395 +I00 +sS'value' +p11396 +I00 +ssS'properties' +p11397 +(dp11398 +S'default_value' +p11399 +(dp11400 +S'editable' +p11401 +I00 +sS'value' +p11402 +NssS'summary_default' +p11403 +(dp11404 +S'editable' +p11405 +I00 +sS'value' +p11406 +S'none' +p11407 +sssS'description' +p11408 +(dp11409 +S'editable' +p11410 +I01 +sS'value' +p11411 +g47 +sssS'published_file' +p11412 +(dp11413 +S'mandatory' +p11414 +(dp11415 +S'editable' +p11416 +I00 +sS'value' +p11417 +I00 +ssS'name' +p11418 +(dp11419 +S'editable' +p11420 +I01 +sS'value' +p11421 +S'Published File' +p11422 +ssS'data_type' +p11423 +(dp11424 +S'editable' +p11425 +I00 +sS'value' +p11426 +S'entity' +p11427 +ssS'entity_type' +p11428 +(dp11429 +S'editable' +p11430 +I00 +sS'value' +p11431 +S'PublishedFileDependency' +p11432 +ssS'editable' +p11433 +(dp11434 +S'editable' +p11435 +I00 +sS'value' +p11436 +I01 +ssS'unique' +p11437 +(dp11438 +S'editable' +p11439 +I00 +sS'value' +p11440 +I00 +ssS'properties' +p11441 +(dp11442 +S'default_value' +p11443 +(dp11444 +S'editable' +p11445 +I00 +sS'value' +p11446 +NssS'summary_default' +p11447 +(dp11448 +S'editable' +p11449 +I00 +sS'value' +p11450 +S'none' +p11451 +ssS'valid_types' +p11452 +(dp11453 +S'editable' +p11454 +I00 +sS'value' +p11455 +(lp11456 +S'PublishedFile' +p11457 +asssS'description' +p11458 +(dp11459 +S'editable' +p11460 +I01 +sS'value' +p11461 +g47 +ssssS'Step' +p11462 +(dp11463 +S'code' +p11464 +(dp11465 +S'mandatory' +p11466 +(dp11467 +S'editable' +p11468 +I00 +sS'value' +p11469 +I01 +ssS'name' +p11470 +(dp11471 +S'editable' +p11472 +I01 +sS'value' +p11473 +S'Pipeline Step' +p11474 +ssS'data_type' +p11475 +(dp11476 +S'editable' +p11477 +I00 +sS'value' +p11478 +S'text' +p11479 +ssS'entity_type' +p11480 +(dp11481 +S'editable' +p11482 +I00 +sS'value' +p11483 +S'Step' +p11484 +ssS'editable' +p11485 +(dp11486 +S'editable' +p11487 +I00 +sS'value' +p11488 +I01 +ssS'unique' +p11489 +(dp11490 +S'editable' +p11491 +I00 +sS'value' +p11492 +I00 +ssS'properties' +p11493 +(dp11494 +S'default_value' +p11495 +(dp11496 +S'editable' +p11497 +I00 +sS'value' +p11498 +NssS'summary_default' +p11499 +(dp11500 +S'editable' +p11501 +I01 +sS'value' +p11502 +S'none' +p11503 +sssS'description' +p11504 +(dp11505 +S'editable' +p11506 +I01 +sS'value' +p11507 +g47 +sssS'description' +p11508 +(dp11509 +S'mandatory' +p11510 +(dp11511 +S'editable' +p11512 +I00 +sS'value' +p11513 +I00 +ssS'name' +p11514 +(dp11515 +S'editable' +p11516 +I01 +sS'value' +p11517 +S'Description' +p11518 +ssS'data_type' +p11519 +(dp11520 +S'editable' +p11521 +I00 +sS'value' +p11522 +S'text' +p11523 +ssS'entity_type' +p11524 +(dp11525 +S'editable' +p11526 +I00 +sS'value' +p11527 +S'Step' +p11528 +ssS'editable' +p11529 +(dp11530 +S'editable' +p11531 +I00 +sS'value' +p11532 +I01 +ssS'unique' +p11533 +(dp11534 +S'editable' +p11535 +I00 +sS'value' +p11536 +I00 +ssS'properties' +p11537 +(dp11538 +S'default_value' +p11539 +(dp11540 +S'editable' +p11541 +I00 +sS'value' +p11542 +NssS'summary_default' +p11543 +(dp11544 +S'editable' +p11545 +I01 +sS'value' +p11546 +S'none' +p11547 +sssS'description' +p11548 +(dp11549 +S'editable' +p11550 +I01 +sS'value' +p11551 +g47 +sssS'short_name' +p11552 +(dp11553 +S'mandatory' +p11554 +(dp11555 +S'editable' +p11556 +I00 +sS'value' +p11557 +I00 +ssS'name' +p11558 +(dp11559 +S'editable' +p11560 +I01 +sS'value' +p11561 +S'Short Code' +p11562 +ssS'data_type' +p11563 +(dp11564 +S'editable' +p11565 +I00 +sS'value' +p11566 +S'text' +p11567 +ssS'entity_type' +p11568 +(dp11569 +S'editable' +p11570 +I00 +sS'value' +p11571 +S'Step' +p11572 +ssS'editable' +p11573 +(dp11574 +S'editable' +p11575 +I00 +sS'value' +p11576 +I01 +ssS'unique' +p11577 +(dp11578 +S'editable' +p11579 +I00 +sS'value' +p11580 +I00 +ssS'properties' +p11581 +(dp11582 +S'default_value' +p11583 +(dp11584 +S'editable' +p11585 +I00 +sS'value' +p11586 +NssS'summary_default' +p11587 +(dp11588 +S'editable' +p11589 +I01 +sS'value' +p11590 +S'none' +p11591 +sssS'description' +p11592 +(dp11593 +S'editable' +p11594 +I01 +sS'value' +p11595 +g47 +sssS'list_order' +p11596 +(dp11597 +S'mandatory' +p11598 +(dp11599 +S'editable' +p11600 +I00 +sS'value' +p11601 +I00 +ssS'name' +p11602 +(dp11603 +S'editable' +p11604 +I01 +sS'value' +p11605 +S'Order' +p11606 +ssS'data_type' +p11607 +(dp11608 +S'editable' +p11609 +I00 +sS'value' +p11610 +S'number' +p11611 +ssS'entity_type' +p11612 +(dp11613 +S'editable' +p11614 +I00 +sS'value' +p11615 +S'Step' +p11616 +ssS'editable' +p11617 +(dp11618 +S'editable' +p11619 +I00 +sS'value' +p11620 +I01 +ssS'unique' +p11621 +(dp11622 +S'editable' +p11623 +I00 +sS'value' +p11624 +I00 +ssS'properties' +p11625 +(dp11626 +S'default_value' +p11627 +(dp11628 +S'editable' +p11629 +I00 +sS'value' +p11630 +NssS'summary_default' +p11631 +(dp11632 +S'editable' +p11633 +I01 +sS'value' +p11634 +S'none' +p11635 +sssS'description' +p11636 +(dp11637 +S'editable' +p11638 +I01 +sS'value' +p11639 +g47 +sssS'color' +p11640 +(dp11641 +S'mandatory' +p11642 +(dp11643 +S'editable' +p11644 +I00 +sS'value' +p11645 +I00 +ssS'name' +p11646 +(dp11647 +S'editable' +p11648 +I01 +sS'value' +p11649 +S'Color' +p11650 +ssS'data_type' +p11651 +(dp11652 +S'editable' +p11653 +I00 +sS'value' +p11654 +S'color' +p11655 +ssS'entity_type' +p11656 +(dp11657 +S'editable' +p11658 +I00 +sS'value' +p11659 +S'Step' +p11660 +ssS'editable' +p11661 +(dp11662 +S'editable' +p11663 +I00 +sS'value' +p11664 +I01 +ssS'unique' +p11665 +(dp11666 +S'editable' +p11667 +I00 +sS'value' +p11668 +I00 +ssS'properties' +p11669 +(dp11670 +S'default_value' +p11671 +(dp11672 +S'editable' +p11673 +I00 +sS'value' +p11674 +NssS'summary_default' +p11675 +(dp11676 +S'editable' +p11677 +I01 +sS'value' +p11678 +S'none' +p11679 +sssS'description' +p11680 +(dp11681 +S'editable' +p11682 +I01 +sS'value' +p11683 +g47 +sssS'created_at' +p11684 +(dp11685 +S'mandatory' +p11686 +(dp11687 +S'editable' +p11688 +I00 +sS'value' +p11689 +I00 +ssS'name' +p11690 +(dp11691 +S'editable' +p11692 +I01 +sS'value' +p11693 +S'Date Created' +p11694 +ssS'data_type' +p11695 +(dp11696 +S'editable' +p11697 +I00 +sS'value' +p11698 +S'date_time' +p11699 +ssS'entity_type' +p11700 +(dp11701 +S'editable' +p11702 +I00 +sS'value' +p11703 +S'Step' +p11704 +ssS'editable' +p11705 +(dp11706 +S'editable' +p11707 +I00 +sS'value' +p11708 +I00 +ssS'unique' +p11709 +(dp11710 +S'editable' +p11711 +I00 +sS'value' +p11712 +I00 +ssS'properties' +p11713 +(dp11714 +S'default_value' +p11715 +(dp11716 +S'editable' +p11717 +I00 +sS'value' +p11718 +NssS'summary_default' +p11719 +(dp11720 +S'editable' +p11721 +I01 +sS'value' +p11722 +S'none' +p11723 +sssS'description' +p11724 +(dp11725 +S'editable' +p11726 +I01 +sS'value' +p11727 +g47 +sssS'entity_type' +p11728 +(dp11729 +S'mandatory' +p11730 +(dp11731 +S'editable' +p11732 +I00 +sS'value' +p11733 +I00 +ssS'name' +p11734 +(dp11735 +S'editable' +p11736 +I01 +sS'value' +p11737 +S'Entity Type' +p11738 +ssS'data_type' +p11739 +(dp11740 +S'editable' +p11741 +I00 +sS'value' +p11742 +S'entity_type' +p11743 +ssS'entity_type' +p11744 +(dp11745 +S'editable' +p11746 +I00 +sS'value' +p11747 +S'Step' +p11748 +ssS'editable' +p11749 +(dp11750 +S'editable' +p11751 +I00 +sS'value' +p11752 +I01 +ssS'unique' +p11753 +(dp11754 +S'editable' +p11755 +I00 +sS'value' +p11756 +I00 +ssS'properties' +p11757 +(dp11758 +S'default_value' +p11759 +(dp11760 +S'editable' +p11761 +I00 +sS'value' +p11762 +NssS'summary_default' +p11763 +(dp11764 +S'editable' +p11765 +I01 +sS'value' +p11766 +S'none' +p11767 +sssS'description' +p11768 +(dp11769 +S'editable' +p11770 +I01 +sS'value' +p11771 +g47 +sssS'updated_at' +p11772 +(dp11773 +S'mandatory' +p11774 +(dp11775 +S'editable' +p11776 +I00 +sS'value' +p11777 +I00 +ssS'name' +p11778 +(dp11779 +S'editable' +p11780 +I01 +sS'value' +p11781 +S'Date Updated' +p11782 +ssS'data_type' +p11783 +(dp11784 +S'editable' +p11785 +I00 +sS'value' +p11786 +S'date_time' +p11787 +ssS'entity_type' +p11788 +(dp11789 +S'editable' +p11790 +I00 +sS'value' +p11791 +S'Step' +p11792 +ssS'editable' +p11793 +(dp11794 +S'editable' +p11795 +I00 +sS'value' +p11796 +I00 +ssS'unique' +p11797 +(dp11798 +S'editable' +p11799 +I00 +sS'value' +p11800 +I00 +ssS'properties' +p11801 +(dp11802 +S'default_value' +p11803 +(dp11804 +S'editable' +p11805 +I00 +sS'value' +p11806 +NssS'summary_default' +p11807 +(dp11808 +S'editable' +p11809 +I01 +sS'value' +p11810 +S'none' +p11811 +sssS'description' +p11812 +(dp11813 +S'editable' +p11814 +I01 +sS'value' +p11815 +g47 +sssS'created_by' +p11816 +(dp11817 +S'mandatory' +p11818 +(dp11819 +S'editable' +p11820 +I00 +sS'value' +p11821 +I00 +ssS'name' +p11822 +(dp11823 +S'editable' +p11824 +I01 +sS'value' +p11825 +S'Created by' +p11826 +ssS'data_type' +p11827 +(dp11828 +S'editable' +p11829 +I00 +sS'value' +p11830 +S'entity' +p11831 +ssS'entity_type' +p11832 +(dp11833 +S'editable' +p11834 +I00 +sS'value' +p11835 +S'Step' +p11836 +ssS'editable' +p11837 +(dp11838 +S'editable' +p11839 +I00 +sS'value' +p11840 +I00 +ssS'unique' +p11841 +(dp11842 +S'editable' +p11843 +I00 +sS'value' +p11844 +I00 +ssS'properties' +p11845 +(dp11846 +S'default_value' +p11847 +(dp11848 +S'editable' +p11849 +I00 +sS'value' +p11850 +NssS'summary_default' +p11851 +(dp11852 +S'editable' +p11853 +I01 +sS'value' +p11854 +S'none' +p11855 +ssS'valid_types' +p11856 +(dp11857 +S'editable' +p11858 +I01 +sS'value' +p11859 +(lp11860 +S'HumanUser' +p11861 +aS'ApiUser' +p11862 +asssS'description' +p11863 +(dp11864 +S'editable' +p11865 +I01 +sS'value' +p11866 +g47 +sssS'cached_display_name' +p11867 +(dp11868 +S'mandatory' +p11869 +(dp11870 +S'editable' +p11871 +I00 +sS'value' +p11872 +I00 +ssS'name' +p11873 +(dp11874 +S'editable' +p11875 +I01 +sS'value' +p11876 +S'Cached Display Name' +p11877 +ssS'data_type' +p11878 +(dp11879 +S'editable' +p11880 +I00 +sS'value' +p11881 +S'text' +p11882 +ssS'entity_type' +p11883 +(dp11884 +S'editable' +p11885 +I00 +sS'value' +p11886 +S'Step' +p11887 +ssS'editable' +p11888 +(dp11889 +S'editable' +p11890 +I00 +sS'value' +p11891 +I01 +ssS'unique' +p11892 +(dp11893 +S'editable' +p11894 +I00 +sS'value' +p11895 +I00 +ssS'properties' +p11896 +(dp11897 +S'default_value' +p11898 +(dp11899 +S'editable' +p11900 +I00 +sS'value' +p11901 +NssS'summary_default' +p11902 +(dp11903 +S'editable' +p11904 +I00 +sS'value' +p11905 +S'none' +p11906 +sssS'description' +p11907 +(dp11908 +S'editable' +p11909 +I01 +sS'value' +p11910 +g47 +sssS'id' +p11911 +(dp11912 +S'mandatory' +p11913 +(dp11914 +S'editable' +p11915 +I00 +sS'value' +p11916 +I00 +ssS'name' +p11917 +(dp11918 +S'editable' +p11919 +I01 +sS'value' +p11920 +S'Id' +p11921 +ssS'data_type' +p11922 +(dp11923 +S'editable' +p11924 +I00 +sS'value' +p11925 +S'number' +p11926 +ssS'entity_type' +p11927 +(dp11928 +S'editable' +p11929 +I00 +sS'value' +p11930 +S'Step' +p11931 +ssS'editable' +p11932 +(dp11933 +S'editable' +p11934 +I00 +sS'value' +p11935 +I00 +ssS'unique' +p11936 +(dp11937 +S'editable' +p11938 +I00 +sS'value' +p11939 +I00 +ssS'properties' +p11940 +(dp11941 +S'default_value' +p11942 +(dp11943 +S'editable' +p11944 +I00 +sS'value' +p11945 +NssS'summary_default' +p11946 +(dp11947 +S'editable' +p11948 +I00 +sS'value' +p11949 +S'none' +p11950 +sssS'description' +p11951 +(dp11952 +S'editable' +p11953 +I01 +sS'value' +p11954 +g47 +sssS'updated_by' +p11955 +(dp11956 +S'mandatory' +p11957 +(dp11958 +S'editable' +p11959 +I00 +sS'value' +p11960 +I00 +ssS'name' +p11961 +(dp11962 +S'editable' +p11963 +I01 +sS'value' +p11964 +S'Updated by' +p11965 +ssS'data_type' +p11966 +(dp11967 +S'editable' +p11968 +I00 +sS'value' +p11969 +S'entity' +p11970 +ssS'entity_type' +p11971 +(dp11972 +S'editable' +p11973 +I00 +sS'value' +p11974 +S'Step' +p11975 +ssS'editable' +p11976 +(dp11977 +S'editable' +p11978 +I00 +sS'value' +p11979 +I00 +ssS'unique' +p11980 +(dp11981 +S'editable' +p11982 +I00 +sS'value' +p11983 +I00 +ssS'properties' +p11984 +(dp11985 +S'default_value' +p11986 +(dp11987 +S'editable' +p11988 +I00 +sS'value' +p11989 +NssS'summary_default' +p11990 +(dp11991 +S'editable' +p11992 +I01 +sS'value' +p11993 +S'none' +p11994 +ssS'valid_types' +p11995 +(dp11996 +S'editable' +p11997 +I01 +sS'value' +p11998 +(lp11999 +S'HumanUser' +p12000 +aS'ApiUser' +p12001 +asssS'description' +p12002 +(dp12003 +S'editable' +p12004 +I01 +sS'value' +p12005 +g47 +ssssS'AssetLibrary' +p12006 +(dp12007 +S'open_notes_count' +p12008 +(dp12009 +S'mandatory' +p12010 +(dp12011 +S'editable' +p12012 +I00 +sS'value' +p12013 +I00 +ssS'name' +p12014 +(dp12015 +S'editable' +p12016 +I01 +sS'value' +p12017 +S'Open Notes Count' +p12018 +ssS'data_type' +p12019 +(dp12020 +S'editable' +p12021 +I00 +sS'value' +p12022 +S'text' +p12023 +ssS'entity_type' +p12024 +(dp12025 +S'editable' +p12026 +I00 +sS'value' +p12027 +S'AssetLibrary' +p12028 +ssS'editable' +p12029 +(dp12030 +S'editable' +p12031 +I00 +sS'value' +p12032 +I00 +ssS'unique' +p12033 +(dp12034 +S'editable' +p12035 +I00 +sS'value' +p12036 +I00 +ssS'properties' +p12037 +(dp12038 +S'default_value' +p12039 +(dp12040 +S'editable' +p12041 +I00 +sS'value' +p12042 +NssS'summary_default' +p12043 +(dp12044 +S'editable' +p12045 +I01 +sS'value' +p12046 +S'none' +p12047 +sssS'description' +p12048 +(dp12049 +S'editable' +p12050 +I01 +sS'value' +p12051 +g47 +sssS'code' +p12052 +(dp12053 +S'mandatory' +p12054 +(dp12055 +S'editable' +p12056 +I00 +sS'value' +p12057 +I01 +ssS'name' +p12058 +(dp12059 +S'editable' +p12060 +I01 +sS'value' +p12061 +S'Asset Library Name' +p12062 +ssS'data_type' +p12063 +(dp12064 +S'editable' +p12065 +I00 +sS'value' +p12066 +S'text' +p12067 +ssS'entity_type' +p12068 +(dp12069 +S'editable' +p12070 +I00 +sS'value' +p12071 +S'AssetLibrary' +p12072 +ssS'editable' +p12073 +(dp12074 +S'editable' +p12075 +I00 +sS'value' +p12076 +I01 +ssS'unique' +p12077 +(dp12078 +S'editable' +p12079 +I00 +sS'value' +p12080 +I00 +ssS'properties' +p12081 +(dp12082 +S'default_value' +p12083 +(dp12084 +S'editable' +p12085 +I00 +sS'value' +p12086 +NssS'summary_default' +p12087 +(dp12088 +S'editable' +p12089 +I01 +sS'value' +p12090 +S'none' +p12091 +sssS'description' +p12092 +(dp12093 +S'editable' +p12094 +I01 +sS'value' +p12095 +g47 +sssS'open_notes' +p12096 +(dp12097 +S'mandatory' +p12098 +(dp12099 +S'editable' +p12100 +I00 +sS'value' +p12101 +I00 +ssS'name' +p12102 +(dp12103 +S'editable' +p12104 +I01 +sS'value' +p12105 +S'Open Notes' +p12106 +ssS'data_type' +p12107 +(dp12108 +S'editable' +p12109 +I00 +sS'value' +p12110 +S'multi_entity' +p12111 +ssS'entity_type' +p12112 +(dp12113 +S'editable' +p12114 +I00 +sS'value' +p12115 +S'AssetLibrary' +p12116 +ssS'editable' +p12117 +(dp12118 +S'editable' +p12119 +I00 +sS'value' +p12120 +I00 +ssS'unique' +p12121 +(dp12122 +S'editable' +p12123 +I00 +sS'value' +p12124 +I00 +ssS'properties' +p12125 +(dp12126 +S'default_value' +p12127 +(dp12128 +S'editable' +p12129 +I00 +sS'value' +p12130 +NssS'summary_default' +p12131 +(dp12132 +S'editable' +p12133 +I01 +sS'value' +p12134 +S'none' +p12135 +ssS'valid_types' +p12136 +(dp12137 +S'editable' +p12138 +I01 +sS'value' +p12139 +(lp12140 +S'Note' +p12141 +asssS'description' +p12142 +(dp12143 +S'editable' +p12144 +I01 +sS'value' +p12145 +g47 +sssS'description' +p12146 +(dp12147 +S'mandatory' +p12148 +(dp12149 +S'editable' +p12150 +I00 +sS'value' +p12151 +I00 +ssS'name' +p12152 +(dp12153 +S'editable' +p12154 +I01 +sS'value' +p12155 +S'Description' +p12156 +ssS'data_type' +p12157 +(dp12158 +S'editable' +p12159 +I00 +sS'value' +p12160 +S'text' +p12161 +ssS'entity_type' +p12162 +(dp12163 +S'editable' +p12164 +I00 +sS'value' +p12165 +S'AssetLibrary' +p12166 +ssS'editable' +p12167 +(dp12168 +S'editable' +p12169 +I00 +sS'value' +p12170 +I01 +ssS'unique' +p12171 +(dp12172 +S'editable' +p12173 +I00 +sS'value' +p12174 +I00 +ssS'properties' +p12175 +(dp12176 +S'default_value' +p12177 +(dp12178 +S'editable' +p12179 +I00 +sS'value' +p12180 +NssS'summary_default' +p12181 +(dp12182 +S'editable' +p12183 +I01 +sS'value' +p12184 +S'none' +p12185 +sssS'description' +p12186 +(dp12187 +S'editable' +p12188 +I01 +sS'value' +p12189 +g47 +sssS'created_at' +p12190 +(dp12191 +S'mandatory' +p12192 +(dp12193 +S'editable' +p12194 +I00 +sS'value' +p12195 +I00 +ssS'name' +p12196 +(dp12197 +S'editable' +p12198 +I01 +sS'value' +p12199 +S'Date Created' +p12200 +ssS'data_type' +p12201 +(dp12202 +S'editable' +p12203 +I00 +sS'value' +p12204 +S'date_time' +p12205 +ssS'entity_type' +p12206 +(dp12207 +S'editable' +p12208 +I00 +sS'value' +p12209 +S'AssetLibrary' +p12210 +ssS'editable' +p12211 +(dp12212 +S'editable' +p12213 +I00 +sS'value' +p12214 +I00 +ssS'unique' +p12215 +(dp12216 +S'editable' +p12217 +I00 +sS'value' +p12218 +I00 +ssS'properties' +p12219 +(dp12220 +S'default_value' +p12221 +(dp12222 +S'editable' +p12223 +I00 +sS'value' +p12224 +NssS'summary_default' +p12225 +(dp12226 +S'editable' +p12227 +I01 +sS'value' +p12228 +S'none' +p12229 +sssS'description' +p12230 +(dp12231 +S'editable' +p12232 +I01 +sS'value' +p12233 +g47 +sssS'updated_at' +p12234 +(dp12235 +S'mandatory' +p12236 +(dp12237 +S'editable' +p12238 +I00 +sS'value' +p12239 +I00 +ssS'name' +p12240 +(dp12241 +S'editable' +p12242 +I01 +sS'value' +p12243 +S'Date Updated' +p12244 +ssS'data_type' +p12245 +(dp12246 +S'editable' +p12247 +I00 +sS'value' +p12248 +S'date_time' +p12249 +ssS'entity_type' +p12250 +(dp12251 +S'editable' +p12252 +I00 +sS'value' +p12253 +S'AssetLibrary' +p12254 +ssS'editable' +p12255 +(dp12256 +S'editable' +p12257 +I00 +sS'value' +p12258 +I00 +ssS'unique' +p12259 +(dp12260 +S'editable' +p12261 +I00 +sS'value' +p12262 +I00 +ssS'properties' +p12263 +(dp12264 +S'default_value' +p12265 +(dp12266 +S'editable' +p12267 +I00 +sS'value' +p12268 +NssS'summary_default' +p12269 +(dp12270 +S'editable' +p12271 +I01 +sS'value' +p12272 +S'none' +p12273 +sssS'description' +p12274 +(dp12275 +S'editable' +p12276 +I01 +sS'value' +p12277 +g47 +sssS'created_by' +p12278 +(dp12279 +S'mandatory' +p12280 +(dp12281 +S'editable' +p12282 +I00 +sS'value' +p12283 +I00 +ssS'name' +p12284 +(dp12285 +S'editable' +p12286 +I01 +sS'value' +p12287 +S'Created by' +p12288 +ssS'data_type' +p12289 +(dp12290 +S'editable' +p12291 +I00 +sS'value' +p12292 +S'entity' +p12293 +ssS'entity_type' +p12294 +(dp12295 +S'editable' +p12296 +I00 +sS'value' +p12297 +S'AssetLibrary' +p12298 +ssS'editable' +p12299 +(dp12300 +S'editable' +p12301 +I00 +sS'value' +p12302 +I00 +ssS'unique' +p12303 +(dp12304 +S'editable' +p12305 +I00 +sS'value' +p12306 +I00 +ssS'properties' +p12307 +(dp12308 +S'default_value' +p12309 +(dp12310 +S'editable' +p12311 +I00 +sS'value' +p12312 +NssS'summary_default' +p12313 +(dp12314 +S'editable' +p12315 +I01 +sS'value' +p12316 +S'none' +p12317 +ssS'valid_types' +p12318 +(dp12319 +S'editable' +p12320 +I01 +sS'value' +p12321 +(lp12322 +S'HumanUser' +p12323 +aS'ApiUser' +p12324 +asssS'description' +p12325 +(dp12326 +S'editable' +p12327 +I01 +sS'value' +p12328 +g47 +sssS'project' +p12329 +(dp12330 +S'mandatory' +p12331 +(dp12332 +S'editable' +p12333 +I00 +sS'value' +p12334 +I00 +ssS'name' +p12335 +(dp12336 +S'editable' +p12337 +I01 +sS'value' +p12338 +S'Project' +p12339 +ssS'data_type' +p12340 +(dp12341 +S'editable' +p12342 +I00 +sS'value' +p12343 +S'entity' +p12344 +ssS'entity_type' +p12345 +(dp12346 +S'editable' +p12347 +I00 +sS'value' +p12348 +S'AssetLibrary' +p12349 +ssS'editable' +p12350 +(dp12351 +S'editable' +p12352 +I00 +sS'value' +p12353 +I01 +ssS'unique' +p12354 +(dp12355 +S'editable' +p12356 +I00 +sS'value' +p12357 +I00 +ssS'properties' +p12358 +(dp12359 +S'default_value' +p12360 +(dp12361 +S'editable' +p12362 +I00 +sS'value' +p12363 +NssS'summary_default' +p12364 +(dp12365 +S'editable' +p12366 +I01 +sS'value' +p12367 +S'none' +p12368 +ssS'valid_types' +p12369 +(dp12370 +S'editable' +p12371 +I01 +sS'value' +p12372 +(lp12373 +S'Project' +p12374 +asssS'description' +p12375 +(dp12376 +S'editable' +p12377 +I01 +sS'value' +p12378 +g47 +sssS'filmstrip_image' +p12379 +(dp12380 +S'mandatory' +p12381 +(dp12382 +S'editable' +p12383 +I00 +sS'value' +p12384 +I00 +ssS'name' +p12385 +(dp12386 +S'editable' +p12387 +I01 +sS'value' +p12388 +S'Filmstrip Thumbnail' +p12389 +ssS'data_type' +p12390 +(dp12391 +S'editable' +p12392 +I00 +sS'value' +p12393 +S'image' +p12394 +ssS'entity_type' +p12395 +(dp12396 +S'editable' +p12397 +I00 +sS'value' +p12398 +S'AssetLibrary' +p12399 +ssS'editable' +p12400 +(dp12401 +S'editable' +p12402 +I00 +sS'value' +p12403 +I01 +ssS'unique' +p12404 +(dp12405 +S'editable' +p12406 +I00 +sS'value' +p12407 +I00 +ssS'properties' +p12408 +(dp12409 +S'default_value' +p12410 +(dp12411 +S'editable' +p12412 +I00 +sS'value' +p12413 +NssS'summary_default' +p12414 +(dp12415 +S'editable' +p12416 +I01 +sS'value' +p12417 +S'none' +p12418 +sssS'description' +p12419 +(dp12420 +S'editable' +p12421 +I01 +sS'value' +p12422 +g47 +sssS'sg_status_list' +p12423 +(dp12424 +S'mandatory' +p12425 +(dp12426 +S'editable' +p12427 +I00 +sS'value' +p12428 +I00 +ssS'name' +p12429 +(dp12430 +S'editable' +p12431 +I01 +sS'value' +p12432 +S'Status' +p12433 +ssS'data_type' +p12434 +(dp12435 +S'editable' +p12436 +I00 +sS'value' +p12437 +S'status_list' +p12438 +ssS'entity_type' +p12439 +(dp12440 +S'editable' +p12441 +I00 +sS'value' +p12442 +S'AssetLibrary' +p12443 +ssS'editable' +p12444 +(dp12445 +S'editable' +p12446 +I00 +sS'value' +p12447 +I01 +ssS'unique' +p12448 +(dp12449 +S'editable' +p12450 +I00 +sS'value' +p12451 +I00 +ssS'properties' +p12452 +(dp12453 +S'default_value' +p12454 +(dp12455 +S'editable' +p12456 +I01 +sS'value' +p12457 +S'wtg' +p12458 +ssS'valid_values' +p12459 +(dp12460 +S'editable' +p12461 +I01 +sS'value' +p12462 +(lp12463 +S'cmpt' +p12464 +aS'ip' +p12465 +aS'wtg' +p12466 +assS'summary_default' +p12467 +(dp12468 +S'editable' +p12469 +I01 +sS'value' +p12470 +S'none' +p12471 +sssS'description' +p12472 +(dp12473 +S'editable' +p12474 +I01 +sS'value' +p12475 +g47 +sssS'notes' +p12476 +(dp12477 +S'mandatory' +p12478 +(dp12479 +S'editable' +p12480 +I00 +sS'value' +p12481 +I00 +ssS'name' +p12482 +(dp12483 +S'editable' +p12484 +I01 +sS'value' +p12485 +S'Notes' +p12486 +ssS'data_type' +p12487 +(dp12488 +S'editable' +p12489 +I00 +sS'value' +p12490 +S'multi_entity' +p12491 +ssS'entity_type' +p12492 +(dp12493 +S'editable' +p12494 +I00 +sS'value' +p12495 +S'AssetLibrary' +p12496 +ssS'editable' +p12497 +(dp12498 +S'editable' +p12499 +I00 +sS'value' +p12500 +I01 +ssS'unique' +p12501 +(dp12502 +S'editable' +p12503 +I00 +sS'value' +p12504 +I00 +ssS'properties' +p12505 +(dp12506 +S'default_value' +p12507 +(dp12508 +S'editable' +p12509 +I00 +sS'value' +p12510 +NssS'summary_default' +p12511 +(dp12512 +S'editable' +p12513 +I01 +sS'value' +p12514 +S'none' +p12515 +ssS'valid_types' +p12516 +(dp12517 +S'editable' +p12518 +I01 +sS'value' +p12519 +(lp12520 +S'Note' +p12521 +asssS'description' +p12522 +(dp12523 +S'editable' +p12524 +I01 +sS'value' +p12525 +g47 +sssS'image' +p12526 +(dp12527 +S'mandatory' +p12528 +(dp12529 +S'editable' +p12530 +I00 +sS'value' +p12531 +I00 +ssS'name' +p12532 +(dp12533 +S'editable' +p12534 +I01 +sS'value' +p12535 +S'Thumbnail' +p12536 +ssS'data_type' +p12537 +(dp12538 +S'editable' +p12539 +I00 +sS'value' +p12540 +S'image' +p12541 +ssS'entity_type' +p12542 +(dp12543 +S'editable' +p12544 +I00 +sS'value' +p12545 +S'AssetLibrary' +p12546 +ssS'editable' +p12547 +(dp12548 +S'editable' +p12549 +I00 +sS'value' +p12550 +I01 +ssS'unique' +p12551 +(dp12552 +S'editable' +p12553 +I00 +sS'value' +p12554 +I00 +ssS'properties' +p12555 +(dp12556 +S'default_value' +p12557 +(dp12558 +S'editable' +p12559 +I00 +sS'value' +p12560 +NssS'summary_default' +p12561 +(dp12562 +S'editable' +p12563 +I01 +sS'value' +p12564 +S'none' +p12565 +sssS'description' +p12566 +(dp12567 +S'editable' +p12568 +I01 +sS'value' +p12569 +g47 +sssS'cached_display_name' +p12570 +(dp12571 +S'mandatory' +p12572 +(dp12573 +S'editable' +p12574 +I00 +sS'value' +p12575 +I00 +ssS'name' +p12576 +(dp12577 +S'editable' +p12578 +I01 +sS'value' +p12579 +S'Cached Display Name' +p12580 +ssS'data_type' +p12581 +(dp12582 +S'editable' +p12583 +I00 +sS'value' +p12584 +S'text' +p12585 +ssS'entity_type' +p12586 +(dp12587 +S'editable' +p12588 +I00 +sS'value' +p12589 +S'AssetLibrary' +p12590 +ssS'editable' +p12591 +(dp12592 +S'editable' +p12593 +I00 +sS'value' +p12594 +I01 +ssS'unique' +p12595 +(dp12596 +S'editable' +p12597 +I00 +sS'value' +p12598 +I00 +ssS'properties' +p12599 +(dp12600 +S'default_value' +p12601 +(dp12602 +S'editable' +p12603 +I00 +sS'value' +p12604 +NssS'summary_default' +p12605 +(dp12606 +S'editable' +p12607 +I00 +sS'value' +p12608 +S'none' +p12609 +sssS'description' +p12610 +(dp12611 +S'editable' +p12612 +I01 +sS'value' +p12613 +g47 +sssS'tag_list' +p12614 +(dp12615 +S'mandatory' +p12616 +(dp12617 +S'editable' +p12618 +I00 +sS'value' +p12619 +I00 +ssS'name' +p12620 +(dp12621 +S'editable' +p12622 +I01 +sS'value' +p12623 +S'Tags' +p12624 +ssS'data_type' +p12625 +(dp12626 +S'editable' +p12627 +I00 +sS'value' +p12628 +S'tag_list' +p12629 +ssS'entity_type' +p12630 +(dp12631 +S'editable' +p12632 +I00 +sS'value' +p12633 +S'AssetLibrary' +p12634 +ssS'editable' +p12635 +(dp12636 +S'editable' +p12637 +I00 +sS'value' +p12638 +I01 +ssS'unique' +p12639 +(dp12640 +S'editable' +p12641 +I00 +sS'value' +p12642 +I00 +ssS'properties' +p12643 +(dp12644 +S'default_value' +p12645 +(dp12646 +S'editable' +p12647 +I00 +sS'value' +p12648 +NssS'summary_default' +p12649 +(dp12650 +S'editable' +p12651 +I01 +sS'value' +p12652 +S'none' +p12653 +ssS'valid_types' +p12654 +(dp12655 +S'editable' +p12656 +I01 +sS'value' +p12657 +(lp12658 +S'Tag' +p12659 +asssS'description' +p12660 +(dp12661 +S'editable' +p12662 +I01 +sS'value' +p12663 +g47 +sssS'id' +p12664 +(dp12665 +S'mandatory' +p12666 +(dp12667 +S'editable' +p12668 +I00 +sS'value' +p12669 +I00 +ssS'name' +p12670 +(dp12671 +S'editable' +p12672 +I01 +sS'value' +p12673 +S'Id' +p12674 +ssS'data_type' +p12675 +(dp12676 +S'editable' +p12677 +I00 +sS'value' +p12678 +S'number' +p12679 +ssS'entity_type' +p12680 +(dp12681 +S'editable' +p12682 +I00 +sS'value' +p12683 +S'AssetLibrary' +p12684 +ssS'editable' +p12685 +(dp12686 +S'editable' +p12687 +I00 +sS'value' +p12688 +I00 +ssS'unique' +p12689 +(dp12690 +S'editable' +p12691 +I00 +sS'value' +p12692 +I00 +ssS'properties' +p12693 +(dp12694 +S'default_value' +p12695 +(dp12696 +S'editable' +p12697 +I00 +sS'value' +p12698 +NssS'summary_default' +p12699 +(dp12700 +S'editable' +p12701 +I01 +sS'value' +p12702 +S'none' +p12703 +sssS'description' +p12704 +(dp12705 +S'editable' +p12706 +I01 +sS'value' +p12707 +g47 +sssS'updated_by' +p12708 +(dp12709 +S'mandatory' +p12710 +(dp12711 +S'editable' +p12712 +I00 +sS'value' +p12713 +I00 +ssS'name' +p12714 +(dp12715 +S'editable' +p12716 +I01 +sS'value' +p12717 +S'Updated by' +p12718 +ssS'data_type' +p12719 +(dp12720 +S'editable' +p12721 +I00 +sS'value' +p12722 +S'entity' +p12723 +ssS'entity_type' +p12724 +(dp12725 +S'editable' +p12726 +I00 +sS'value' +p12727 +S'AssetLibrary' +p12728 +ssS'editable' +p12729 +(dp12730 +S'editable' +p12731 +I00 +sS'value' +p12732 +I00 +ssS'unique' +p12733 +(dp12734 +S'editable' +p12735 +I00 +sS'value' +p12736 +I00 +ssS'properties' +p12737 +(dp12738 +S'default_value' +p12739 +(dp12740 +S'editable' +p12741 +I00 +sS'value' +p12742 +NssS'summary_default' +p12743 +(dp12744 +S'editable' +p12745 +I01 +sS'value' +p12746 +S'none' +p12747 +ssS'valid_types' +p12748 +(dp12749 +S'editable' +p12750 +I01 +sS'value' +p12751 +(lp12752 +S'HumanUser' +p12753 +aS'ApiUser' +p12754 +asssS'description' +p12755 +(dp12756 +S'editable' +p12757 +I01 +sS'value' +p12758 +g47 +ssssS'PerformerMocapTakeConnection' +p12759 +(dp12760 +S'mocap_take' +p12761 +(dp12762 +S'mandatory' +p12763 +(dp12764 +S'editable' +p12765 +I00 +sS'value' +p12766 +I00 +ssS'name' +p12767 +(dp12768 +S'editable' +p12769 +I01 +sS'value' +p12770 +S'Mocap Take' +p12771 +ssS'data_type' +p12772 +(dp12773 +S'editable' +p12774 +I00 +sS'value' +p12775 +S'entity' +p12776 +ssS'entity_type' +p12777 +(dp12778 +S'editable' +p12779 +I00 +sS'value' +p12780 +S'PerformerMocapTakeConnection' +p12781 +ssS'editable' +p12782 +(dp12783 +S'editable' +p12784 +I00 +sS'value' +p12785 +I00 +ssS'unique' +p12786 +(dp12787 +S'editable' +p12788 +I00 +sS'value' +p12789 +I00 +ssS'properties' +p12790 +(dp12791 +S'default_value' +p12792 +(dp12793 +S'editable' +p12794 +I00 +sS'value' +p12795 +NssS'summary_default' +p12796 +(dp12797 +S'editable' +p12798 +I00 +sS'value' +p12799 +S'none' +p12800 +ssS'valid_types' +p12801 +(dp12802 +S'editable' +p12803 +I00 +sS'value' +p12804 +(lp12805 +S'MocapTake' +p12806 +asssS'description' +p12807 +(dp12808 +S'editable' +p12809 +I01 +sS'value' +p12810 +g47 +sssS'cached_display_name' +p12811 +(dp12812 +S'mandatory' +p12813 +(dp12814 +S'editable' +p12815 +I00 +sS'value' +p12816 +I00 +ssS'name' +p12817 +(dp12818 +S'editable' +p12819 +I01 +sS'value' +p12820 +S'Cached Display Name' +p12821 +ssS'data_type' +p12822 +(dp12823 +S'editable' +p12824 +I00 +sS'value' +p12825 +S'text' +p12826 +ssS'entity_type' +p12827 +(dp12828 +S'editable' +p12829 +I00 +sS'value' +p12830 +S'PerformerMocapTakeConnection' +p12831 +ssS'editable' +p12832 +(dp12833 +S'editable' +p12834 +I00 +sS'value' +p12835 +I01 +ssS'unique' +p12836 +(dp12837 +S'editable' +p12838 +I00 +sS'value' +p12839 +I00 +ssS'properties' +p12840 +(dp12841 +S'default_value' +p12842 +(dp12843 +S'editable' +p12844 +I00 +sS'value' +p12845 +NssS'summary_default' +p12846 +(dp12847 +S'editable' +p12848 +I00 +sS'value' +p12849 +S'none' +p12850 +sssS'description' +p12851 +(dp12852 +S'editable' +p12853 +I01 +sS'value' +p12854 +g47 +sssS'performer' +p12855 +(dp12856 +S'mandatory' +p12857 +(dp12858 +S'editable' +p12859 +I00 +sS'value' +p12860 +I00 +ssS'name' +p12861 +(dp12862 +S'editable' +p12863 +I01 +sS'value' +p12864 +S'Performer' +p12865 +ssS'data_type' +p12866 +(dp12867 +S'editable' +p12868 +I00 +sS'value' +p12869 +S'entity' +p12870 +ssS'entity_type' +p12871 +(dp12872 +S'editable' +p12873 +I00 +sS'value' +p12874 +S'PerformerMocapTakeConnection' +p12875 +ssS'editable' +p12876 +(dp12877 +S'editable' +p12878 +I00 +sS'value' +p12879 +I00 +ssS'unique' +p12880 +(dp12881 +S'editable' +p12882 +I00 +sS'value' +p12883 +I00 +ssS'properties' +p12884 +(dp12885 +S'default_value' +p12886 +(dp12887 +S'editable' +p12888 +I00 +sS'value' +p12889 +NssS'summary_default' +p12890 +(dp12891 +S'editable' +p12892 +I00 +sS'value' +p12893 +S'none' +p12894 +ssS'valid_types' +p12895 +(dp12896 +S'editable' +p12897 +I00 +sS'value' +p12898 +(lp12899 +S'Performer' +p12900 +asssS'description' +p12901 +(dp12902 +S'editable' +p12903 +I01 +sS'value' +p12904 +g47 +sssS'id' +p12905 +(dp12906 +S'mandatory' +p12907 +(dp12908 +S'editable' +p12909 +I00 +sS'value' +p12910 +I01 +ssS'name' +p12911 +(dp12912 +S'editable' +p12913 +I01 +sS'value' +p12914 +S'Id' +p12915 +ssS'data_type' +p12916 +(dp12917 +S'editable' +p12918 +I00 +sS'value' +p12919 +S'number' +p12920 +ssS'entity_type' +p12921 +(dp12922 +S'editable' +p12923 +I00 +sS'value' +p12924 +S'PerformerMocapTakeConnection' +p12925 +ssS'editable' +p12926 +(dp12927 +S'editable' +p12928 +I00 +sS'value' +p12929 +I00 +ssS'unique' +p12930 +(dp12931 +S'editable' +p12932 +I00 +sS'value' +p12933 +I00 +ssS'properties' +p12934 +(dp12935 +S'default_value' +p12936 +(dp12937 +S'editable' +p12938 +I00 +sS'value' +p12939 +NssS'summary_default' +p12940 +(dp12941 +S'editable' +p12942 +I00 +sS'value' +p12943 +S'none' +p12944 +sssS'description' +p12945 +(dp12946 +S'editable' +p12947 +I01 +sS'value' +p12948 +g47 +ssssS'Phase' +p12949 +(dp12950 +S'open_notes_count' +p12951 +(dp12952 +S'mandatory' +p12953 +(dp12954 +S'editable' +p12955 +I00 +sS'value' +p12956 +I00 +ssS'name' +p12957 +(dp12958 +S'editable' +p12959 +I01 +sS'value' +p12960 +S'Open Notes Count' +p12961 +ssS'data_type' +p12962 +(dp12963 +S'editable' +p12964 +I00 +sS'value' +p12965 +S'text' +p12966 +ssS'entity_type' +p12967 +(dp12968 +S'editable' +p12969 +I00 +sS'value' +p12970 +S'Phase' +p12971 +ssS'editable' +p12972 +(dp12973 +S'editable' +p12974 +I00 +sS'value' +p12975 +I00 +ssS'unique' +p12976 +(dp12977 +S'editable' +p12978 +I00 +sS'value' +p12979 +I00 +ssS'properties' +p12980 +(dp12981 +S'default_value' +p12982 +(dp12983 +S'editable' +p12984 +I00 +sS'value' +p12985 +NssS'summary_default' +p12986 +(dp12987 +S'editable' +p12988 +I01 +sS'value' +p12989 +S'none' +p12990 +sssS'description' +p12991 +(dp12992 +S'editable' +p12993 +I01 +sS'value' +p12994 +g47 +sssS'code' +p12995 +(dp12996 +S'mandatory' +p12997 +(dp12998 +S'editable' +p12999 +I00 +sS'value' +p13000 +I01 +ssS'name' +p13001 +(dp13002 +S'editable' +p13003 +I01 +sS'value' +p13004 +S'Phase Name' +p13005 +ssS'data_type' +p13006 +(dp13007 +S'editable' +p13008 +I00 +sS'value' +p13009 +S'text' +p13010 +ssS'entity_type' +p13011 +(dp13012 +S'editable' +p13013 +I00 +sS'value' +p13014 +S'Phase' +p13015 +ssS'editable' +p13016 +(dp13017 +S'editable' +p13018 +I00 +sS'value' +p13019 +I01 +ssS'unique' +p13020 +(dp13021 +S'editable' +p13022 +I00 +sS'value' +p13023 +I00 +ssS'properties' +p13024 +(dp13025 +S'default_value' +p13026 +(dp13027 +S'editable' +p13028 +I00 +sS'value' +p13029 +NssS'summary_default' +p13030 +(dp13031 +S'editable' +p13032 +I01 +sS'value' +p13033 +S'none' +p13034 +sssS'description' +p13035 +(dp13036 +S'editable' +p13037 +I01 +sS'value' +p13038 +g47 +sssS'open_notes' +p13039 +(dp13040 +S'mandatory' +p13041 +(dp13042 +S'editable' +p13043 +I00 +sS'value' +p13044 +I00 +ssS'name' +p13045 +(dp13046 +S'editable' +p13047 +I01 +sS'value' +p13048 +S'Open Notes' +p13049 +ssS'data_type' +p13050 +(dp13051 +S'editable' +p13052 +I00 +sS'value' +p13053 +S'multi_entity' +p13054 +ssS'entity_type' +p13055 +(dp13056 +S'editable' +p13057 +I00 +sS'value' +p13058 +S'Phase' +p13059 +ssS'editable' +p13060 +(dp13061 +S'editable' +p13062 +I00 +sS'value' +p13063 +I00 +ssS'unique' +p13064 +(dp13065 +S'editable' +p13066 +I00 +sS'value' +p13067 +I00 +ssS'properties' +p13068 +(dp13069 +S'default_value' +p13070 +(dp13071 +S'editable' +p13072 +I00 +sS'value' +p13073 +NssS'summary_default' +p13074 +(dp13075 +S'editable' +p13076 +I01 +sS'value' +p13077 +S'none' +p13078 +ssS'valid_types' +p13079 +(dp13080 +S'editable' +p13081 +I01 +sS'value' +p13082 +(lp13083 +S'Note' +p13084 +asssS'description' +p13085 +(dp13086 +S'editable' +p13087 +I01 +sS'value' +p13088 +g47 +sssS'description' +p13089 +(dp13090 +S'mandatory' +p13091 +(dp13092 +S'editable' +p13093 +I00 +sS'value' +p13094 +I00 +ssS'name' +p13095 +(dp13096 +S'editable' +p13097 +I01 +sS'value' +p13098 +S'Description' +p13099 +ssS'data_type' +p13100 +(dp13101 +S'editable' +p13102 +I00 +sS'value' +p13103 +S'text' +p13104 +ssS'entity_type' +p13105 +(dp13106 +S'editable' +p13107 +I00 +sS'value' +p13108 +S'Phase' +p13109 +ssS'editable' +p13110 +(dp13111 +S'editable' +p13112 +I00 +sS'value' +p13113 +I01 +ssS'unique' +p13114 +(dp13115 +S'editable' +p13116 +I00 +sS'value' +p13117 +I00 +ssS'properties' +p13118 +(dp13119 +S'default_value' +p13120 +(dp13121 +S'editable' +p13122 +I00 +sS'value' +p13123 +NssS'summary_default' +p13124 +(dp13125 +S'editable' +p13126 +I01 +sS'value' +p13127 +S'none' +p13128 +sssS'description' +p13129 +(dp13130 +S'editable' +p13131 +I01 +sS'value' +p13132 +g47 +sssS'end_date' +p13133 +(dp13134 +S'mandatory' +p13135 +(dp13136 +S'editable' +p13137 +I00 +sS'value' +p13138 +I00 +ssS'name' +p13139 +(dp13140 +S'editable' +p13141 +I01 +sS'value' +p13142 +S'End Date' +p13143 +ssS'data_type' +p13144 +(dp13145 +S'editable' +p13146 +I00 +sS'value' +p13147 +S'date' +p13148 +ssS'entity_type' +p13149 +(dp13150 +S'editable' +p13151 +I00 +sS'value' +p13152 +S'Phase' +p13153 +ssS'editable' +p13154 +(dp13155 +S'editable' +p13156 +I00 +sS'value' +p13157 +I01 +ssS'unique' +p13158 +(dp13159 +S'editable' +p13160 +I00 +sS'value' +p13161 +I00 +ssS'properties' +p13162 +(dp13163 +S'default_value' +p13164 +(dp13165 +S'editable' +p13166 +I00 +sS'value' +p13167 +NssS'summary_default' +p13168 +(dp13169 +S'editable' +p13170 +I01 +sS'value' +p13171 +S'none' +p13172 +sssS'description' +p13173 +(dp13174 +S'editable' +p13175 +I01 +sS'value' +p13176 +g47 +sssS'color' +p13177 +(dp13178 +S'mandatory' +p13179 +(dp13180 +S'editable' +p13181 +I00 +sS'value' +p13182 +I00 +ssS'name' +p13183 +(dp13184 +S'editable' +p13185 +I01 +sS'value' +p13186 +S'Color' +p13187 +ssS'data_type' +p13188 +(dp13189 +S'editable' +p13190 +I00 +sS'value' +p13191 +S'color' +p13192 +ssS'entity_type' +p13193 +(dp13194 +S'editable' +p13195 +I00 +sS'value' +p13196 +S'Phase' +p13197 +ssS'editable' +p13198 +(dp13199 +S'editable' +p13200 +I00 +sS'value' +p13201 +I01 +ssS'unique' +p13202 +(dp13203 +S'editable' +p13204 +I00 +sS'value' +p13205 +I00 +ssS'properties' +p13206 +(dp13207 +S'default_value' +p13208 +(dp13209 +S'editable' +p13210 +I00 +sS'value' +p13211 +NssS'summary_default' +p13212 +(dp13213 +S'editable' +p13214 +I01 +sS'value' +p13215 +S'none' +p13216 +sssS'description' +p13217 +(dp13218 +S'editable' +p13219 +I01 +sS'value' +p13220 +g47 +sssS'created_at' +p13221 +(dp13222 +S'mandatory' +p13223 +(dp13224 +S'editable' +p13225 +I00 +sS'value' +p13226 +I00 +ssS'name' +p13227 +(dp13228 +S'editable' +p13229 +I01 +sS'value' +p13230 +S'Date Created' +p13231 +ssS'data_type' +p13232 +(dp13233 +S'editable' +p13234 +I00 +sS'value' +p13235 +S'date_time' +p13236 +ssS'entity_type' +p13237 +(dp13238 +S'editable' +p13239 +I00 +sS'value' +p13240 +S'Phase' +p13241 +ssS'editable' +p13242 +(dp13243 +S'editable' +p13244 +I00 +sS'value' +p13245 +I00 +ssS'unique' +p13246 +(dp13247 +S'editable' +p13248 +I00 +sS'value' +p13249 +I00 +ssS'properties' +p13250 +(dp13251 +S'default_value' +p13252 +(dp13253 +S'editable' +p13254 +I00 +sS'value' +p13255 +NssS'summary_default' +p13256 +(dp13257 +S'editable' +p13258 +I01 +sS'value' +p13259 +S'none' +p13260 +sssS'description' +p13261 +(dp13262 +S'editable' +p13263 +I01 +sS'value' +p13264 +g47 +sssS'updated_at' +p13265 +(dp13266 +S'mandatory' +p13267 +(dp13268 +S'editable' +p13269 +I00 +sS'value' +p13270 +I00 +ssS'name' +p13271 +(dp13272 +S'editable' +p13273 +I01 +sS'value' +p13274 +S'Date Updated' +p13275 +ssS'data_type' +p13276 +(dp13277 +S'editable' +p13278 +I00 +sS'value' +p13279 +S'date_time' +p13280 +ssS'entity_type' +p13281 +(dp13282 +S'editable' +p13283 +I00 +sS'value' +p13284 +S'Phase' +p13285 +ssS'editable' +p13286 +(dp13287 +S'editable' +p13288 +I00 +sS'value' +p13289 +I00 +ssS'unique' +p13290 +(dp13291 +S'editable' +p13292 +I00 +sS'value' +p13293 +I00 +ssS'properties' +p13294 +(dp13295 +S'default_value' +p13296 +(dp13297 +S'editable' +p13298 +I00 +sS'value' +p13299 +NssS'summary_default' +p13300 +(dp13301 +S'editable' +p13302 +I01 +sS'value' +p13303 +S'none' +p13304 +sssS'description' +p13305 +(dp13306 +S'editable' +p13307 +I01 +sS'value' +p13308 +g47 +sssS'created_by' +p13309 +(dp13310 +S'mandatory' +p13311 +(dp13312 +S'editable' +p13313 +I00 +sS'value' +p13314 +I00 +ssS'name' +p13315 +(dp13316 +S'editable' +p13317 +I01 +sS'value' +p13318 +S'Created by' +p13319 +ssS'data_type' +p13320 +(dp13321 +S'editable' +p13322 +I00 +sS'value' +p13323 +S'entity' +p13324 +ssS'entity_type' +p13325 +(dp13326 +S'editable' +p13327 +I00 +sS'value' +p13328 +S'Phase' +p13329 +ssS'editable' +p13330 +(dp13331 +S'editable' +p13332 +I00 +sS'value' +p13333 +I00 +ssS'unique' +p13334 +(dp13335 +S'editable' +p13336 +I00 +sS'value' +p13337 +I00 +ssS'properties' +p13338 +(dp13339 +S'default_value' +p13340 +(dp13341 +S'editable' +p13342 +I00 +sS'value' +p13343 +NssS'summary_default' +p13344 +(dp13345 +S'editable' +p13346 +I01 +sS'value' +p13347 +S'none' +p13348 +ssS'valid_types' +p13349 +(dp13350 +S'editable' +p13351 +I01 +sS'value' +p13352 +(lp13353 +S'HumanUser' +p13354 +aS'ApiUser' +p13355 +asssS'description' +p13356 +(dp13357 +S'editable' +p13358 +I01 +sS'value' +p13359 +g47 +sssS'start_date' +p13360 +(dp13361 +S'mandatory' +p13362 +(dp13363 +S'editable' +p13364 +I00 +sS'value' +p13365 +I00 +ssS'name' +p13366 +(dp13367 +S'editable' +p13368 +I01 +sS'value' +p13369 +S'Start Date' +p13370 +ssS'data_type' +p13371 +(dp13372 +S'editable' +p13373 +I00 +sS'value' +p13374 +S'date' +p13375 +ssS'entity_type' +p13376 +(dp13377 +S'editable' +p13378 +I00 +sS'value' +p13379 +S'Phase' +p13380 +ssS'editable' +p13381 +(dp13382 +S'editable' +p13383 +I00 +sS'value' +p13384 +I01 +ssS'unique' +p13385 +(dp13386 +S'editable' +p13387 +I00 +sS'value' +p13388 +I00 +ssS'properties' +p13389 +(dp13390 +S'default_value' +p13391 +(dp13392 +S'editable' +p13393 +I00 +sS'value' +p13394 +NssS'summary_default' +p13395 +(dp13396 +S'editable' +p13397 +I01 +sS'value' +p13398 +S'none' +p13399 +sssS'description' +p13400 +(dp13401 +S'editable' +p13402 +I01 +sS'value' +p13403 +g47 +sssS'project' +p13404 +(dp13405 +S'mandatory' +p13406 +(dp13407 +S'editable' +p13408 +I00 +sS'value' +p13409 +I00 +ssS'name' +p13410 +(dp13411 +S'editable' +p13412 +I01 +sS'value' +p13413 +S'Project' +p13414 +ssS'data_type' +p13415 +(dp13416 +S'editable' +p13417 +I00 +sS'value' +p13418 +S'entity' +p13419 +ssS'entity_type' +p13420 +(dp13421 +S'editable' +p13422 +I00 +sS'value' +p13423 +S'Phase' +p13424 +ssS'editable' +p13425 +(dp13426 +S'editable' +p13427 +I00 +sS'value' +p13428 +I01 +ssS'unique' +p13429 +(dp13430 +S'editable' +p13431 +I00 +sS'value' +p13432 +I00 +ssS'properties' +p13433 +(dp13434 +S'default_value' +p13435 +(dp13436 +S'editable' +p13437 +I00 +sS'value' +p13438 +NssS'summary_default' +p13439 +(dp13440 +S'editable' +p13441 +I01 +sS'value' +p13442 +S'none' +p13443 +ssS'valid_types' +p13444 +(dp13445 +S'editable' +p13446 +I01 +sS'value' +p13447 +(lp13448 +S'Project' +p13449 +asssS'description' +p13450 +(dp13451 +S'editable' +p13452 +I01 +sS'value' +p13453 +g47 +sssS'notes' +p13454 +(dp13455 +S'mandatory' +p13456 +(dp13457 +S'editable' +p13458 +I00 +sS'value' +p13459 +I00 +ssS'name' +p13460 +(dp13461 +S'editable' +p13462 +I01 +sS'value' +p13463 +S'Notes' +p13464 +ssS'data_type' +p13465 +(dp13466 +S'editable' +p13467 +I00 +sS'value' +p13468 +S'multi_entity' +p13469 +ssS'entity_type' +p13470 +(dp13471 +S'editable' +p13472 +I00 +sS'value' +p13473 +S'Phase' +p13474 +ssS'editable' +p13475 +(dp13476 +S'editable' +p13477 +I00 +sS'value' +p13478 +I01 +ssS'unique' +p13479 +(dp13480 +S'editable' +p13481 +I00 +sS'value' +p13482 +I00 +ssS'properties' +p13483 +(dp13484 +S'default_value' +p13485 +(dp13486 +S'editable' +p13487 +I00 +sS'value' +p13488 +NssS'summary_default' +p13489 +(dp13490 +S'editable' +p13491 +I01 +sS'value' +p13492 +S'none' +p13493 +ssS'valid_types' +p13494 +(dp13495 +S'editable' +p13496 +I01 +sS'value' +p13497 +(lp13498 +S'Note' +p13499 +asssS'description' +p13500 +(dp13501 +S'editable' +p13502 +I01 +sS'value' +p13503 +g47 +sssS'milestone' +p13504 +(dp13505 +S'mandatory' +p13506 +(dp13507 +S'editable' +p13508 +I00 +sS'value' +p13509 +I00 +ssS'name' +p13510 +(dp13511 +S'editable' +p13512 +I01 +sS'value' +p13513 +S'Milestone' +p13514 +ssS'data_type' +p13515 +(dp13516 +S'editable' +p13517 +I00 +sS'value' +p13518 +S'checkbox' +p13519 +ssS'entity_type' +p13520 +(dp13521 +S'editable' +p13522 +I00 +sS'value' +p13523 +S'Phase' +p13524 +ssS'editable' +p13525 +(dp13526 +S'editable' +p13527 +I00 +sS'value' +p13528 +I01 +ssS'unique' +p13529 +(dp13530 +S'editable' +p13531 +I00 +sS'value' +p13532 +I00 +ssS'properties' +p13533 +(dp13534 +S'default_value' +p13535 +(dp13536 +S'editable' +p13537 +I00 +sS'value' +p13538 +NssS'summary_default' +p13539 +(dp13540 +S'editable' +p13541 +I01 +sS'value' +p13542 +S'none' +p13543 +sssS'description' +p13544 +(dp13545 +S'editable' +p13546 +I01 +sS'value' +p13547 +g47 +sssS'cached_display_name' +p13548 +(dp13549 +S'mandatory' +p13550 +(dp13551 +S'editable' +p13552 +I00 +sS'value' +p13553 +I00 +ssS'name' +p13554 +(dp13555 +S'editable' +p13556 +I01 +sS'value' +p13557 +S'Cached Display Name' +p13558 +ssS'data_type' +p13559 +(dp13560 +S'editable' +p13561 +I00 +sS'value' +p13562 +S'text' +p13563 +ssS'entity_type' +p13564 +(dp13565 +S'editable' +p13566 +I00 +sS'value' +p13567 +S'Phase' +p13568 +ssS'editable' +p13569 +(dp13570 +S'editable' +p13571 +I00 +sS'value' +p13572 +I01 +ssS'unique' +p13573 +(dp13574 +S'editable' +p13575 +I00 +sS'value' +p13576 +I00 +ssS'properties' +p13577 +(dp13578 +S'default_value' +p13579 +(dp13580 +S'editable' +p13581 +I00 +sS'value' +p13582 +NssS'summary_default' +p13583 +(dp13584 +S'editable' +p13585 +I00 +sS'value' +p13586 +S'none' +p13587 +sssS'description' +p13588 +(dp13589 +S'editable' +p13590 +I01 +sS'value' +p13591 +g47 +sssS'id' +p13592 +(dp13593 +S'mandatory' +p13594 +(dp13595 +S'editable' +p13596 +I00 +sS'value' +p13597 +I00 +ssS'name' +p13598 +(dp13599 +S'editable' +p13600 +I01 +sS'value' +p13601 +S'Id' +p13602 +ssS'data_type' +p13603 +(dp13604 +S'editable' +p13605 +I00 +sS'value' +p13606 +S'number' +p13607 +ssS'entity_type' +p13608 +(dp13609 +S'editable' +p13610 +I00 +sS'value' +p13611 +S'Phase' +p13612 +ssS'editable' +p13613 +(dp13614 +S'editable' +p13615 +I00 +sS'value' +p13616 +I00 +ssS'unique' +p13617 +(dp13618 +S'editable' +p13619 +I00 +sS'value' +p13620 +I00 +ssS'properties' +p13621 +(dp13622 +S'default_value' +p13623 +(dp13624 +S'editable' +p13625 +I00 +sS'value' +p13626 +NssS'summary_default' +p13627 +(dp13628 +S'editable' +p13629 +I01 +sS'value' +p13630 +S'none' +p13631 +sssS'description' +p13632 +(dp13633 +S'editable' +p13634 +I01 +sS'value' +p13635 +g47 +sssS'updated_by' +p13636 +(dp13637 +S'mandatory' +p13638 +(dp13639 +S'editable' +p13640 +I00 +sS'value' +p13641 +I00 +ssS'name' +p13642 +(dp13643 +S'editable' +p13644 +I01 +sS'value' +p13645 +S'Updated by' +p13646 +ssS'data_type' +p13647 +(dp13648 +S'editable' +p13649 +I00 +sS'value' +p13650 +S'entity' +p13651 +ssS'entity_type' +p13652 +(dp13653 +S'editable' +p13654 +I00 +sS'value' +p13655 +S'Phase' +p13656 +ssS'editable' +p13657 +(dp13658 +S'editable' +p13659 +I00 +sS'value' +p13660 +I00 +ssS'unique' +p13661 +(dp13662 +S'editable' +p13663 +I00 +sS'value' +p13664 +I00 +ssS'properties' +p13665 +(dp13666 +S'default_value' +p13667 +(dp13668 +S'editable' +p13669 +I00 +sS'value' +p13670 +NssS'summary_default' +p13671 +(dp13672 +S'editable' +p13673 +I01 +sS'value' +p13674 +S'none' +p13675 +ssS'valid_types' +p13676 +(dp13677 +S'editable' +p13678 +I01 +sS'value' +p13679 +(lp13680 +S'HumanUser' +p13681 +aS'ApiUser' +p13682 +asssS'description' +p13683 +(dp13684 +S'editable' +p13685 +I01 +sS'value' +p13686 +g47 +ssssS'PublishedFile' +p13687 +(dp13688 +S'open_notes_count' +p13689 +(dp13690 +S'mandatory' +p13691 +(dp13692 +S'editable' +p13693 +I00 +sS'value' +p13694 +I00 +ssS'name' +p13695 +(dp13696 +S'editable' +p13697 +I01 +sS'value' +p13698 +S'Open Notes Count' +p13699 +ssS'data_type' +p13700 +(dp13701 +S'editable' +p13702 +I00 +sS'value' +p13703 +S'text' +p13704 +ssS'entity_type' +p13705 +(dp13706 +S'editable' +p13707 +I00 +sS'value' +p13708 +S'PublishedFile' +p13709 +ssS'editable' +p13710 +(dp13711 +S'editable' +p13712 +I00 +sS'value' +p13713 +I00 +ssS'unique' +p13714 +(dp13715 +S'editable' +p13716 +I00 +sS'value' +p13717 +I00 +ssS'properties' +p13718 +(dp13719 +S'default_value' +p13720 +(dp13721 +S'editable' +p13722 +I00 +sS'value' +p13723 +NssS'summary_default' +p13724 +(dp13725 +S'editable' +p13726 +I01 +sS'value' +p13727 +S'none' +p13728 +sssS'description' +p13729 +(dp13730 +S'editable' +p13731 +I01 +sS'value' +p13732 +g47 +sssS'code' +p13733 +(dp13734 +S'mandatory' +p13735 +(dp13736 +S'editable' +p13737 +I00 +sS'value' +p13738 +I01 +ssS'name' +p13739 +(dp13740 +S'editable' +p13741 +I01 +sS'value' +p13742 +S'Published File Name' +p13743 +ssS'data_type' +p13744 +(dp13745 +S'editable' +p13746 +I00 +sS'value' +p13747 +S'text' +p13748 +ssS'entity_type' +p13749 +(dp13750 +S'editable' +p13751 +I00 +sS'value' +p13752 +S'PublishedFile' +p13753 +ssS'editable' +p13754 +(dp13755 +S'editable' +p13756 +I00 +sS'value' +p13757 +I01 +ssS'unique' +p13758 +(dp13759 +S'editable' +p13760 +I00 +sS'value' +p13761 +I00 +ssS'properties' +p13762 +(dp13763 +S'default_value' +p13764 +(dp13765 +S'editable' +p13766 +I00 +sS'value' +p13767 +NssS'summary_default' +p13768 +(dp13769 +S'editable' +p13770 +I01 +sS'value' +p13771 +S'none' +p13772 +sssS'description' +p13773 +(dp13774 +S'editable' +p13775 +I01 +sS'value' +p13776 +g47 +sssS'image' +p13777 +(dp13778 +S'mandatory' +p13779 +(dp13780 +S'editable' +p13781 +I00 +sS'value' +p13782 +I00 +ssS'name' +p13783 +(dp13784 +S'editable' +p13785 +I01 +sS'value' +p13786 +S'Thumbnail' +p13787 +ssS'data_type' +p13788 +(dp13789 +S'editable' +p13790 +I00 +sS'value' +p13791 +S'image' +p13792 +ssS'entity_type' +p13793 +(dp13794 +S'editable' +p13795 +I00 +sS'value' +p13796 +S'PublishedFile' +p13797 +ssS'editable' +p13798 +(dp13799 +S'editable' +p13800 +I00 +sS'value' +p13801 +I01 +ssS'unique' +p13802 +(dp13803 +S'editable' +p13804 +I00 +sS'value' +p13805 +I00 +ssS'properties' +p13806 +(dp13807 +S'default_value' +p13808 +(dp13809 +S'editable' +p13810 +I00 +sS'value' +p13811 +NssS'summary_default' +p13812 +(dp13813 +S'editable' +p13814 +I01 +sS'value' +p13815 +S'none' +p13816 +sssS'description' +p13817 +(dp13818 +S'editable' +p13819 +I01 +sS'value' +p13820 +g47 +sssS'updated_at' +p13821 +(dp13822 +S'mandatory' +p13823 +(dp13824 +S'editable' +p13825 +I00 +sS'value' +p13826 +I00 +ssS'name' +p13827 +(dp13828 +S'editable' +p13829 +I01 +sS'value' +p13830 +S'Date Updated' +p13831 +ssS'data_type' +p13832 +(dp13833 +S'editable' +p13834 +I00 +sS'value' +p13835 +S'date_time' +p13836 +ssS'entity_type' +p13837 +(dp13838 +S'editable' +p13839 +I00 +sS'value' +p13840 +S'PublishedFile' +p13841 +ssS'editable' +p13842 +(dp13843 +S'editable' +p13844 +I00 +sS'value' +p13845 +I00 +ssS'unique' +p13846 +(dp13847 +S'editable' +p13848 +I00 +sS'value' +p13849 +I00 +ssS'properties' +p13850 +(dp13851 +S'default_value' +p13852 +(dp13853 +S'editable' +p13854 +I00 +sS'value' +p13855 +NssS'summary_default' +p13856 +(dp13857 +S'editable' +p13858 +I01 +sS'value' +p13859 +S'none' +p13860 +sssS'description' +p13861 +(dp13862 +S'editable' +p13863 +I01 +sS'value' +p13864 +g47 +sssS'entity' +p13865 +(dp13866 +S'mandatory' +p13867 +(dp13868 +S'editable' +p13869 +I00 +sS'value' +p13870 +I00 +ssS'name' +p13871 +(dp13872 +S'editable' +p13873 +I01 +sS'value' +p13874 +S'Link' +p13875 +ssS'data_type' +p13876 +(dp13877 +S'editable' +p13878 +I00 +sS'value' +p13879 +S'entity' +p13880 +ssS'entity_type' +p13881 +(dp13882 +S'editable' +p13883 +I00 +sS'value' +p13884 +S'PublishedFile' +p13885 +ssS'editable' +p13886 +(dp13887 +S'editable' +p13888 +I00 +sS'value' +p13889 +I01 +ssS'unique' +p13890 +(dp13891 +S'editable' +p13892 +I00 +sS'value' +p13893 +I00 +ssS'properties' +p13894 +(dp13895 +S'default_value' +p13896 +(dp13897 +S'editable' +p13898 +I00 +sS'value' +p13899 +NssS'summary_default' +p13900 +(dp13901 +S'editable' +p13902 +I01 +sS'value' +p13903 +S'none' +p13904 +ssS'valid_types' +p13905 +(dp13906 +S'editable' +p13907 +I01 +sS'value' +p13908 +(lp13909 +S'Asset' +p13910 +aS'Shot' +p13911 +aS'Project' +p13912 +asssS'description' +p13913 +(dp13914 +S'editable' +p13915 +I01 +sS'value' +p13916 +g47 +sssS'cached_display_name' +p13917 +(dp13918 +S'mandatory' +p13919 +(dp13920 +S'editable' +p13921 +I00 +sS'value' +p13922 +I00 +ssS'name' +p13923 +(dp13924 +S'editable' +p13925 +I01 +sS'value' +p13926 +S'Cached Display Name' +p13927 +ssS'data_type' +p13928 +(dp13929 +S'editable' +p13930 +I00 +sS'value' +p13931 +S'text' +p13932 +ssS'entity_type' +p13933 +(dp13934 +S'editable' +p13935 +I00 +sS'value' +p13936 +S'PublishedFile' +p13937 +ssS'editable' +p13938 +(dp13939 +S'editable' +p13940 +I00 +sS'value' +p13941 +I01 +ssS'unique' +p13942 +(dp13943 +S'editable' +p13944 +I00 +sS'value' +p13945 +I00 +ssS'properties' +p13946 +(dp13947 +S'default_value' +p13948 +(dp13949 +S'editable' +p13950 +I00 +sS'value' +p13951 +NssS'summary_default' +p13952 +(dp13953 +S'editable' +p13954 +I00 +sS'value' +p13955 +S'none' +p13956 +sssS'description' +p13957 +(dp13958 +S'editable' +p13959 +I01 +sS'value' +p13960 +g47 +sssS'path_cache' +p13961 +(dp13962 +S'mandatory' +p13963 +(dp13964 +S'editable' +p13965 +I00 +sS'value' +p13966 +I00 +ssS'name' +p13967 +(dp13968 +S'editable' +p13969 +I01 +sS'value' +p13970 +S'Path Cache' +p13971 +ssS'data_type' +p13972 +(dp13973 +S'editable' +p13974 +I00 +sS'value' +p13975 +S'text' +p13976 +ssS'entity_type' +p13977 +(dp13978 +S'editable' +p13979 +I00 +sS'value' +p13980 +S'PublishedFile' +p13981 +ssS'editable' +p13982 +(dp13983 +S'editable' +p13984 +I00 +sS'value' +p13985 +I01 +ssS'unique' +p13986 +(dp13987 +S'editable' +p13988 +I00 +sS'value' +p13989 +I00 +ssS'properties' +p13990 +(dp13991 +S'default_value' +p13992 +(dp13993 +S'editable' +p13994 +I00 +sS'value' +p13995 +NssS'summary_default' +p13996 +(dp13997 +S'editable' +p13998 +I01 +sS'value' +p13999 +S'none' +p14000 +sssS'description' +p14001 +(dp14002 +S'editable' +p14003 +I01 +sS'value' +p14004 +g47 +sssS'id' +p14005 +(dp14006 +S'mandatory' +p14007 +(dp14008 +S'editable' +p14009 +I00 +sS'value' +p14010 +I00 +ssS'name' +p14011 +(dp14012 +S'editable' +p14013 +I01 +sS'value' +p14014 +S'Id' +p14015 +ssS'data_type' +p14016 +(dp14017 +S'editable' +p14018 +I00 +sS'value' +p14019 +S'number' +p14020 +ssS'entity_type' +p14021 +(dp14022 +S'editable' +p14023 +I00 +sS'value' +p14024 +S'PublishedFile' +p14025 +ssS'editable' +p14026 +(dp14027 +S'editable' +p14028 +I00 +sS'value' +p14029 +I00 +ssS'unique' +p14030 +(dp14031 +S'editable' +p14032 +I00 +sS'value' +p14033 +I00 +ssS'properties' +p14034 +(dp14035 +S'default_value' +p14036 +(dp14037 +S'editable' +p14038 +I00 +sS'value' +p14039 +NssS'summary_default' +p14040 +(dp14041 +S'editable' +p14042 +I01 +sS'value' +p14043 +S'none' +p14044 +sssS'description' +p14045 +(dp14046 +S'editable' +p14047 +I01 +sS'value' +p14048 +g47 +sssS'updated_by' +p14049 +(dp14050 +S'mandatory' +p14051 +(dp14052 +S'editable' +p14053 +I00 +sS'value' +p14054 +I00 +ssS'name' +p14055 +(dp14056 +S'editable' +p14057 +I01 +sS'value' +p14058 +S'Updated by' +p14059 +ssS'data_type' +p14060 +(dp14061 +S'editable' +p14062 +I00 +sS'value' +p14063 +S'entity' +p14064 +ssS'entity_type' +p14065 +(dp14066 +S'editable' +p14067 +I00 +sS'value' +p14068 +S'PublishedFile' +p14069 +ssS'editable' +p14070 +(dp14071 +S'editable' +p14072 +I00 +sS'value' +p14073 +I00 +ssS'unique' +p14074 +(dp14075 +S'editable' +p14076 +I00 +sS'value' +p14077 +I00 +ssS'properties' +p14078 +(dp14079 +S'default_value' +p14080 +(dp14081 +S'editable' +p14082 +I00 +sS'value' +p14083 +NssS'summary_default' +p14084 +(dp14085 +S'editable' +p14086 +I01 +sS'value' +p14087 +S'none' +p14088 +ssS'valid_types' +p14089 +(dp14090 +S'editable' +p14091 +I01 +sS'value' +p14092 +(lp14093 +S'HumanUser' +p14094 +aS'ApiUser' +p14095 +asssS'description' +p14096 +(dp14097 +S'editable' +p14098 +I01 +sS'value' +p14099 +g47 +sssS'open_notes' +p14100 +(dp14101 +S'mandatory' +p14102 +(dp14103 +S'editable' +p14104 +I00 +sS'value' +p14105 +I00 +ssS'name' +p14106 +(dp14107 +S'editable' +p14108 +I01 +sS'value' +p14109 +S'Open Notes' +p14110 +ssS'data_type' +p14111 +(dp14112 +S'editable' +p14113 +I00 +sS'value' +p14114 +S'multi_entity' +p14115 +ssS'entity_type' +p14116 +(dp14117 +S'editable' +p14118 +I00 +sS'value' +p14119 +S'PublishedFile' +p14120 +ssS'editable' +p14121 +(dp14122 +S'editable' +p14123 +I00 +sS'value' +p14124 +I00 +ssS'unique' +p14125 +(dp14126 +S'editable' +p14127 +I00 +sS'value' +p14128 +I00 +ssS'properties' +p14129 +(dp14130 +S'default_value' +p14131 +(dp14132 +S'editable' +p14133 +I00 +sS'value' +p14134 +NssS'summary_default' +p14135 +(dp14136 +S'editable' +p14137 +I01 +sS'value' +p14138 +S'none' +p14139 +ssS'valid_types' +p14140 +(dp14141 +S'editable' +p14142 +I01 +sS'value' +p14143 +(lp14144 +S'Note' +p14145 +asssS'description' +p14146 +(dp14147 +S'editable' +p14148 +I01 +sS'value' +p14149 +g47 +sssS'created_by' +p14150 +(dp14151 +S'mandatory' +p14152 +(dp14153 +S'editable' +p14154 +I00 +sS'value' +p14155 +I00 +ssS'name' +p14156 +(dp14157 +S'editable' +p14158 +I01 +sS'value' +p14159 +S'Created by' +p14160 +ssS'data_type' +p14161 +(dp14162 +S'editable' +p14163 +I00 +sS'value' +p14164 +S'entity' +p14165 +ssS'entity_type' +p14166 +(dp14167 +S'editable' +p14168 +I00 +sS'value' +p14169 +S'PublishedFile' +p14170 +ssS'editable' +p14171 +(dp14172 +S'editable' +p14173 +I00 +sS'value' +p14174 +I00 +ssS'unique' +p14175 +(dp14176 +S'editable' +p14177 +I00 +sS'value' +p14178 +I00 +ssS'properties' +p14179 +(dp14180 +S'default_value' +p14181 +(dp14182 +S'editable' +p14183 +I00 +sS'value' +p14184 +NssS'summary_default' +p14185 +(dp14186 +S'editable' +p14187 +I01 +sS'value' +p14188 +S'none' +p14189 +ssS'valid_types' +p14190 +(dp14191 +S'editable' +p14192 +I01 +sS'value' +p14193 +(lp14194 +S'HumanUser' +p14195 +aS'ApiUser' +p14196 +asssS'description' +p14197 +(dp14198 +S'editable' +p14199 +I01 +sS'value' +p14200 +g47 +sssS'version' +p14201 +(dp14202 +S'mandatory' +p14203 +(dp14204 +S'editable' +p14205 +I00 +sS'value' +p14206 +I00 +ssS'name' +p14207 +(dp14208 +S'editable' +p14209 +I01 +sS'value' +p14210 +S'Version' +p14211 +ssS'data_type' +p14212 +(dp14213 +S'editable' +p14214 +I00 +sS'value' +p14215 +S'entity' +p14216 +ssS'entity_type' +p14217 +(dp14218 +S'editable' +p14219 +I00 +sS'value' +p14220 +S'PublishedFile' +p14221 +ssS'editable' +p14222 +(dp14223 +S'editable' +p14224 +I00 +sS'value' +p14225 +I01 +ssS'unique' +p14226 +(dp14227 +S'editable' +p14228 +I00 +sS'value' +p14229 +I00 +ssS'properties' +p14230 +(dp14231 +S'default_value' +p14232 +(dp14233 +S'editable' +p14234 +I00 +sS'value' +p14235 +NssS'summary_default' +p14236 +(dp14237 +S'editable' +p14238 +I01 +sS'value' +p14239 +S'none' +p14240 +ssS'valid_types' +p14241 +(dp14242 +S'editable' +p14243 +I01 +sS'value' +p14244 +(lp14245 +S'Version' +p14246 +asssS'description' +p14247 +(dp14248 +S'editable' +p14249 +I01 +sS'value' +p14250 +g47 +sssS'upstream_published_files' +p14251 +(dp14252 +S'mandatory' +p14253 +(dp14254 +S'editable' +p14255 +I00 +sS'value' +p14256 +I00 +ssS'name' +p14257 +(dp14258 +S'editable' +p14259 +I01 +sS'value' +p14260 +S'Upstream Published Files' +p14261 +ssS'data_type' +p14262 +(dp14263 +S'editable' +p14264 +I00 +sS'value' +p14265 +S'multi_entity' +p14266 +ssS'entity_type' +p14267 +(dp14268 +S'editable' +p14269 +I00 +sS'value' +p14270 +S'PublishedFile' +p14271 +ssS'editable' +p14272 +(dp14273 +S'editable' +p14274 +I00 +sS'value' +p14275 +I01 +ssS'unique' +p14276 +(dp14277 +S'editable' +p14278 +I00 +sS'value' +p14279 +I00 +ssS'properties' +p14280 +(dp14281 +S'default_value' +p14282 +(dp14283 +S'editable' +p14284 +I00 +sS'value' +p14285 +NssS'summary_default' +p14286 +(dp14287 +S'editable' +p14288 +I00 +sS'value' +p14289 +S'none' +p14290 +ssS'valid_types' +p14291 +(dp14292 +S'editable' +p14293 +I00 +sS'value' +p14294 +(lp14295 +S'PublishedFile' +p14296 +asssS'description' +p14297 +(dp14298 +S'editable' +p14299 +I01 +sS'value' +p14300 +g47 +sssS'sg_status_list' +p14301 +(dp14302 +S'mandatory' +p14303 +(dp14304 +S'editable' +p14305 +I00 +sS'value' +p14306 +I00 +ssS'name' +p14307 +(dp14308 +S'editable' +p14309 +I01 +sS'value' +p14310 +S'Status' +p14311 +ssS'data_type' +p14312 +(dp14313 +S'editable' +p14314 +I00 +sS'value' +p14315 +S'status_list' +p14316 +ssS'entity_type' +p14317 +(dp14318 +S'editable' +p14319 +I00 +sS'value' +p14320 +S'PublishedFile' +p14321 +ssS'editable' +p14322 +(dp14323 +S'editable' +p14324 +I00 +sS'value' +p14325 +I01 +ssS'unique' +p14326 +(dp14327 +S'editable' +p14328 +I00 +sS'value' +p14329 +I00 +ssS'properties' +p14330 +(dp14331 +S'default_value' +p14332 +(dp14333 +S'editable' +p14334 +I01 +sS'value' +p14335 +S'wtg' +p14336 +ssS'valid_values' +p14337 +(dp14338 +S'editable' +p14339 +I01 +sS'value' +p14340 +(lp14341 +S'wtg' +p14342 +aS'ip' +p14343 +aS'cmpt' +p14344 +assS'summary_default' +p14345 +(dp14346 +S'editable' +p14347 +I01 +sS'value' +p14348 +S'none' +p14349 +sssS'description' +p14350 +(dp14351 +S'editable' +p14352 +I01 +sS'value' +p14353 +g47 +sssS'description' +p14354 +(dp14355 +S'mandatory' +p14356 +(dp14357 +S'editable' +p14358 +I00 +sS'value' +p14359 +I00 +ssS'name' +p14360 +(dp14361 +S'editable' +p14362 +I01 +sS'value' +p14363 +S'Description' +p14364 +ssS'data_type' +p14365 +(dp14366 +S'editable' +p14367 +I00 +sS'value' +p14368 +S'text' +p14369 +ssS'entity_type' +p14370 +(dp14371 +S'editable' +p14372 +I00 +sS'value' +p14373 +S'PublishedFile' +p14374 +ssS'editable' +p14375 +(dp14376 +S'editable' +p14377 +I00 +sS'value' +p14378 +I01 +ssS'unique' +p14379 +(dp14380 +S'editable' +p14381 +I00 +sS'value' +p14382 +I00 +ssS'properties' +p14383 +(dp14384 +S'default_value' +p14385 +(dp14386 +S'editable' +p14387 +I00 +sS'value' +p14388 +NssS'summary_default' +p14389 +(dp14390 +S'editable' +p14391 +I01 +sS'value' +p14392 +S'none' +p14393 +sssS'description' +p14394 +(dp14395 +S'editable' +p14396 +I01 +sS'value' +p14397 +g47 +sssS'path_cache_storage' +p14398 +(dp14399 +S'mandatory' +p14400 +(dp14401 +S'editable' +p14402 +I00 +sS'value' +p14403 +I00 +ssS'name' +p14404 +(dp14405 +S'editable' +p14406 +I01 +sS'value' +p14407 +S'Path Cache Storage' +p14408 +ssS'data_type' +p14409 +(dp14410 +S'editable' +p14411 +I00 +sS'value' +p14412 +S'entity' +p14413 +ssS'entity_type' +p14414 +(dp14415 +S'editable' +p14416 +I00 +sS'value' +p14417 +S'PublishedFile' +p14418 +ssS'editable' +p14419 +(dp14420 +S'editable' +p14421 +I00 +sS'value' +p14422 +I01 +ssS'unique' +p14423 +(dp14424 +S'editable' +p14425 +I00 +sS'value' +p14426 +I00 +ssS'properties' +p14427 +(dp14428 +S'default_value' +p14429 +(dp14430 +S'editable' +p14431 +I00 +sS'value' +p14432 +NssS'summary_default' +p14433 +(dp14434 +S'editable' +p14435 +I01 +sS'value' +p14436 +S'none' +p14437 +ssS'valid_types' +p14438 +(dp14439 +S'editable' +p14440 +I01 +sS'value' +p14441 +(lp14442 +S'LocalStorage' +p14443 +asssS'description' +p14444 +(dp14445 +S'editable' +p14446 +I01 +sS'value' +p14447 +g47 +sssS'downstream_published_files' +p14448 +(dp14449 +S'mandatory' +p14450 +(dp14451 +S'editable' +p14452 +I00 +sS'value' +p14453 +I00 +ssS'name' +p14454 +(dp14455 +S'editable' +p14456 +I01 +sS'value' +p14457 +S'Downstream Published Files' +p14458 +ssS'data_type' +p14459 +(dp14460 +S'editable' +p14461 +I00 +sS'value' +p14462 +S'multi_entity' +p14463 +ssS'entity_type' +p14464 +(dp14465 +S'editable' +p14466 +I00 +sS'value' +p14467 +S'PublishedFile' +p14468 +ssS'editable' +p14469 +(dp14470 +S'editable' +p14471 +I00 +sS'value' +p14472 +I01 +ssS'unique' +p14473 +(dp14474 +S'editable' +p14475 +I00 +sS'value' +p14476 +I00 +ssS'properties' +p14477 +(dp14478 +S'default_value' +p14479 +(dp14480 +S'editable' +p14481 +I00 +sS'value' +p14482 +NssS'summary_default' +p14483 +(dp14484 +S'editable' +p14485 +I00 +sS'value' +p14486 +S'none' +p14487 +ssS'valid_types' +p14488 +(dp14489 +S'editable' +p14490 +I00 +sS'value' +p14491 +(lp14492 +S'PublishedFile' +p14493 +asssS'description' +p14494 +(dp14495 +S'editable' +p14496 +I01 +sS'value' +p14497 +g47 +sssS'path' +p14498 +(dp14499 +S'mandatory' +p14500 +(dp14501 +S'editable' +p14502 +I00 +sS'value' +p14503 +I00 +ssS'name' +p14504 +(dp14505 +S'editable' +p14506 +I01 +sS'value' +p14507 +S'Path' +p14508 +ssS'data_type' +p14509 +(dp14510 +S'editable' +p14511 +I00 +sS'value' +p14512 +S'url' +p14513 +ssS'entity_type' +p14514 +(dp14515 +S'editable' +p14516 +I00 +sS'value' +p14517 +S'PublishedFile' +p14518 +ssS'editable' +p14519 +(dp14520 +S'editable' +p14521 +I00 +sS'value' +p14522 +I01 +ssS'unique' +p14523 +(dp14524 +S'editable' +p14525 +I00 +sS'value' +p14526 +I00 +ssS'properties' +p14527 +(dp14528 +S'default_value' +p14529 +(dp14530 +S'editable' +p14531 +I00 +sS'value' +p14532 +NssS'open_in_new_window' +p14533 +(dp14534 +S'editable' +p14535 +I01 +sS'value' +p14536 +I01 +ssS'summary_default' +p14537 +(dp14538 +S'editable' +p14539 +I01 +sS'value' +p14540 +S'none' +p14541 +sssS'description' +p14542 +(dp14543 +S'editable' +p14544 +I01 +sS'value' +p14545 +g47 +sssS'version_number' +p14546 +(dp14547 +S'mandatory' +p14548 +(dp14549 +S'editable' +p14550 +I00 +sS'value' +p14551 +I00 +ssS'name' +p14552 +(dp14553 +S'editable' +p14554 +I01 +sS'value' +p14555 +S'Version Number' +p14556 +ssS'data_type' +p14557 +(dp14558 +S'editable' +p14559 +I00 +sS'value' +p14560 +S'number' +p14561 +ssS'entity_type' +p14562 +(dp14563 +S'editable' +p14564 +I00 +sS'value' +p14565 +S'PublishedFile' +p14566 +ssS'editable' +p14567 +(dp14568 +S'editable' +p14569 +I00 +sS'value' +p14570 +I01 +ssS'unique' +p14571 +(dp14572 +S'editable' +p14573 +I00 +sS'value' +p14574 +I00 +ssS'properties' +p14575 +(dp14576 +S'default_value' +p14577 +(dp14578 +S'editable' +p14579 +I00 +sS'value' +p14580 +NssS'summary_default' +p14581 +(dp14582 +S'editable' +p14583 +I01 +sS'value' +p14584 +S'none' +p14585 +sssS'description' +p14586 +(dp14587 +S'editable' +p14588 +I01 +sS'value' +p14589 +g47 +sssS'task' +p14590 +(dp14591 +S'mandatory' +p14592 +(dp14593 +S'editable' +p14594 +I00 +sS'value' +p14595 +I00 +ssS'name' +p14596 +(dp14597 +S'editable' +p14598 +I01 +sS'value' +p14599 +S'Task' +p14600 +ssS'data_type' +p14601 +(dp14602 +S'editable' +p14603 +I00 +sS'value' +p14604 +S'entity' +p14605 +ssS'entity_type' +p14606 +(dp14607 +S'editable' +p14608 +I00 +sS'value' +p14609 +S'PublishedFile' +p14610 +ssS'editable' +p14611 +(dp14612 +S'editable' +p14613 +I00 +sS'value' +p14614 +I01 +ssS'unique' +p14615 +(dp14616 +S'editable' +p14617 +I00 +sS'value' +p14618 +I00 +ssS'properties' +p14619 +(dp14620 +S'default_value' +p14621 +(dp14622 +S'editable' +p14623 +I00 +sS'value' +p14624 +NssS'summary_default' +p14625 +(dp14626 +S'editable' +p14627 +I01 +sS'value' +p14628 +S'none' +p14629 +ssS'valid_types' +p14630 +(dp14631 +S'editable' +p14632 +I01 +sS'value' +p14633 +(lp14634 +S'Task' +p14635 +asssS'description' +p14636 +(dp14637 +S'editable' +p14638 +I01 +sS'value' +p14639 +g47 +sssS'name' +p14640 +(dp14641 +S'mandatory' +p14642 +(dp14643 +S'editable' +p14644 +I00 +sS'value' +p14645 +I00 +ssS'name' +p14646 +(dp14647 +S'editable' +p14648 +I01 +sS'value' +p14649 +S'Name' +p14650 +ssS'data_type' +p14651 +(dp14652 +S'editable' +p14653 +I00 +sS'value' +p14654 +S'text' +p14655 +ssS'entity_type' +p14656 +(dp14657 +S'editable' +p14658 +I00 +sS'value' +p14659 +S'PublishedFile' +p14660 +ssS'editable' +p14661 +(dp14662 +S'editable' +p14663 +I00 +sS'value' +p14664 +I01 +ssS'unique' +p14665 +(dp14666 +S'editable' +p14667 +I00 +sS'value' +p14668 +I00 +ssS'properties' +p14669 +(dp14670 +S'default_value' +p14671 +(dp14672 +S'editable' +p14673 +I00 +sS'value' +p14674 +NssS'summary_default' +p14675 +(dp14676 +S'editable' +p14677 +I01 +sS'value' +p14678 +S'none' +p14679 +sssS'description' +p14680 +(dp14681 +S'editable' +p14682 +I01 +sS'value' +p14683 +g47 +sssS'created_at' +p14684 +(dp14685 +S'mandatory' +p14686 +(dp14687 +S'editable' +p14688 +I00 +sS'value' +p14689 +I00 +ssS'name' +p14690 +(dp14691 +S'editable' +p14692 +I01 +sS'value' +p14693 +S'Date Created' +p14694 +ssS'data_type' +p14695 +(dp14696 +S'editable' +p14697 +I00 +sS'value' +p14698 +S'date_time' +p14699 +ssS'entity_type' +p14700 +(dp14701 +S'editable' +p14702 +I00 +sS'value' +p14703 +S'PublishedFile' +p14704 +ssS'editable' +p14705 +(dp14706 +S'editable' +p14707 +I00 +sS'value' +p14708 +I00 +ssS'unique' +p14709 +(dp14710 +S'editable' +p14711 +I00 +sS'value' +p14712 +I00 +ssS'properties' +p14713 +(dp14714 +S'default_value' +p14715 +(dp14716 +S'editable' +p14717 +I00 +sS'value' +p14718 +NssS'summary_default' +p14719 +(dp14720 +S'editable' +p14721 +I01 +sS'value' +p14722 +S'none' +p14723 +sssS'description' +p14724 +(dp14725 +S'editable' +p14726 +I01 +sS'value' +p14727 +g47 +sssS'published_file_type' +p14728 +(dp14729 +S'mandatory' +p14730 +(dp14731 +S'editable' +p14732 +I00 +sS'value' +p14733 +I00 +ssS'name' +p14734 +(dp14735 +S'editable' +p14736 +I01 +sS'value' +p14737 +S'Published File Type' +p14738 +ssS'data_type' +p14739 +(dp14740 +S'editable' +p14741 +I00 +sS'value' +p14742 +S'entity' +p14743 +ssS'entity_type' +p14744 +(dp14745 +S'editable' +p14746 +I00 +sS'value' +p14747 +S'PublishedFile' +p14748 +ssS'editable' +p14749 +(dp14750 +S'editable' +p14751 +I00 +sS'value' +p14752 +I01 +ssS'unique' +p14753 +(dp14754 +S'editable' +p14755 +I00 +sS'value' +p14756 +I00 +ssS'properties' +p14757 +(dp14758 +S'default_value' +p14759 +(dp14760 +S'editable' +p14761 +I00 +sS'value' +p14762 +NssS'summary_default' +p14763 +(dp14764 +S'editable' +p14765 +I01 +sS'value' +p14766 +S'none' +p14767 +ssS'valid_types' +p14768 +(dp14769 +S'editable' +p14770 +I01 +sS'value' +p14771 +(lp14772 +S'PublishedFileType' +p14773 +asssS'description' +p14774 +(dp14775 +S'editable' +p14776 +I01 +sS'value' +p14777 +g47 +sssS'project' +p14778 +(dp14779 +S'mandatory' +p14780 +(dp14781 +S'editable' +p14782 +I00 +sS'value' +p14783 +I00 +ssS'name' +p14784 +(dp14785 +S'editable' +p14786 +I01 +sS'value' +p14787 +S'Project' +p14788 +ssS'data_type' +p14789 +(dp14790 +S'editable' +p14791 +I00 +sS'value' +p14792 +S'entity' +p14793 +ssS'entity_type' +p14794 +(dp14795 +S'editable' +p14796 +I00 +sS'value' +p14797 +S'PublishedFile' +p14798 +ssS'editable' +p14799 +(dp14800 +S'editable' +p14801 +I00 +sS'value' +p14802 +I01 +ssS'unique' +p14803 +(dp14804 +S'editable' +p14805 +I00 +sS'value' +p14806 +I00 +ssS'properties' +p14807 +(dp14808 +S'default_value' +p14809 +(dp14810 +S'editable' +p14811 +I00 +sS'value' +p14812 +NssS'summary_default' +p14813 +(dp14814 +S'editable' +p14815 +I01 +sS'value' +p14816 +S'none' +p14817 +ssS'valid_types' +p14818 +(dp14819 +S'editable' +p14820 +I01 +sS'value' +p14821 +(lp14822 +S'Project' +p14823 +asssS'description' +p14824 +(dp14825 +S'editable' +p14826 +I01 +sS'value' +p14827 +g47 +sssS'tag_list' +p14828 +(dp14829 +S'mandatory' +p14830 +(dp14831 +S'editable' +p14832 +I00 +sS'value' +p14833 +I00 +ssS'name' +p14834 +(dp14835 +S'editable' +p14836 +I01 +sS'value' +p14837 +S'Tags' +p14838 +ssS'data_type' +p14839 +(dp14840 +S'editable' +p14841 +I00 +sS'value' +p14842 +S'tag_list' +p14843 +ssS'entity_type' +p14844 +(dp14845 +S'editable' +p14846 +I00 +sS'value' +p14847 +S'PublishedFile' +p14848 +ssS'editable' +p14849 +(dp14850 +S'editable' +p14851 +I00 +sS'value' +p14852 +I01 +ssS'unique' +p14853 +(dp14854 +S'editable' +p14855 +I00 +sS'value' +p14856 +I00 +ssS'properties' +p14857 +(dp14858 +S'default_value' +p14859 +(dp14860 +S'editable' +p14861 +I00 +sS'value' +p14862 +NssS'summary_default' +p14863 +(dp14864 +S'editable' +p14865 +I01 +sS'value' +p14866 +S'none' +p14867 +ssS'valid_types' +p14868 +(dp14869 +S'editable' +p14870 +I01 +sS'value' +p14871 +(lp14872 +S'Tag' +p14873 +asssS'description' +p14874 +(dp14875 +S'editable' +p14876 +I01 +sS'value' +p14877 +g47 +sssS'notes' +p14878 +(dp14879 +S'mandatory' +p14880 +(dp14881 +S'editable' +p14882 +I00 +sS'value' +p14883 +I00 +ssS'name' +p14884 +(dp14885 +S'editable' +p14886 +I01 +sS'value' +p14887 +S'Notes' +p14888 +ssS'data_type' +p14889 +(dp14890 +S'editable' +p14891 +I00 +sS'value' +p14892 +S'multi_entity' +p14893 +ssS'entity_type' +p14894 +(dp14895 +S'editable' +p14896 +I00 +sS'value' +p14897 +S'PublishedFile' +p14898 +ssS'editable' +p14899 +(dp14900 +S'editable' +p14901 +I00 +sS'value' +p14902 +I01 +ssS'unique' +p14903 +(dp14904 +S'editable' +p14905 +I00 +sS'value' +p14906 +I00 +ssS'properties' +p14907 +(dp14908 +S'default_value' +p14909 +(dp14910 +S'editable' +p14911 +I00 +sS'value' +p14912 +NssS'summary_default' +p14913 +(dp14914 +S'editable' +p14915 +I01 +sS'value' +p14916 +S'none' +p14917 +ssS'valid_types' +p14918 +(dp14919 +S'editable' +p14920 +I01 +sS'value' +p14921 +(lp14922 +S'Note' +p14923 +asssS'description' +p14924 +(dp14925 +S'editable' +p14926 +I01 +sS'value' +p14927 +g47 +ssssS'ShootDaySceneConnection' +p14928 +(dp14929 +S'cached_display_name' +p14930 +(dp14931 +S'mandatory' +p14932 +(dp14933 +S'editable' +p14934 +I00 +sS'value' +p14935 +I00 +ssS'name' +p14936 +(dp14937 +S'editable' +p14938 +I01 +sS'value' +p14939 +S'Cached Display Name' +p14940 +ssS'data_type' +p14941 +(dp14942 +S'editable' +p14943 +I00 +sS'value' +p14944 +S'text' +p14945 +ssS'entity_type' +p14946 +(dp14947 +S'editable' +p14948 +I00 +sS'value' +p14949 +S'ShootDaySceneConnection' +p14950 +ssS'editable' +p14951 +(dp14952 +S'editable' +p14953 +I00 +sS'value' +p14954 +I01 +ssS'unique' +p14955 +(dp14956 +S'editable' +p14957 +I00 +sS'value' +p14958 +I00 +ssS'properties' +p14959 +(dp14960 +S'default_value' +p14961 +(dp14962 +S'editable' +p14963 +I00 +sS'value' +p14964 +NssS'summary_default' +p14965 +(dp14966 +S'editable' +p14967 +I00 +sS'value' +p14968 +S'none' +p14969 +sssS'description' +p14970 +(dp14971 +S'editable' +p14972 +I01 +sS'value' +p14973 +g47 +sssS'scene' +p14974 +(dp14975 +S'mandatory' +p14976 +(dp14977 +S'editable' +p14978 +I00 +sS'value' +p14979 +I00 +ssS'name' +p14980 +(dp14981 +S'editable' +p14982 +I01 +sS'value' +p14983 +S'Scene' +p14984 +ssS'data_type' +p14985 +(dp14986 +S'editable' +p14987 +I00 +sS'value' +p14988 +S'entity' +p14989 +ssS'entity_type' +p14990 +(dp14991 +S'editable' +p14992 +I00 +sS'value' +p14993 +S'ShootDaySceneConnection' +p14994 +ssS'editable' +p14995 +(dp14996 +S'editable' +p14997 +I00 +sS'value' +p14998 +I00 +ssS'unique' +p14999 +(dp15000 +S'editable' +p15001 +I00 +sS'value' +p15002 +I00 +ssS'properties' +p15003 +(dp15004 +S'default_value' +p15005 +(dp15006 +S'editable' +p15007 +I00 +sS'value' +p15008 +NssS'summary_default' +p15009 +(dp15010 +S'editable' +p15011 +I00 +sS'value' +p15012 +S'none' +p15013 +ssS'valid_types' +p15014 +(dp15015 +S'editable' +p15016 +I00 +sS'value' +p15017 +(lp15018 +S'Scene' +p15019 +asssS'description' +p15020 +(dp15021 +S'editable' +p15022 +I01 +sS'value' +p15023 +g47 +sssS'id' +p15024 +(dp15025 +S'mandatory' +p15026 +(dp15027 +S'editable' +p15028 +I00 +sS'value' +p15029 +I01 +ssS'name' +p15030 +(dp15031 +S'editable' +p15032 +I01 +sS'value' +p15033 +S'Id' +p15034 +ssS'data_type' +p15035 +(dp15036 +S'editable' +p15037 +I00 +sS'value' +p15038 +S'number' +p15039 +ssS'entity_type' +p15040 +(dp15041 +S'editable' +p15042 +I00 +sS'value' +p15043 +S'ShootDaySceneConnection' +p15044 +ssS'editable' +p15045 +(dp15046 +S'editable' +p15047 +I00 +sS'value' +p15048 +I00 +ssS'unique' +p15049 +(dp15050 +S'editable' +p15051 +I00 +sS'value' +p15052 +I00 +ssS'properties' +p15053 +(dp15054 +S'default_value' +p15055 +(dp15056 +S'editable' +p15057 +I00 +sS'value' +p15058 +NssS'summary_default' +p15059 +(dp15060 +S'editable' +p15061 +I00 +sS'value' +p15062 +S'none' +p15063 +sssS'description' +p15064 +(dp15065 +S'editable' +p15066 +I01 +sS'value' +p15067 +g47 +sssS'shoot_day' +p15068 +(dp15069 +S'mandatory' +p15070 +(dp15071 +S'editable' +p15072 +I00 +sS'value' +p15073 +I00 +ssS'name' +p15074 +(dp15075 +S'editable' +p15076 +I01 +sS'value' +p15077 +S'Shoot Day' +p15078 +ssS'data_type' +p15079 +(dp15080 +S'editable' +p15081 +I00 +sS'value' +p15082 +S'entity' +p15083 +ssS'entity_type' +p15084 +(dp15085 +S'editable' +p15086 +I00 +sS'value' +p15087 +S'ShootDaySceneConnection' +p15088 +ssS'editable' +p15089 +(dp15090 +S'editable' +p15091 +I00 +sS'value' +p15092 +I00 +ssS'unique' +p15093 +(dp15094 +S'editable' +p15095 +I00 +sS'value' +p15096 +I00 +ssS'properties' +p15097 +(dp15098 +S'default_value' +p15099 +(dp15100 +S'editable' +p15101 +I00 +sS'value' +p15102 +NssS'summary_default' +p15103 +(dp15104 +S'editable' +p15105 +I00 +sS'value' +p15106 +S'none' +p15107 +ssS'valid_types' +p15108 +(dp15109 +S'editable' +p15110 +I00 +sS'value' +p15111 +(lp15112 +S'ShootDay' +p15113 +asssS'description' +p15114 +(dp15115 +S'editable' +p15116 +I01 +sS'value' +p15117 +g47 +ssssS'AssetShotConnection' +p15118 +(dp15119 +S'cached_display_name' +p15120 +(dp15121 +S'mandatory' +p15122 +(dp15123 +S'editable' +p15124 +I00 +sS'value' +p15125 +I00 +ssS'name' +p15126 +(dp15127 +S'editable' +p15128 +I01 +sS'value' +p15129 +S'Cached Display Name' +p15130 +ssS'data_type' +p15131 +(dp15132 +S'editable' +p15133 +I00 +sS'value' +p15134 +S'text' +p15135 +ssS'entity_type' +p15136 +(dp15137 +S'editable' +p15138 +I00 +sS'value' +p15139 +S'AssetShotConnection' +p15140 +ssS'editable' +p15141 +(dp15142 +S'editable' +p15143 +I00 +sS'value' +p15144 +I01 +ssS'unique' +p15145 +(dp15146 +S'editable' +p15147 +I00 +sS'value' +p15148 +I00 +ssS'properties' +p15149 +(dp15150 +S'default_value' +p15151 +(dp15152 +S'editable' +p15153 +I00 +sS'value' +p15154 +NssS'summary_default' +p15155 +(dp15156 +S'editable' +p15157 +I00 +sS'value' +p15158 +S'none' +p15159 +sssS'description' +p15160 +(dp15161 +S'editable' +p15162 +I01 +sS'value' +p15163 +g47 +sssS'shot' +p15164 +(dp15165 +S'mandatory' +p15166 +(dp15167 +S'editable' +p15168 +I00 +sS'value' +p15169 +I00 +ssS'name' +p15170 +(dp15171 +S'editable' +p15172 +I01 +sS'value' +p15173 +S'Shot' +p15174 +ssS'data_type' +p15175 +(dp15176 +S'editable' +p15177 +I00 +sS'value' +p15178 +S'entity' +p15179 +ssS'entity_type' +p15180 +(dp15181 +S'editable' +p15182 +I00 +sS'value' +p15183 +S'AssetShotConnection' +p15184 +ssS'editable' +p15185 +(dp15186 +S'editable' +p15187 +I00 +sS'value' +p15188 +I00 +ssS'unique' +p15189 +(dp15190 +S'editable' +p15191 +I00 +sS'value' +p15192 +I00 +ssS'properties' +p15193 +(dp15194 +S'default_value' +p15195 +(dp15196 +S'editable' +p15197 +I00 +sS'value' +p15198 +NssS'summary_default' +p15199 +(dp15200 +S'editable' +p15201 +I00 +sS'value' +p15202 +S'none' +p15203 +ssS'valid_types' +p15204 +(dp15205 +S'editable' +p15206 +I00 +sS'value' +p15207 +(lp15208 +S'Shot' +p15209 +asssS'description' +p15210 +(dp15211 +S'editable' +p15212 +I01 +sS'value' +p15213 +g47 +sssS'asset' +p15214 +(dp15215 +S'mandatory' +p15216 +(dp15217 +S'editable' +p15218 +I00 +sS'value' +p15219 +I00 +ssS'name' +p15220 +(dp15221 +S'editable' +p15222 +I01 +sS'value' +p15223 +S'Asset' +p15224 +ssS'data_type' +p15225 +(dp15226 +S'editable' +p15227 +I00 +sS'value' +p15228 +S'entity' +p15229 +ssS'entity_type' +p15230 +(dp15231 +S'editable' +p15232 +I00 +sS'value' +p15233 +S'AssetShotConnection' +p15234 +ssS'editable' +p15235 +(dp15236 +S'editable' +p15237 +I00 +sS'value' +p15238 +I00 +ssS'unique' +p15239 +(dp15240 +S'editable' +p15241 +I00 +sS'value' +p15242 +I00 +ssS'properties' +p15243 +(dp15244 +S'default_value' +p15245 +(dp15246 +S'editable' +p15247 +I00 +sS'value' +p15248 +NssS'summary_default' +p15249 +(dp15250 +S'editable' +p15251 +I00 +sS'value' +p15252 +S'none' +p15253 +ssS'valid_types' +p15254 +(dp15255 +S'editable' +p15256 +I00 +sS'value' +p15257 +(lp15258 +S'Asset' +p15259 +asssS'description' +p15260 +(dp15261 +S'editable' +p15262 +I01 +sS'value' +p15263 +g47 +sssS'id' +p15264 +(dp15265 +S'mandatory' +p15266 +(dp15267 +S'editable' +p15268 +I00 +sS'value' +p15269 +I01 +ssS'name' +p15270 +(dp15271 +S'editable' +p15272 +I01 +sS'value' +p15273 +S'Id' +p15274 +ssS'data_type' +p15275 +(dp15276 +S'editable' +p15277 +I00 +sS'value' +p15278 +S'number' +p15279 +ssS'entity_type' +p15280 +(dp15281 +S'editable' +p15282 +I00 +sS'value' +p15283 +S'AssetShotConnection' +p15284 +ssS'editable' +p15285 +(dp15286 +S'editable' +p15287 +I00 +sS'value' +p15288 +I00 +ssS'unique' +p15289 +(dp15290 +S'editable' +p15291 +I00 +sS'value' +p15292 +I00 +ssS'properties' +p15293 +(dp15294 +S'default_value' +p15295 +(dp15296 +S'editable' +p15297 +I00 +sS'value' +p15298 +NssS'summary_default' +p15299 +(dp15300 +S'editable' +p15301 +I00 +sS'value' +p15302 +S'none' +p15303 +sssS'description' +p15304 +(dp15305 +S'editable' +p15306 +I01 +sS'value' +p15307 +g47 +ssssS'TicketTicketConnection' +p15308 +(dp15309 +S'dest_ticket' +p15310 +(dp15311 +S'mandatory' +p15312 +(dp15313 +S'editable' +p15314 +I00 +sS'value' +p15315 +I00 +ssS'name' +p15316 +(dp15317 +S'editable' +p15318 +I01 +sS'value' +p15319 +S'Ticket' +p15320 +ssS'data_type' +p15321 +(dp15322 +S'editable' +p15323 +I00 +sS'value' +p15324 +S'entity' +p15325 +ssS'entity_type' +p15326 +(dp15327 +S'editable' +p15328 +I00 +sS'value' +p15329 +S'TicketTicketConnection' +p15330 +ssS'editable' +p15331 +(dp15332 +S'editable' +p15333 +I00 +sS'value' +p15334 +I00 +ssS'unique' +p15335 +(dp15336 +S'editable' +p15337 +I00 +sS'value' +p15338 +I00 +ssS'properties' +p15339 +(dp15340 +S'default_value' +p15341 +(dp15342 +S'editable' +p15343 +I00 +sS'value' +p15344 +NssS'summary_default' +p15345 +(dp15346 +S'editable' +p15347 +I00 +sS'value' +p15348 +S'none' +p15349 +ssS'valid_types' +p15350 +(dp15351 +S'editable' +p15352 +I00 +sS'value' +p15353 +(lp15354 +S'Ticket' +p15355 +asssS'description' +p15356 +(dp15357 +S'editable' +p15358 +I01 +sS'value' +p15359 +g47 +sssS'cached_display_name' +p15360 +(dp15361 +S'mandatory' +p15362 +(dp15363 +S'editable' +p15364 +I00 +sS'value' +p15365 +I00 +ssS'name' +p15366 +(dp15367 +S'editable' +p15368 +I01 +sS'value' +p15369 +S'Cached Display Name' +p15370 +ssS'data_type' +p15371 +(dp15372 +S'editable' +p15373 +I00 +sS'value' +p15374 +S'text' +p15375 +ssS'entity_type' +p15376 +(dp15377 +S'editable' +p15378 +I00 +sS'value' +p15379 +S'TicketTicketConnection' +p15380 +ssS'editable' +p15381 +(dp15382 +S'editable' +p15383 +I00 +sS'value' +p15384 +I01 +ssS'unique' +p15385 +(dp15386 +S'editable' +p15387 +I00 +sS'value' +p15388 +I00 +ssS'properties' +p15389 +(dp15390 +S'default_value' +p15391 +(dp15392 +S'editable' +p15393 +I00 +sS'value' +p15394 +NssS'summary_default' +p15395 +(dp15396 +S'editable' +p15397 +I00 +sS'value' +p15398 +S'none' +p15399 +sssS'description' +p15400 +(dp15401 +S'editable' +p15402 +I01 +sS'value' +p15403 +g47 +sssS'source_ticket' +p15404 +(dp15405 +S'mandatory' +p15406 +(dp15407 +S'editable' +p15408 +I00 +sS'value' +p15409 +I00 +ssS'name' +p15410 +(dp15411 +S'editable' +p15412 +I01 +sS'value' +p15413 +S'Ticket' +p15414 +ssS'data_type' +p15415 +(dp15416 +S'editable' +p15417 +I00 +sS'value' +p15418 +S'entity' +p15419 +ssS'entity_type' +p15420 +(dp15421 +S'editable' +p15422 +I00 +sS'value' +p15423 +S'TicketTicketConnection' +p15424 +ssS'editable' +p15425 +(dp15426 +S'editable' +p15427 +I00 +sS'value' +p15428 +I00 +ssS'unique' +p15429 +(dp15430 +S'editable' +p15431 +I00 +sS'value' +p15432 +I00 +ssS'properties' +p15433 +(dp15434 +S'default_value' +p15435 +(dp15436 +S'editable' +p15437 +I00 +sS'value' +p15438 +NssS'summary_default' +p15439 +(dp15440 +S'editable' +p15441 +I00 +sS'value' +p15442 +S'none' +p15443 +ssS'valid_types' +p15444 +(dp15445 +S'editable' +p15446 +I00 +sS'value' +p15447 +(lp15448 +S'Ticket' +p15449 +asssS'description' +p15450 +(dp15451 +S'editable' +p15452 +I01 +sS'value' +p15453 +g47 +sssS'id' +p15454 +(dp15455 +S'mandatory' +p15456 +(dp15457 +S'editable' +p15458 +I00 +sS'value' +p15459 +I01 +ssS'name' +p15460 +(dp15461 +S'editable' +p15462 +I01 +sS'value' +p15463 +S'Id' +p15464 +ssS'data_type' +p15465 +(dp15466 +S'editable' +p15467 +I00 +sS'value' +p15468 +S'number' +p15469 +ssS'entity_type' +p15470 +(dp15471 +S'editable' +p15472 +I00 +sS'value' +p15473 +S'TicketTicketConnection' +p15474 +ssS'editable' +p15475 +(dp15476 +S'editable' +p15477 +I00 +sS'value' +p15478 +I00 +ssS'unique' +p15479 +(dp15480 +S'editable' +p15481 +I00 +sS'value' +p15482 +I00 +ssS'properties' +p15483 +(dp15484 +S'default_value' +p15485 +(dp15486 +S'editable' +p15487 +I00 +sS'value' +p15488 +NssS'summary_default' +p15489 +(dp15490 +S'editable' +p15491 +I00 +sS'value' +p15492 +S'none' +p15493 +sssS'description' +p15494 +(dp15495 +S'editable' +p15496 +I01 +sS'value' +p15497 +g47 +ssssS'AssetBlendshapeConnection' +p15498 +(dp15499 +S'cached_display_name' +p15500 +(dp15501 +S'mandatory' +p15502 +(dp15503 +S'editable' +p15504 +I00 +sS'value' +p15505 +I00 +ssS'name' +p15506 +(dp15507 +S'editable' +p15508 +I01 +sS'value' +p15509 +S'Cached Display Name' +p15510 +ssS'data_type' +p15511 +(dp15512 +S'editable' +p15513 +I00 +sS'value' +p15514 +S'text' +p15515 +ssS'entity_type' +p15516 +(dp15517 +S'editable' +p15518 +I00 +sS'value' +p15519 +S'AssetBlendshapeConnection' +p15520 +ssS'editable' +p15521 +(dp15522 +S'editable' +p15523 +I00 +sS'value' +p15524 +I01 +ssS'unique' +p15525 +(dp15526 +S'editable' +p15527 +I00 +sS'value' +p15528 +I00 +ssS'properties' +p15529 +(dp15530 +S'default_value' +p15531 +(dp15532 +S'editable' +p15533 +I00 +sS'value' +p15534 +NssS'summary_default' +p15535 +(dp15536 +S'editable' +p15537 +I00 +sS'value' +p15538 +S'none' +p15539 +sssS'description' +p15540 +(dp15541 +S'editable' +p15542 +I01 +sS'value' +p15543 +g47 +sssS'asset' +p15544 +(dp15545 +S'mandatory' +p15546 +(dp15547 +S'editable' +p15548 +I00 +sS'value' +p15549 +I00 +ssS'name' +p15550 +(dp15551 +S'editable' +p15552 +I01 +sS'value' +p15553 +S'Asset' +p15554 +ssS'data_type' +p15555 +(dp15556 +S'editable' +p15557 +I00 +sS'value' +p15558 +S'entity' +p15559 +ssS'entity_type' +p15560 +(dp15561 +S'editable' +p15562 +I00 +sS'value' +p15563 +S'AssetBlendshapeConnection' +p15564 +ssS'editable' +p15565 +(dp15566 +S'editable' +p15567 +I00 +sS'value' +p15568 +I00 +ssS'unique' +p15569 +(dp15570 +S'editable' +p15571 +I00 +sS'value' +p15572 +I00 +ssS'properties' +p15573 +(dp15574 +S'default_value' +p15575 +(dp15576 +S'editable' +p15577 +I00 +sS'value' +p15578 +NssS'summary_default' +p15579 +(dp15580 +S'editable' +p15581 +I00 +sS'value' +p15582 +S'none' +p15583 +ssS'valid_types' +p15584 +(dp15585 +S'editable' +p15586 +I00 +sS'value' +p15587 +(lp15588 +S'Asset' +p15589 +asssS'description' +p15590 +(dp15591 +S'editable' +p15592 +I01 +sS'value' +p15593 +g47 +sssS'blendshape' +p15594 +(dp15595 +S'mandatory' +p15596 +(dp15597 +S'editable' +p15598 +I00 +sS'value' +p15599 +I00 +ssS'name' +p15600 +(dp15601 +S'editable' +p15602 +I01 +sS'value' +p15603 +S'Blendshape' +p15604 +ssS'data_type' +p15605 +(dp15606 +S'editable' +p15607 +I00 +sS'value' +p15608 +S'entity' +p15609 +ssS'entity_type' +p15610 +(dp15611 +S'editable' +p15612 +I00 +sS'value' +p15613 +S'AssetBlendshapeConnection' +p15614 +ssS'editable' +p15615 +(dp15616 +S'editable' +p15617 +I00 +sS'value' +p15618 +I00 +ssS'unique' +p15619 +(dp15620 +S'editable' +p15621 +I00 +sS'value' +p15622 +I00 +ssS'properties' +p15623 +(dp15624 +S'default_value' +p15625 +(dp15626 +S'editable' +p15627 +I00 +sS'value' +p15628 +NssS'summary_default' +p15629 +(dp15630 +S'editable' +p15631 +I00 +sS'value' +p15632 +S'none' +p15633 +ssS'valid_types' +p15634 +(dp15635 +S'editable' +p15636 +I00 +sS'value' +p15637 +(lp15638 +S'Blendshape' +p15639 +asssS'description' +p15640 +(dp15641 +S'editable' +p15642 +I01 +sS'value' +p15643 +g47 +sssS'id' +p15644 +(dp15645 +S'mandatory' +p15646 +(dp15647 +S'editable' +p15648 +I00 +sS'value' +p15649 +I01 +ssS'name' +p15650 +(dp15651 +S'editable' +p15652 +I01 +sS'value' +p15653 +S'Id' +p15654 +ssS'data_type' +p15655 +(dp15656 +S'editable' +p15657 +I00 +sS'value' +p15658 +S'number' +p15659 +ssS'entity_type' +p15660 +(dp15661 +S'editable' +p15662 +I00 +sS'value' +p15663 +S'AssetBlendshapeConnection' +p15664 +ssS'editable' +p15665 +(dp15666 +S'editable' +p15667 +I00 +sS'value' +p15668 +I00 +ssS'unique' +p15669 +(dp15670 +S'editable' +p15671 +I00 +sS'value' +p15672 +I00 +ssS'properties' +p15673 +(dp15674 +S'default_value' +p15675 +(dp15676 +S'editable' +p15677 +I00 +sS'value' +p15678 +NssS'summary_default' +p15679 +(dp15680 +S'editable' +p15681 +I00 +sS'value' +p15682 +S'none' +p15683 +sssS'description' +p15684 +(dp15685 +S'editable' +p15686 +I01 +sS'value' +p15687 +g47 +ssssS'PageSetting' +p15688 +(dp15689 +S'created_at' +p15690 +(dp15691 +S'mandatory' +p15692 +(dp15693 +S'editable' +p15694 +I00 +sS'value' +p15695 +I00 +ssS'name' +p15696 +(dp15697 +S'editable' +p15698 +I01 +sS'value' +p15699 +S'Date Created' +p15700 +ssS'data_type' +p15701 +(dp15702 +S'editable' +p15703 +I00 +sS'value' +p15704 +S'date_time' +p15705 +ssS'entity_type' +p15706 +(dp15707 +S'editable' +p15708 +I00 +sS'value' +p15709 +S'PageSetting' +p15710 +ssS'editable' +p15711 +(dp15712 +S'editable' +p15713 +I00 +sS'value' +p15714 +I00 +ssS'unique' +p15715 +(dp15716 +S'editable' +p15717 +I00 +sS'value' +p15718 +I00 +ssS'properties' +p15719 +(dp15720 +S'default_value' +p15721 +(dp15722 +S'editable' +p15723 +I00 +sS'value' +p15724 +NssS'summary_default' +p15725 +(dp15726 +S'editable' +p15727 +I01 +sS'value' +p15728 +S'none' +p15729 +sssS'description' +p15730 +(dp15731 +S'editable' +p15732 +I01 +sS'value' +p15733 +g47 +sssS'settings_json' +p15734 +(dp15735 +S'mandatory' +p15736 +(dp15737 +S'editable' +p15738 +I00 +sS'value' +p15739 +I00 +ssS'name' +p15740 +(dp15741 +S'editable' +p15742 +I01 +sS'value' +p15743 +S'Settings' +p15744 +ssS'data_type' +p15745 +(dp15746 +S'editable' +p15747 +I00 +sS'value' +p15748 +S'text' +p15749 +ssS'entity_type' +p15750 +(dp15751 +S'editable' +p15752 +I00 +sS'value' +p15753 +S'PageSetting' +p15754 +ssS'editable' +p15755 +(dp15756 +S'editable' +p15757 +I00 +sS'value' +p15758 +I01 +ssS'unique' +p15759 +(dp15760 +S'editable' +p15761 +I00 +sS'value' +p15762 +I00 +ssS'properties' +p15763 +(dp15764 +S'default_value' +p15765 +(dp15766 +S'editable' +p15767 +I00 +sS'value' +p15768 +NssS'summary_default' +p15769 +(dp15770 +S'editable' +p15771 +I01 +sS'value' +p15772 +S'none' +p15773 +sssS'description' +p15774 +(dp15775 +S'editable' +p15776 +I01 +sS'value' +p15777 +g47 +sssS'page' +p15778 +(dp15779 +S'mandatory' +p15780 +(dp15781 +S'editable' +p15782 +I00 +sS'value' +p15783 +I00 +ssS'name' +p15784 +(dp15785 +S'editable' +p15786 +I01 +sS'value' +p15787 +S'Page' +p15788 +ssS'data_type' +p15789 +(dp15790 +S'editable' +p15791 +I00 +sS'value' +p15792 +S'entity' +p15793 +ssS'entity_type' +p15794 +(dp15795 +S'editable' +p15796 +I00 +sS'value' +p15797 +S'PageSetting' +p15798 +ssS'editable' +p15799 +(dp15800 +S'editable' +p15801 +I00 +sS'value' +p15802 +I01 +ssS'unique' +p15803 +(dp15804 +S'editable' +p15805 +I00 +sS'value' +p15806 +I00 +ssS'properties' +p15807 +(dp15808 +S'default_value' +p15809 +(dp15810 +S'editable' +p15811 +I00 +sS'value' +p15812 +NssS'summary_default' +p15813 +(dp15814 +S'editable' +p15815 +I01 +sS'value' +p15816 +S'none' +p15817 +ssS'valid_types' +p15818 +(dp15819 +S'editable' +p15820 +I01 +sS'value' +p15821 +(lp15822 +S'Page' +p15823 +asssS'description' +p15824 +(dp15825 +S'editable' +p15826 +I01 +sS'value' +p15827 +g47 +sssS'user' +p15828 +(dp15829 +S'mandatory' +p15830 +(dp15831 +S'editable' +p15832 +I00 +sS'value' +p15833 +I00 +ssS'name' +p15834 +(dp15835 +S'editable' +p15836 +I01 +sS'value' +p15837 +S'User' +p15838 +ssS'data_type' +p15839 +(dp15840 +S'editable' +p15841 +I00 +sS'value' +p15842 +S'entity' +p15843 +ssS'entity_type' +p15844 +(dp15845 +S'editable' +p15846 +I00 +sS'value' +p15847 +S'PageSetting' +p15848 +ssS'editable' +p15849 +(dp15850 +S'editable' +p15851 +I00 +sS'value' +p15852 +I01 +ssS'unique' +p15853 +(dp15854 +S'editable' +p15855 +I00 +sS'value' +p15856 +I00 +ssS'properties' +p15857 +(dp15858 +S'default_value' +p15859 +(dp15860 +S'editable' +p15861 +I00 +sS'value' +p15862 +NssS'summary_default' +p15863 +(dp15864 +S'editable' +p15865 +I01 +sS'value' +p15866 +S'none' +p15867 +ssS'valid_types' +p15868 +(dp15869 +S'editable' +p15870 +I01 +sS'value' +p15871 +(lp15872 +S'HumanUser' +p15873 +asssS'description' +p15874 +(dp15875 +S'editable' +p15876 +I01 +sS'value' +p15877 +g47 +sssS'cached_display_name' +p15878 +(dp15879 +S'mandatory' +p15880 +(dp15881 +S'editable' +p15882 +I00 +sS'value' +p15883 +I00 +ssS'name' +p15884 +(dp15885 +S'editable' +p15886 +I01 +sS'value' +p15887 +S'Cached Display Name' +p15888 +ssS'data_type' +p15889 +(dp15890 +S'editable' +p15891 +I00 +sS'value' +p15892 +S'text' +p15893 +ssS'entity_type' +p15894 +(dp15895 +S'editable' +p15896 +I00 +sS'value' +p15897 +S'PageSetting' +p15898 +ssS'editable' +p15899 +(dp15900 +S'editable' +p15901 +I00 +sS'value' +p15902 +I01 +ssS'unique' +p15903 +(dp15904 +S'editable' +p15905 +I00 +sS'value' +p15906 +I00 +ssS'properties' +p15907 +(dp15908 +S'default_value' +p15909 +(dp15910 +S'editable' +p15911 +I00 +sS'value' +p15912 +NssS'summary_default' +p15913 +(dp15914 +S'editable' +p15915 +I00 +sS'value' +p15916 +S'none' +p15917 +sssS'description' +p15918 +(dp15919 +S'editable' +p15920 +I01 +sS'value' +p15921 +g47 +sssS'id' +p15922 +(dp15923 +S'mandatory' +p15924 +(dp15925 +S'editable' +p15926 +I00 +sS'value' +p15927 +I00 +ssS'name' +p15928 +(dp15929 +S'editable' +p15930 +I01 +sS'value' +p15931 +S'Id' +p15932 +ssS'data_type' +p15933 +(dp15934 +S'editable' +p15935 +I00 +sS'value' +p15936 +S'number' +p15937 +ssS'entity_type' +p15938 +(dp15939 +S'editable' +p15940 +I00 +sS'value' +p15941 +S'PageSetting' +p15942 +ssS'editable' +p15943 +(dp15944 +S'editable' +p15945 +I00 +sS'value' +p15946 +I00 +ssS'unique' +p15947 +(dp15948 +S'editable' +p15949 +I00 +sS'value' +p15950 +I00 +ssS'properties' +p15951 +(dp15952 +S'default_value' +p15953 +(dp15954 +S'editable' +p15955 +I00 +sS'value' +p15956 +NssS'summary_default' +p15957 +(dp15958 +S'editable' +p15959 +I01 +sS'value' +p15960 +S'none' +p15961 +sssS'description' +p15962 +(dp15963 +S'editable' +p15964 +I01 +sS'value' +p15965 +g47 +ssssS'Status' +p15966 +(dp15967 +S'code' +p15968 +(dp15969 +S'mandatory' +p15970 +(dp15971 +S'editable' +p15972 +I00 +sS'value' +p15973 +I00 +ssS'name' +p15974 +(dp15975 +S'editable' +p15976 +I01 +sS'value' +p15977 +S'Short Code' +p15978 +ssS'data_type' +p15979 +(dp15980 +S'editable' +p15981 +I00 +sS'value' +p15982 +S'text' +p15983 +ssS'entity_type' +p15984 +(dp15985 +S'editable' +p15986 +I00 +sS'value' +p15987 +S'Status' +p15988 +ssS'editable' +p15989 +(dp15990 +S'editable' +p15991 +I00 +sS'value' +p15992 +I00 +ssS'unique' +p15993 +(dp15994 +S'editable' +p15995 +I00 +sS'value' +p15996 +I00 +ssS'properties' +p15997 +(dp15998 +S'default_value' +p15999 +(dp16000 +S'editable' +p16001 +I00 +sS'value' +p16002 +NssS'summary_default' +p16003 +(dp16004 +S'editable' +p16005 +I01 +sS'value' +p16006 +S'none' +p16007 +sssS'description' +p16008 +(dp16009 +S'editable' +p16010 +I01 +sS'value' +p16011 +g47 +sssS'name' +p16012 +(dp16013 +S'mandatory' +p16014 +(dp16015 +S'editable' +p16016 +I00 +sS'value' +p16017 +I01 +ssS'name' +p16018 +(dp16019 +S'editable' +p16020 +I01 +sS'value' +p16021 +S'Status Name' +p16022 +ssS'data_type' +p16023 +(dp16024 +S'editable' +p16025 +I00 +sS'value' +p16026 +S'text' +p16027 +ssS'entity_type' +p16028 +(dp16029 +S'editable' +p16030 +I00 +sS'value' +p16031 +S'Status' +p16032 +ssS'editable' +p16033 +(dp16034 +S'editable' +p16035 +I00 +sS'value' +p16036 +I01 +ssS'unique' +p16037 +(dp16038 +S'editable' +p16039 +I00 +sS'value' +p16040 +I00 +ssS'properties' +p16041 +(dp16042 +S'default_value' +p16043 +(dp16044 +S'editable' +p16045 +I00 +sS'value' +p16046 +NssS'summary_default' +p16047 +(dp16048 +S'editable' +p16049 +I01 +sS'value' +p16050 +S'none' +p16051 +sssS'description' +p16052 +(dp16053 +S'editable' +p16054 +I01 +sS'value' +p16055 +g47 +sssS'created_at' +p16056 +(dp16057 +S'mandatory' +p16058 +(dp16059 +S'editable' +p16060 +I00 +sS'value' +p16061 +I00 +ssS'name' +p16062 +(dp16063 +S'editable' +p16064 +I01 +sS'value' +p16065 +S'Date Created' +p16066 +ssS'data_type' +p16067 +(dp16068 +S'editable' +p16069 +I00 +sS'value' +p16070 +S'date_time' +p16071 +ssS'entity_type' +p16072 +(dp16073 +S'editable' +p16074 +I00 +sS'value' +p16075 +S'Status' +p16076 +ssS'editable' +p16077 +(dp16078 +S'editable' +p16079 +I00 +sS'value' +p16080 +I00 +ssS'unique' +p16081 +(dp16082 +S'editable' +p16083 +I00 +sS'value' +p16084 +I00 +ssS'properties' +p16085 +(dp16086 +S'default_value' +p16087 +(dp16088 +S'editable' +p16089 +I00 +sS'value' +p16090 +NssS'summary_default' +p16091 +(dp16092 +S'editable' +p16093 +I00 +sS'value' +p16094 +S'none' +p16095 +sssS'description' +p16096 +(dp16097 +S'editable' +p16098 +I01 +sS'value' +p16099 +g47 +sssS'updated_at' +p16100 +(dp16101 +S'mandatory' +p16102 +(dp16103 +S'editable' +p16104 +I00 +sS'value' +p16105 +I00 +ssS'name' +p16106 +(dp16107 +S'editable' +p16108 +I01 +sS'value' +p16109 +S'Date Updated' +p16110 +ssS'data_type' +p16111 +(dp16112 +S'editable' +p16113 +I00 +sS'value' +p16114 +S'date_time' +p16115 +ssS'entity_type' +p16116 +(dp16117 +S'editable' +p16118 +I00 +sS'value' +p16119 +S'Status' +p16120 +ssS'editable' +p16121 +(dp16122 +S'editable' +p16123 +I00 +sS'value' +p16124 +I00 +ssS'unique' +p16125 +(dp16126 +S'editable' +p16127 +I00 +sS'value' +p16128 +I00 +ssS'properties' +p16129 +(dp16130 +S'default_value' +p16131 +(dp16132 +S'editable' +p16133 +I00 +sS'value' +p16134 +NssS'summary_default' +p16135 +(dp16136 +S'editable' +p16137 +I00 +sS'value' +p16138 +S'none' +p16139 +sssS'description' +p16140 +(dp16141 +S'editable' +p16142 +I01 +sS'value' +p16143 +g47 +sssS'created_by' +p16144 +(dp16145 +S'mandatory' +p16146 +(dp16147 +S'editable' +p16148 +I00 +sS'value' +p16149 +I00 +ssS'name' +p16150 +(dp16151 +S'editable' +p16152 +I01 +sS'value' +p16153 +S'Created by' +p16154 +ssS'data_type' +p16155 +(dp16156 +S'editable' +p16157 +I00 +sS'value' +p16158 +S'entity' +p16159 +ssS'entity_type' +p16160 +(dp16161 +S'editable' +p16162 +I00 +sS'value' +p16163 +S'Status' +p16164 +ssS'editable' +p16165 +(dp16166 +S'editable' +p16167 +I00 +sS'value' +p16168 +I00 +ssS'unique' +p16169 +(dp16170 +S'editable' +p16171 +I00 +sS'value' +p16172 +I00 +ssS'properties' +p16173 +(dp16174 +S'default_value' +p16175 +(dp16176 +S'editable' +p16177 +I00 +sS'value' +p16178 +NssS'summary_default' +p16179 +(dp16180 +S'editable' +p16181 +I00 +sS'value' +p16182 +S'none' +p16183 +ssS'valid_types' +p16184 +(dp16185 +S'editable' +p16186 +I00 +sS'value' +p16187 +(lp16188 +S'HumanUser' +p16189 +aS'ApiUser' +p16190 +asssS'description' +p16191 +(dp16192 +S'editable' +p16193 +I01 +sS'value' +p16194 +g47 +sssS'system' +p16195 +(dp16196 +S'mandatory' +p16197 +(dp16198 +S'editable' +p16199 +I00 +sS'value' +p16200 +I00 +ssS'name' +p16201 +(dp16202 +S'editable' +p16203 +I01 +sS'value' +p16204 +S'Locked by System' +p16205 +ssS'data_type' +p16206 +(dp16207 +S'editable' +p16208 +I00 +sS'value' +p16209 +S'checkbox' +p16210 +ssS'entity_type' +p16211 +(dp16212 +S'editable' +p16213 +I00 +sS'value' +p16214 +S'Status' +p16215 +ssS'editable' +p16216 +(dp16217 +S'editable' +p16218 +I00 +sS'value' +p16219 +I00 +ssS'unique' +p16220 +(dp16221 +S'editable' +p16222 +I00 +sS'value' +p16223 +I00 +ssS'properties' +p16224 +(dp16225 +S'default_value' +p16226 +(dp16227 +S'editable' +p16228 +I00 +sS'value' +p16229 +I00 +ssS'summary_default' +p16230 +(dp16231 +S'editable' +p16232 +I00 +sS'value' +p16233 +S'none' +p16234 +sssS'description' +p16235 +(dp16236 +S'editable' +p16237 +I01 +sS'value' +p16238 +g47 +sssS'bg_color' +p16239 +(dp16240 +S'mandatory' +p16241 +(dp16242 +S'editable' +p16243 +I00 +sS'value' +p16244 +I00 +ssS'name' +p16245 +(dp16246 +S'editable' +p16247 +I01 +sS'value' +p16248 +S'Background Color' +p16249 +ssS'data_type' +p16250 +(dp16251 +S'editable' +p16252 +I00 +sS'value' +p16253 +S'color' +p16254 +ssS'entity_type' +p16255 +(dp16256 +S'editable' +p16257 +I00 +sS'value' +p16258 +S'Status' +p16259 +ssS'editable' +p16260 +(dp16261 +S'editable' +p16262 +I00 +sS'value' +p16263 +I01 +ssS'unique' +p16264 +(dp16265 +S'editable' +p16266 +I00 +sS'value' +p16267 +I00 +ssS'properties' +p16268 +(dp16269 +S'default_value' +p16270 +(dp16271 +S'editable' +p16272 +I00 +sS'value' +p16273 +NssS'summary_default' +p16274 +(dp16275 +S'editable' +p16276 +I00 +sS'value' +p16277 +S'none' +p16278 +sssS'description' +p16279 +(dp16280 +S'editable' +p16281 +I01 +sS'value' +p16282 +g47 +sssS'updated_by' +p16283 +(dp16284 +S'mandatory' +p16285 +(dp16286 +S'editable' +p16287 +I00 +sS'value' +p16288 +I00 +ssS'name' +p16289 +(dp16290 +S'editable' +p16291 +I01 +sS'value' +p16292 +S'Updated by' +p16293 +ssS'data_type' +p16294 +(dp16295 +S'editable' +p16296 +I00 +sS'value' +p16297 +S'entity' +p16298 +ssS'entity_type' +p16299 +(dp16300 +S'editable' +p16301 +I00 +sS'value' +p16302 +S'Status' +p16303 +ssS'editable' +p16304 +(dp16305 +S'editable' +p16306 +I00 +sS'value' +p16307 +I00 +ssS'unique' +p16308 +(dp16309 +S'editable' +p16310 +I00 +sS'value' +p16311 +I00 +ssS'properties' +p16312 +(dp16313 +S'default_value' +p16314 +(dp16315 +S'editable' +p16316 +I00 +sS'value' +p16317 +NssS'summary_default' +p16318 +(dp16319 +S'editable' +p16320 +I00 +sS'value' +p16321 +S'none' +p16322 +ssS'valid_types' +p16323 +(dp16324 +S'editable' +p16325 +I00 +sS'value' +p16326 +(lp16327 +S'HumanUser' +p16328 +aS'ApiUser' +p16329 +asssS'description' +p16330 +(dp16331 +S'editable' +p16332 +I01 +sS'value' +p16333 +g47 +sssS'cached_display_name' +p16334 +(dp16335 +S'mandatory' +p16336 +(dp16337 +S'editable' +p16338 +I00 +sS'value' +p16339 +I00 +ssS'name' +p16340 +(dp16341 +S'editable' +p16342 +I01 +sS'value' +p16343 +S'Cached Display Name' +p16344 +ssS'data_type' +p16345 +(dp16346 +S'editable' +p16347 +I00 +sS'value' +p16348 +S'text' +p16349 +ssS'entity_type' +p16350 +(dp16351 +S'editable' +p16352 +I00 +sS'value' +p16353 +S'Status' +p16354 +ssS'editable' +p16355 +(dp16356 +S'editable' +p16357 +I00 +sS'value' +p16358 +I01 +ssS'unique' +p16359 +(dp16360 +S'editable' +p16361 +I00 +sS'value' +p16362 +I00 +ssS'properties' +p16363 +(dp16364 +S'default_value' +p16365 +(dp16366 +S'editable' +p16367 +I00 +sS'value' +p16368 +NssS'summary_default' +p16369 +(dp16370 +S'editable' +p16371 +I00 +sS'value' +p16372 +S'none' +p16373 +sssS'description' +p16374 +(dp16375 +S'editable' +p16376 +I01 +sS'value' +p16377 +g47 +sssS'id' +p16378 +(dp16379 +S'mandatory' +p16380 +(dp16381 +S'editable' +p16382 +I00 +sS'value' +p16383 +I00 +ssS'name' +p16384 +(dp16385 +S'editable' +p16386 +I01 +sS'value' +p16387 +S'Id' +p16388 +ssS'data_type' +p16389 +(dp16390 +S'editable' +p16391 +I00 +sS'value' +p16392 +S'number' +p16393 +ssS'entity_type' +p16394 +(dp16395 +S'editable' +p16396 +I00 +sS'value' +p16397 +S'Status' +p16398 +ssS'editable' +p16399 +(dp16400 +S'editable' +p16401 +I00 +sS'value' +p16402 +I00 +ssS'unique' +p16403 +(dp16404 +S'editable' +p16405 +I00 +sS'value' +p16406 +I00 +ssS'properties' +p16407 +(dp16408 +S'default_value' +p16409 +(dp16410 +S'editable' +p16411 +I00 +sS'value' +p16412 +NssS'summary_default' +p16413 +(dp16414 +S'editable' +p16415 +I00 +sS'value' +p16416 +S'none' +p16417 +sssS'description' +p16418 +(dp16419 +S'editable' +p16420 +I01 +sS'value' +p16421 +g47 +sssS'icon' +p16422 +(dp16423 +S'mandatory' +p16424 +(dp16425 +S'editable' +p16426 +I00 +sS'value' +p16427 +I01 +ssS'name' +p16428 +(dp16429 +S'editable' +p16430 +I01 +sS'value' +p16431 +S'Icon' +p16432 +ssS'data_type' +p16433 +(dp16434 +S'editable' +p16435 +I00 +sS'value' +p16436 +S'entity' +p16437 +ssS'entity_type' +p16438 +(dp16439 +S'editable' +p16440 +I00 +sS'value' +p16441 +S'Status' +p16442 +ssS'editable' +p16443 +(dp16444 +S'editable' +p16445 +I00 +sS'value' +p16446 +I01 +ssS'unique' +p16447 +(dp16448 +S'editable' +p16449 +I00 +sS'value' +p16450 +I00 +ssS'properties' +p16451 +(dp16452 +S'default_value' +p16453 +(dp16454 +S'editable' +p16455 +I00 +sS'value' +p16456 +NssS'summary_default' +p16457 +(dp16458 +S'editable' +p16459 +I00 +sS'value' +p16460 +S'none' +p16461 +ssS'valid_types' +p16462 +(dp16463 +S'editable' +p16464 +I00 +sS'value' +p16465 +(lp16466 +S'Icon' +p16467 +asssS'description' +p16468 +(dp16469 +S'editable' +p16470 +I01 +sS'value' +p16471 +g47 +ssssS'Reply' +p16472 +(dp16473 +S'created_at' +p16474 +(dp16475 +S'mandatory' +p16476 +(dp16477 +S'editable' +p16478 +I00 +sS'value' +p16479 +I00 +ssS'name' +p16480 +(dp16481 +S'editable' +p16482 +I01 +sS'value' +p16483 +S'Date Created' +p16484 +ssS'data_type' +p16485 +(dp16486 +S'editable' +p16487 +I00 +sS'value' +p16488 +S'date_time' +p16489 +ssS'entity_type' +p16490 +(dp16491 +S'editable' +p16492 +I00 +sS'value' +p16493 +S'Reply' +p16494 +ssS'editable' +p16495 +(dp16496 +S'editable' +p16497 +I00 +sS'value' +p16498 +I00 +ssS'unique' +p16499 +(dp16500 +S'editable' +p16501 +I00 +sS'value' +p16502 +I00 +ssS'properties' +p16503 +(dp16504 +S'default_value' +p16505 +(dp16506 +S'editable' +p16507 +I00 +sS'value' +p16508 +NssS'summary_default' +p16509 +(dp16510 +S'editable' +p16511 +I01 +sS'value' +p16512 +S'none' +p16513 +sssS'description' +p16514 +(dp16515 +S'editable' +p16516 +I01 +sS'value' +p16517 +g47 +sssS'entity' +p16518 +(dp16519 +S'mandatory' +p16520 +(dp16521 +S'editable' +p16522 +I00 +sS'value' +p16523 +I00 +ssS'name' +p16524 +(dp16525 +S'editable' +p16526 +I01 +sS'value' +p16527 +S'Link' +p16528 +ssS'data_type' +p16529 +(dp16530 +S'editable' +p16531 +I00 +sS'value' +p16532 +S'entity' +p16533 +ssS'entity_type' +p16534 +(dp16535 +S'editable' +p16536 +I00 +sS'value' +p16537 +S'Reply' +p16538 +ssS'editable' +p16539 +(dp16540 +S'editable' +p16541 +I00 +sS'value' +p16542 +I01 +ssS'unique' +p16543 +(dp16544 +S'editable' +p16545 +I00 +sS'value' +p16546 +I00 +ssS'properties' +p16547 +(dp16548 +S'default_value' +p16549 +(dp16550 +S'editable' +p16551 +I00 +sS'value' +p16552 +NssS'summary_default' +p16553 +(dp16554 +S'editable' +p16555 +I01 +sS'value' +p16556 +S'none' +p16557 +ssS'valid_types' +p16558 +(dp16559 +S'editable' +p16560 +I01 +sS'value' +p16561 +(lp16562 +S'ApiUser' +p16563 +aS'AppWelcome' +p16564 +aS'Asset' +p16565 +aS'AssetLibrary' +p16566 +aS'Attachment' +p16567 +aS'Banner' +p16568 +aS'Booking' +p16569 +aS'CustomEntity01' +p16570 +aS'CustomEntity02' +p16571 +aS'CustomEntity03' +p16572 +aS'CustomEntity04' +p16573 +aS'CustomEntity05' +p16574 +aS'CustomNonProjectEntity01' +p16575 +aS'CustomNonProjectEntity02' +p16576 +aS'CustomNonProjectEntity03' +p16577 +aS'Department' +p16578 +aS'Element' +p16579 +aS'Group' +p16580 +aS'HumanUser' +p16581 +aS'Icon' +p16582 +aS'LocalStorage' +p16583 +aS'Note' +p16584 +aS'Page' +p16585 +aS'PermissionRuleSet' +p16586 +aS'Phase' +p16587 +aS'PipelineConfiguration' +p16588 +aS'Playlist' +p16589 +aS'Project' +p16590 +aS'PublishedFile' +p16591 +aS'PublishedFileDependency' +p16592 +aS'PublishedFileType' +p16593 +aS'Scene' +p16594 +aS'Sequence' +p16595 +aS'Shot' +p16596 +aS'Status' +p16597 +aS'Step' +p16598 +aS'Tag' +p16599 +aS'TankDependency' +p16600 +aS'TankPublishedFile' +p16601 +aS'TankType' +p16602 +aS'Task' +p16603 +aS'TaskTemplate' +p16604 +aS'Version' +p16605 +asssS'description' +p16606 +(dp16607 +S'editable' +p16608 +I01 +sS'value' +p16609 +g47 +sssS'content' +p16610 +(dp16611 +S'mandatory' +p16612 +(dp16613 +S'editable' +p16614 +I00 +sS'value' +p16615 +I01 +ssS'name' +p16616 +(dp16617 +S'editable' +p16618 +I01 +sS'value' +p16619 +S'Reply Text' +p16620 +ssS'data_type' +p16621 +(dp16622 +S'editable' +p16623 +I00 +sS'value' +p16624 +S'text' +p16625 +ssS'entity_type' +p16626 +(dp16627 +S'editable' +p16628 +I00 +sS'value' +p16629 +S'Reply' +p16630 +ssS'editable' +p16631 +(dp16632 +S'editable' +p16633 +I00 +sS'value' +p16634 +I01 +ssS'unique' +p16635 +(dp16636 +S'editable' +p16637 +I00 +sS'value' +p16638 +I00 +ssS'properties' +p16639 +(dp16640 +S'default_value' +p16641 +(dp16642 +S'editable' +p16643 +I00 +sS'value' +p16644 +NssS'summary_default' +p16645 +(dp16646 +S'editable' +p16647 +I01 +sS'value' +p16648 +S'none' +p16649 +sssS'description' +p16650 +(dp16651 +S'editable' +p16652 +I01 +sS'value' +p16653 +g47 +sssS'user' +p16654 +(dp16655 +S'mandatory' +p16656 +(dp16657 +S'editable' +p16658 +I00 +sS'value' +p16659 +I00 +ssS'name' +p16660 +(dp16661 +S'editable' +p16662 +I01 +sS'value' +p16663 +S'User' +p16664 +ssS'data_type' +p16665 +(dp16666 +S'editable' +p16667 +I00 +sS'value' +p16668 +S'entity' +p16669 +ssS'entity_type' +p16670 +(dp16671 +S'editable' +p16672 +I00 +sS'value' +p16673 +S'Reply' +p16674 +ssS'editable' +p16675 +(dp16676 +S'editable' +p16677 +I00 +sS'value' +p16678 +I01 +ssS'unique' +p16679 +(dp16680 +S'editable' +p16681 +I00 +sS'value' +p16682 +I00 +ssS'properties' +p16683 +(dp16684 +S'default_value' +p16685 +(dp16686 +S'editable' +p16687 +I00 +sS'value' +p16688 +NssS'summary_default' +p16689 +(dp16690 +S'editable' +p16691 +I01 +sS'value' +p16692 +S'none' +p16693 +ssS'valid_types' +p16694 +(dp16695 +S'editable' +p16696 +I01 +sS'value' +p16697 +(lp16698 +S'HumanUser' +p16699 +aS'ApiUser' +p16700 +asssS'description' +p16701 +(dp16702 +S'editable' +p16703 +I01 +sS'value' +p16704 +g47 +sssS'cached_display_name' +p16705 +(dp16706 +S'mandatory' +p16707 +(dp16708 +S'editable' +p16709 +I00 +sS'value' +p16710 +I00 +ssS'name' +p16711 +(dp16712 +S'editable' +p16713 +I01 +sS'value' +p16714 +S'Cached Display Name' +p16715 +ssS'data_type' +p16716 +(dp16717 +S'editable' +p16718 +I00 +sS'value' +p16719 +S'text' +p16720 +ssS'entity_type' +p16721 +(dp16722 +S'editable' +p16723 +I00 +sS'value' +p16724 +S'Reply' +p16725 +ssS'editable' +p16726 +(dp16727 +S'editable' +p16728 +I00 +sS'value' +p16729 +I01 +ssS'unique' +p16730 +(dp16731 +S'editable' +p16732 +I00 +sS'value' +p16733 +I00 +ssS'properties' +p16734 +(dp16735 +S'default_value' +p16736 +(dp16737 +S'editable' +p16738 +I00 +sS'value' +p16739 +NssS'summary_default' +p16740 +(dp16741 +S'editable' +p16742 +I00 +sS'value' +p16743 +S'none' +p16744 +sssS'description' +p16745 +(dp16746 +S'editable' +p16747 +I01 +sS'value' +p16748 +g47 +sssS'id' +p16749 +(dp16750 +S'mandatory' +p16751 +(dp16752 +S'editable' +p16753 +I00 +sS'value' +p16754 +I00 +ssS'name' +p16755 +(dp16756 +S'editable' +p16757 +I01 +sS'value' +p16758 +S'Id' +p16759 +ssS'data_type' +p16760 +(dp16761 +S'editable' +p16762 +I00 +sS'value' +p16763 +S'number' +p16764 +ssS'entity_type' +p16765 +(dp16766 +S'editable' +p16767 +I00 +sS'value' +p16768 +S'Reply' +p16769 +ssS'editable' +p16770 +(dp16771 +S'editable' +p16772 +I00 +sS'value' +p16773 +I00 +ssS'unique' +p16774 +(dp16775 +S'editable' +p16776 +I00 +sS'value' +p16777 +I00 +ssS'properties' +p16778 +(dp16779 +S'default_value' +p16780 +(dp16781 +S'editable' +p16782 +I00 +sS'value' +p16783 +NssS'summary_default' +p16784 +(dp16785 +S'editable' +p16786 +I01 +sS'value' +p16787 +S'none' +p16788 +sssS'description' +p16789 +(dp16790 +S'editable' +p16791 +I01 +sS'value' +p16792 +g47 +ssssS'Task' +p16793 +(dp16794 +S'open_notes_count' +p16795 +(dp16796 +S'mandatory' +p16797 +(dp16798 +S'editable' +p16799 +I00 +sS'value' +p16800 +I00 +ssS'name' +p16801 +(dp16802 +S'editable' +p16803 +I01 +sS'value' +p16804 +S'Open Notes Count' +p16805 +ssS'data_type' +p16806 +(dp16807 +S'editable' +p16808 +I00 +sS'value' +p16809 +S'text' +p16810 +ssS'entity_type' +p16811 +(dp16812 +S'editable' +p16813 +I00 +sS'value' +p16814 +S'Task' +p16815 +ssS'editable' +p16816 +(dp16817 +S'editable' +p16818 +I00 +sS'value' +p16819 +I00 +ssS'unique' +p16820 +(dp16821 +S'editable' +p16822 +I00 +sS'value' +p16823 +I00 +ssS'properties' +p16824 +(dp16825 +S'default_value' +p16826 +(dp16827 +S'editable' +p16828 +I00 +sS'value' +p16829 +NssS'summary_default' +p16830 +(dp16831 +S'editable' +p16832 +I01 +sS'value' +p16833 +S'none' +p16834 +sssS'description' +p16835 +(dp16836 +S'editable' +p16837 +I01 +sS'value' +p16838 +g47 +sssS'color' +p16839 +(dp16840 +S'mandatory' +p16841 +(dp16842 +S'editable' +p16843 +I00 +sS'value' +p16844 +I00 +ssS'name' +p16845 +(dp16846 +S'editable' +p16847 +I01 +sS'value' +p16848 +S'Gantt Bar Color' +p16849 +ssS'data_type' +p16850 +(dp16851 +S'editable' +p16852 +I00 +sS'value' +p16853 +S'color' +p16854 +ssS'entity_type' +p16855 +(dp16856 +S'editable' +p16857 +I00 +sS'value' +p16858 +S'Task' +p16859 +ssS'editable' +p16860 +(dp16861 +S'editable' +p16862 +I00 +sS'value' +p16863 +I01 +ssS'unique' +p16864 +(dp16865 +S'editable' +p16866 +I00 +sS'value' +p16867 +I00 +ssS'properties' +p16868 +(dp16869 +S'default_value' +p16870 +(dp16871 +S'editable' +p16872 +I00 +sS'value' +p16873 +NssS'summary_default' +p16874 +(dp16875 +S'editable' +p16876 +I01 +sS'value' +p16877 +S'none' +p16878 +sssS'description' +p16879 +(dp16880 +S'editable' +p16881 +I01 +sS'value' +p16882 +g47 +sssS'split_durations' +p16883 +(dp16884 +S'mandatory' +p16885 +(dp16886 +S'editable' +p16887 +I00 +sS'value' +p16888 +I00 +ssS'name' +p16889 +(dp16890 +S'editable' +p16891 +I01 +sS'value' +p16892 +S'Split Durations' +p16893 +ssS'data_type' +p16894 +(dp16895 +S'editable' +p16896 +I00 +sS'value' +p16897 +S'serializable' +p16898 +ssS'entity_type' +p16899 +(dp16900 +S'editable' +p16901 +I00 +sS'value' +p16902 +S'Task' +p16903 +ssS'editable' +p16904 +(dp16905 +S'editable' +p16906 +I00 +sS'value' +p16907 +I00 +ssS'unique' +p16908 +(dp16909 +S'editable' +p16910 +I00 +sS'value' +p16911 +I00 +ssS'properties' +p16912 +(dp16913 +S'default_value' +p16914 +(dp16915 +S'editable' +p16916 +I00 +sS'value' +p16917 +NssS'summary_default' +p16918 +(dp16919 +S'editable' +p16920 +I00 +sS'value' +p16921 +S'none' +p16922 +sssS'description' +p16923 +(dp16924 +S'editable' +p16925 +I01 +sS'value' +p16926 +g47 +sssS'image' +p16927 +(dp16928 +S'mandatory' +p16929 +(dp16930 +S'editable' +p16931 +I00 +sS'value' +p16932 +I00 +ssS'name' +p16933 +(dp16934 +S'editable' +p16935 +I01 +sS'value' +p16936 +S'Thumbnail' +p16937 +ssS'data_type' +p16938 +(dp16939 +S'editable' +p16940 +I00 +sS'value' +p16941 +S'image' +p16942 +ssS'entity_type' +p16943 +(dp16944 +S'editable' +p16945 +I00 +sS'value' +p16946 +S'Task' +p16947 +ssS'editable' +p16948 +(dp16949 +S'editable' +p16950 +I00 +sS'value' +p16951 +I01 +ssS'unique' +p16952 +(dp16953 +S'editable' +p16954 +I00 +sS'value' +p16955 +I00 +ssS'properties' +p16956 +(dp16957 +S'default_value' +p16958 +(dp16959 +S'editable' +p16960 +I00 +sS'value' +p16961 +NssS'summary_default' +p16962 +(dp16963 +S'editable' +p16964 +I01 +sS'value' +p16965 +S'none' +p16966 +sssS'description' +p16967 +(dp16968 +S'editable' +p16969 +I01 +sS'value' +p16970 +g47 +sssS'updated_at' +p16971 +(dp16972 +S'mandatory' +p16973 +(dp16974 +S'editable' +p16975 +I00 +sS'value' +p16976 +I00 +ssS'name' +p16977 +(dp16978 +S'editable' +p16979 +I01 +sS'value' +p16980 +S'Date Updated' +p16981 +ssS'data_type' +p16982 +(dp16983 +S'editable' +p16984 +I00 +sS'value' +p16985 +S'date_time' +p16986 +ssS'entity_type' +p16987 +(dp16988 +S'editable' +p16989 +I00 +sS'value' +p16990 +S'Task' +p16991 +ssS'editable' +p16992 +(dp16993 +S'editable' +p16994 +I00 +sS'value' +p16995 +I00 +ssS'unique' +p16996 +(dp16997 +S'editable' +p16998 +I00 +sS'value' +p16999 +I00 +ssS'properties' +p17000 +(dp17001 +S'default_value' +p17002 +(dp17003 +S'editable' +p17004 +I00 +sS'value' +p17005 +NssS'summary_default' +p17006 +(dp17007 +S'editable' +p17008 +I01 +sS'value' +p17009 +S'none' +p17010 +sssS'description' +p17011 +(dp17012 +S'editable' +p17013 +I01 +sS'value' +p17014 +g47 +sssS'entity' +p17015 +(dp17016 +S'mandatory' +p17017 +(dp17018 +S'editable' +p17019 +I00 +sS'value' +p17020 +I00 +ssS'name' +p17021 +(dp17022 +S'editable' +p17023 +I01 +sS'value' +p17024 +S'Link' +p17025 +ssS'data_type' +p17026 +(dp17027 +S'editable' +p17028 +I00 +sS'value' +p17029 +S'entity' +p17030 +ssS'entity_type' +p17031 +(dp17032 +S'editable' +p17033 +I00 +sS'value' +p17034 +S'Task' +p17035 +ssS'editable' +p17036 +(dp17037 +S'editable' +p17038 +I00 +sS'value' +p17039 +I01 +ssS'unique' +p17040 +(dp17041 +S'editable' +p17042 +I00 +sS'value' +p17043 +I00 +ssS'properties' +p17044 +(dp17045 +S'default_value' +p17046 +(dp17047 +S'editable' +p17048 +I00 +sS'value' +p17049 +NssS'summary_default' +p17050 +(dp17051 +S'editable' +p17052 +I01 +sS'value' +p17053 +S'none' +p17054 +ssS'valid_types' +p17055 +(dp17056 +S'editable' +p17057 +I01 +sS'value' +p17058 +(lp17059 +S'Asset' +p17060 +aS'Element' +p17061 +aS'Scene' +p17062 +aS'Sequence' +p17063 +aS'Shot' +p17064 +aS'Project' +p17065 +asssS'description' +p17066 +(dp17067 +S'editable' +p17068 +I01 +sS'value' +p17069 +g47 +sssS'task_assignees' +p17070 +(dp17071 +S'mandatory' +p17072 +(dp17073 +S'editable' +p17074 +I00 +sS'value' +p17075 +I00 +ssS'name' +p17076 +(dp17077 +S'editable' +p17078 +I01 +sS'value' +p17079 +S'Assigned To' +p17080 +ssS'data_type' +p17081 +(dp17082 +S'editable' +p17083 +I00 +sS'value' +p17084 +S'multi_entity' +p17085 +ssS'entity_type' +p17086 +(dp17087 +S'editable' +p17088 +I00 +sS'value' +p17089 +S'Task' +p17090 +ssS'editable' +p17091 +(dp17092 +S'editable' +p17093 +I00 +sS'value' +p17094 +I01 +ssS'unique' +p17095 +(dp17096 +S'editable' +p17097 +I00 +sS'value' +p17098 +I00 +ssS'properties' +p17099 +(dp17100 +S'default_value' +p17101 +(dp17102 +S'editable' +p17103 +I00 +sS'value' +p17104 +NssS'summary_default' +p17105 +(dp17106 +S'editable' +p17107 +I01 +sS'value' +p17108 +S'none' +p17109 +ssS'valid_types' +p17110 +(dp17111 +S'editable' +p17112 +I01 +sS'value' +p17113 +(lp17114 +S'Group' +p17115 +aS'HumanUser' +p17116 +asssS'description' +p17117 +(dp17118 +S'editable' +p17119 +I01 +sS'value' +p17120 +g47 +sssS'duration' +p17121 +(dp17122 +S'mandatory' +p17123 +(dp17124 +S'editable' +p17125 +I00 +sS'value' +p17126 +I00 +ssS'name' +p17127 +(dp17128 +S'editable' +p17129 +I01 +sS'value' +p17130 +S'Duration' +p17131 +ssS'data_type' +p17132 +(dp17133 +S'editable' +p17134 +I00 +sS'value' +p17135 +S'duration' +p17136 +ssS'entity_type' +p17137 +(dp17138 +S'editable' +p17139 +I00 +sS'value' +p17140 +S'Task' +p17141 +ssS'editable' +p17142 +(dp17143 +S'editable' +p17144 +I00 +sS'value' +p17145 +I01 +ssS'unique' +p17146 +(dp17147 +S'editable' +p17148 +I00 +sS'value' +p17149 +I00 +ssS'properties' +p17150 +(dp17151 +S'default_value' +p17152 +(dp17153 +S'editable' +p17154 +I00 +sS'value' +p17155 +NssS'summary_default' +p17156 +(dp17157 +S'editable' +p17158 +I01 +sS'value' +p17159 +S'sum' +p17160 +sssS'description' +p17161 +(dp17162 +S'editable' +p17163 +I01 +sS'value' +p17164 +g47 +sssS'cached_display_name' +p17165 +(dp17166 +S'mandatory' +p17167 +(dp17168 +S'editable' +p17169 +I00 +sS'value' +p17170 +I00 +ssS'name' +p17171 +(dp17172 +S'editable' +p17173 +I01 +sS'value' +p17174 +S'Cached Display Name' +p17175 +ssS'data_type' +p17176 +(dp17177 +S'editable' +p17178 +I00 +sS'value' +p17179 +S'text' +p17180 +ssS'entity_type' +p17181 +(dp17182 +S'editable' +p17183 +I00 +sS'value' +p17184 +S'Task' +p17185 +ssS'editable' +p17186 +(dp17187 +S'editable' +p17188 +I00 +sS'value' +p17189 +I01 +ssS'unique' +p17190 +(dp17191 +S'editable' +p17192 +I00 +sS'value' +p17193 +I00 +ssS'properties' +p17194 +(dp17195 +S'default_value' +p17196 +(dp17197 +S'editable' +p17198 +I00 +sS'value' +p17199 +NssS'summary_default' +p17200 +(dp17201 +S'editable' +p17202 +I00 +sS'value' +p17203 +S'none' +p17204 +sssS'description' +p17205 +(dp17206 +S'editable' +p17207 +I01 +sS'value' +p17208 +g47 +sssS'id' +p17209 +(dp17210 +S'mandatory' +p17211 +(dp17212 +S'editable' +p17213 +I00 +sS'value' +p17214 +I00 +ssS'name' +p17215 +(dp17216 +S'editable' +p17217 +I01 +sS'value' +p17218 +S'Id' +p17219 +ssS'data_type' +p17220 +(dp17221 +S'editable' +p17222 +I00 +sS'value' +p17223 +S'number' +p17224 +ssS'entity_type' +p17225 +(dp17226 +S'editable' +p17227 +I00 +sS'value' +p17228 +S'Task' +p17229 +ssS'editable' +p17230 +(dp17231 +S'editable' +p17232 +I00 +sS'value' +p17233 +I00 +ssS'unique' +p17234 +(dp17235 +S'editable' +p17236 +I00 +sS'value' +p17237 +I00 +ssS'properties' +p17238 +(dp17239 +S'default_value' +p17240 +(dp17241 +S'editable' +p17242 +I00 +sS'value' +p17243 +NssS'summary_default' +p17244 +(dp17245 +S'editable' +p17246 +I01 +sS'value' +p17247 +S'none' +p17248 +sssS'description' +p17249 +(dp17250 +S'editable' +p17251 +I01 +sS'value' +p17252 +g47 +sssS'pinned' +p17253 +(dp17254 +S'mandatory' +p17255 +(dp17256 +S'editable' +p17257 +I00 +sS'value' +p17258 +I00 +ssS'name' +p17259 +(dp17260 +S'editable' +p17261 +I01 +sS'value' +p17262 +S'Pinned' +p17263 +ssS'data_type' +p17264 +(dp17265 +S'editable' +p17266 +I00 +sS'value' +p17267 +S'checkbox' +p17268 +ssS'entity_type' +p17269 +(dp17270 +S'editable' +p17271 +I00 +sS'value' +p17272 +S'Task' +p17273 +ssS'editable' +p17274 +(dp17275 +S'editable' +p17276 +I00 +sS'value' +p17277 +I01 +ssS'unique' +p17278 +(dp17279 +S'editable' +p17280 +I00 +sS'value' +p17281 +I00 +ssS'properties' +p17282 +(dp17283 +S'default_value' +p17284 +(dp17285 +S'editable' +p17286 +I00 +sS'value' +p17287 +I00 +ssS'summary_default' +p17288 +(dp17289 +S'editable' +p17290 +I01 +sS'value' +p17291 +S'none' +p17292 +sssS'description' +p17293 +(dp17294 +S'editable' +p17295 +I01 +sS'value' +p17296 +g47 +sssS'sg_task_order' +p17297 +(dp17298 +S'mandatory' +p17299 +(dp17300 +S'editable' +p17301 +I00 +sS'value' +p17302 +I00 +ssS'name' +p17303 +(dp17304 +S'editable' +p17305 +I01 +sS'value' +p17306 +S'Task Order' +p17307 +ssS'data_type' +p17308 +(dp17309 +S'editable' +p17310 +I00 +sS'value' +p17311 +S'number' +p17312 +ssS'entity_type' +p17313 +(dp17314 +S'editable' +p17315 +I00 +sS'value' +p17316 +S'Task' +p17317 +ssS'editable' +p17318 +(dp17319 +S'editable' +p17320 +I00 +sS'value' +p17321 +I01 +ssS'unique' +p17322 +(dp17323 +S'editable' +p17324 +I00 +sS'value' +p17325 +I00 +ssS'properties' +p17326 +(dp17327 +S'default_value' +p17328 +(dp17329 +S'editable' +p17330 +I00 +sS'value' +p17331 +NssS'summary_default' +p17332 +(dp17333 +S'editable' +p17334 +I01 +sS'value' +p17335 +S'none' +p17336 +sssS'description' +p17337 +(dp17338 +S'editable' +p17339 +I01 +sS'value' +p17340 +g47 +sssS'downstream_tasks' +p17341 +(dp17342 +S'mandatory' +p17343 +(dp17344 +S'editable' +p17345 +I00 +sS'value' +p17346 +I00 +ssS'name' +p17347 +(dp17348 +S'editable' +p17349 +I01 +sS'value' +p17350 +S'Downstream Dependency' +p17351 +ssS'data_type' +p17352 +(dp17353 +S'editable' +p17354 +I00 +sS'value' +p17355 +S'multi_entity' +p17356 +ssS'entity_type' +p17357 +(dp17358 +S'editable' +p17359 +I00 +sS'value' +p17360 +S'Task' +p17361 +ssS'editable' +p17362 +(dp17363 +S'editable' +p17364 +I00 +sS'value' +p17365 +I01 +ssS'unique' +p17366 +(dp17367 +S'editable' +p17368 +I00 +sS'value' +p17369 +I00 +ssS'properties' +p17370 +(dp17371 +S'default_value' +p17372 +(dp17373 +S'editable' +p17374 +I00 +sS'value' +p17375 +NssS'summary_default' +p17376 +(dp17377 +S'editable' +p17378 +I00 +sS'value' +p17379 +S'none' +p17380 +ssS'valid_types' +p17381 +(dp17382 +S'editable' +p17383 +I00 +sS'value' +p17384 +(lp17385 +S'Task' +p17386 +asssS'description' +p17387 +(dp17388 +S'editable' +p17389 +I01 +sS'value' +p17390 +g47 +sssS'open_notes' +p17391 +(dp17392 +S'mandatory' +p17393 +(dp17394 +S'editable' +p17395 +I00 +sS'value' +p17396 +I00 +ssS'name' +p17397 +(dp17398 +S'editable' +p17399 +I01 +sS'value' +p17400 +S'Open Notes' +p17401 +ssS'data_type' +p17402 +(dp17403 +S'editable' +p17404 +I00 +sS'value' +p17405 +S'multi_entity' +p17406 +ssS'entity_type' +p17407 +(dp17408 +S'editable' +p17409 +I00 +sS'value' +p17410 +S'Task' +p17411 +ssS'editable' +p17412 +(dp17413 +S'editable' +p17414 +I00 +sS'value' +p17415 +I00 +ssS'unique' +p17416 +(dp17417 +S'editable' +p17418 +I00 +sS'value' +p17419 +I00 +ssS'properties' +p17420 +(dp17421 +S'default_value' +p17422 +(dp17423 +S'editable' +p17424 +I00 +sS'value' +p17425 +NssS'summary_default' +p17426 +(dp17427 +S'editable' +p17428 +I01 +sS'value' +p17429 +S'none' +p17430 +ssS'valid_types' +p17431 +(dp17432 +S'editable' +p17433 +I01 +sS'value' +p17434 +(lp17435 +S'Note' +p17436 +asssS'description' +p17437 +(dp17438 +S'editable' +p17439 +I01 +sS'value' +p17440 +g47 +sssS'addressings_cc' +p17441 +(dp17442 +S'mandatory' +p17443 +(dp17444 +S'editable' +p17445 +I00 +sS'value' +p17446 +I00 +ssS'name' +p17447 +(dp17448 +S'editable' +p17449 +I01 +sS'value' +p17450 +S'Cc' +p17451 +ssS'data_type' +p17452 +(dp17453 +S'editable' +p17454 +I00 +sS'value' +p17455 +S'multi_entity' +p17456 +ssS'entity_type' +p17457 +(dp17458 +S'editable' +p17459 +I00 +sS'value' +p17460 +S'Task' +p17461 +ssS'editable' +p17462 +(dp17463 +S'editable' +p17464 +I00 +sS'value' +p17465 +I01 +ssS'unique' +p17466 +(dp17467 +S'editable' +p17468 +I00 +sS'value' +p17469 +I00 +ssS'properties' +p17470 +(dp17471 +S'default_value' +p17472 +(dp17473 +S'editable' +p17474 +I00 +sS'value' +p17475 +NssS'summary_default' +p17476 +(dp17477 +S'editable' +p17478 +I01 +sS'value' +p17479 +S'none' +p17480 +ssS'valid_types' +p17481 +(dp17482 +S'editable' +p17483 +I01 +sS'value' +p17484 +(lp17485 +S'Group' +p17486 +aS'HumanUser' +p17487 +asssS'description' +p17488 +(dp17489 +S'editable' +p17490 +I01 +sS'value' +p17491 +g47 +sssS'inventory_date' +p17492 +(dp17493 +S'mandatory' +p17494 +(dp17495 +S'editable' +p17496 +I00 +sS'value' +p17497 +I00 +ssS'name' +p17498 +(dp17499 +S'editable' +p17500 +I01 +sS'value' +p17501 +S'Inventory Date' +p17502 +ssS'data_type' +p17503 +(dp17504 +S'editable' +p17505 +I00 +sS'value' +p17506 +S'date' +p17507 +ssS'entity_type' +p17508 +(dp17509 +S'editable' +p17510 +I00 +sS'value' +p17511 +S'Task' +p17512 +ssS'editable' +p17513 +(dp17514 +S'editable' +p17515 +I00 +sS'value' +p17516 +I00 +ssS'unique' +p17517 +(dp17518 +S'editable' +p17519 +I00 +sS'value' +p17520 +I00 +ssS'properties' +p17521 +(dp17522 +S'default_value' +p17523 +(dp17524 +S'editable' +p17525 +I00 +sS'value' +p17526 +NssS'summary_default' +p17527 +(dp17528 +S'editable' +p17529 +I00 +sS'value' +p17530 +S'none' +p17531 +sssS'description' +p17532 +(dp17533 +S'editable' +p17534 +I01 +sS'value' +p17535 +g47 +sssS'task_template' +p17536 +(dp17537 +S'mandatory' +p17538 +(dp17539 +S'editable' +p17540 +I00 +sS'value' +p17541 +I00 +ssS'name' +p17542 +(dp17543 +S'editable' +p17544 +I01 +sS'value' +p17545 +S'Task Template' +p17546 +ssS'data_type' +p17547 +(dp17548 +S'editable' +p17549 +I00 +sS'value' +p17550 +S'entity' +p17551 +ssS'entity_type' +p17552 +(dp17553 +S'editable' +p17554 +I00 +sS'value' +p17555 +S'Task' +p17556 +ssS'editable' +p17557 +(dp17558 +S'editable' +p17559 +I00 +sS'value' +p17560 +I01 +ssS'unique' +p17561 +(dp17562 +S'editable' +p17563 +I00 +sS'value' +p17564 +I00 +ssS'properties' +p17565 +(dp17566 +S'default_value' +p17567 +(dp17568 +S'editable' +p17569 +I00 +sS'value' +p17570 +NssS'summary_default' +p17571 +(dp17572 +S'editable' +p17573 +I01 +sS'value' +p17574 +S'none' +p17575 +ssS'valid_types' +p17576 +(dp17577 +S'editable' +p17578 +I01 +sS'value' +p17579 +(lp17580 +S'TaskTemplate' +p17581 +asssS'description' +p17582 +(dp17583 +S'editable' +p17584 +I01 +sS'value' +p17585 +g47 +sssS'created_by' +p17586 +(dp17587 +S'mandatory' +p17588 +(dp17589 +S'editable' +p17590 +I00 +sS'value' +p17591 +I00 +ssS'name' +p17592 +(dp17593 +S'editable' +p17594 +I01 +sS'value' +p17595 +S'Created by' +p17596 +ssS'data_type' +p17597 +(dp17598 +S'editable' +p17599 +I00 +sS'value' +p17600 +S'entity' +p17601 +ssS'entity_type' +p17602 +(dp17603 +S'editable' +p17604 +I00 +sS'value' +p17605 +S'Task' +p17606 +ssS'editable' +p17607 +(dp17608 +S'editable' +p17609 +I00 +sS'value' +p17610 +I00 +ssS'unique' +p17611 +(dp17612 +S'editable' +p17613 +I00 +sS'value' +p17614 +I00 +ssS'properties' +p17615 +(dp17616 +S'default_value' +p17617 +(dp17618 +S'editable' +p17619 +I00 +sS'value' +p17620 +NssS'summary_default' +p17621 +(dp17622 +S'editable' +p17623 +I01 +sS'value' +p17624 +S'none' +p17625 +ssS'valid_types' +p17626 +(dp17627 +S'editable' +p17628 +I01 +sS'value' +p17629 +(lp17630 +S'HumanUser' +p17631 +aS'ApiUser' +p17632 +asssS'description' +p17633 +(dp17634 +S'editable' +p17635 +I01 +sS'value' +p17636 +g47 +sssS'content' +p17637 +(dp17638 +S'mandatory' +p17639 +(dp17640 +S'editable' +p17641 +I00 +sS'value' +p17642 +I01 +ssS'name' +p17643 +(dp17644 +S'editable' +p17645 +I01 +sS'value' +p17646 +S'Task Name' +p17647 +ssS'data_type' +p17648 +(dp17649 +S'editable' +p17650 +I00 +sS'value' +p17651 +S'text' +p17652 +ssS'entity_type' +p17653 +(dp17654 +S'editable' +p17655 +I00 +sS'value' +p17656 +S'Task' +p17657 +ssS'editable' +p17658 +(dp17659 +S'editable' +p17660 +I00 +sS'value' +p17661 +I01 +ssS'unique' +p17662 +(dp17663 +S'editable' +p17664 +I00 +sS'value' +p17665 +I00 +ssS'properties' +p17666 +(dp17667 +S'default_value' +p17668 +(dp17669 +S'editable' +p17670 +I00 +sS'value' +p17671 +NssS'summary_default' +p17672 +(dp17673 +S'editable' +p17674 +I01 +sS'value' +p17675 +S'record_count' +p17676 +sssS'description' +p17677 +(dp17678 +S'editable' +p17679 +I01 +sS'value' +p17680 +g47 +sssS'sg_status_list' +p17681 +(dp17682 +S'mandatory' +p17683 +(dp17684 +S'editable' +p17685 +I00 +sS'value' +p17686 +I00 +ssS'name' +p17687 +(dp17688 +S'editable' +p17689 +I01 +sS'value' +p17690 +S'Status' +p17691 +ssS'data_type' +p17692 +(dp17693 +S'editable' +p17694 +I00 +sS'value' +p17695 +S'status_list' +p17696 +ssS'entity_type' +p17697 +(dp17698 +S'editable' +p17699 +I00 +sS'value' +p17700 +S'Task' +p17701 +ssS'editable' +p17702 +(dp17703 +S'editable' +p17704 +I00 +sS'value' +p17705 +I01 +ssS'unique' +p17706 +(dp17707 +S'editable' +p17708 +I00 +sS'value' +p17709 +I00 +ssS'properties' +p17710 +(dp17711 +S'default_value' +p17712 +(dp17713 +S'editable' +p17714 +I01 +sS'value' +p17715 +S'wtg' +p17716 +ssS'valid_values' +p17717 +(dp17718 +S'editable' +p17719 +I01 +sS'value' +p17720 +(lp17721 +S'fin' +p17722 +aS'ip' +p17723 +aS'hld' +p17724 +aS'rdy' +p17725 +aS'wtg' +p17726 +assS'summary_default' +p17727 +(dp17728 +S'editable' +p17729 +I01 +sS'value' +p17730 +S'status_percentage' +p17731 +sssS'description' +p17732 +(dp17733 +S'editable' +p17734 +I01 +sS'value' +p17735 +g47 +sssS'time_logs_sum' +p17736 +(dp17737 +S'mandatory' +p17738 +(dp17739 +S'editable' +p17740 +I00 +sS'value' +p17741 +I00 +ssS'name' +p17742 +(dp17743 +S'editable' +p17744 +I01 +sS'value' +p17745 +S'Time Logged' +p17746 +ssS'data_type' +p17747 +(dp17748 +S'editable' +p17749 +I00 +sS'value' +p17750 +S'duration' +p17751 +ssS'entity_type' +p17752 +(dp17753 +S'editable' +p17754 +I00 +sS'value' +p17755 +S'Task' +p17756 +ssS'editable' +p17757 +(dp17758 +S'editable' +p17759 +I00 +sS'value' +p17760 +I00 +ssS'unique' +p17761 +(dp17762 +S'editable' +p17763 +I00 +sS'value' +p17764 +I00 +ssS'properties' +p17765 +(dp17766 +S'default_value' +p17767 +(dp17768 +S'editable' +p17769 +I00 +sS'value' +p17770 +I0 +ssS'summary_default' +p17771 +(dp17772 +S'editable' +p17773 +I01 +sS'value' +p17774 +S'sum' +p17775 +sssS'description' +p17776 +(dp17777 +S'editable' +p17778 +I01 +sS'value' +p17779 +g47 +sssS'start_date' +p17780 +(dp17781 +S'mandatory' +p17782 +(dp17783 +S'editable' +p17784 +I00 +sS'value' +p17785 +I00 +ssS'name' +p17786 +(dp17787 +S'editable' +p17788 +I01 +sS'value' +p17789 +S'Start Date' +p17790 +ssS'data_type' +p17791 +(dp17792 +S'editable' +p17793 +I00 +sS'value' +p17794 +S'date' +p17795 +ssS'entity_type' +p17796 +(dp17797 +S'editable' +p17798 +I00 +sS'value' +p17799 +S'Task' +p17800 +ssS'editable' +p17801 +(dp17802 +S'editable' +p17803 +I00 +sS'value' +p17804 +I01 +ssS'unique' +p17805 +(dp17806 +S'editable' +p17807 +I00 +sS'value' +p17808 +I00 +ssS'properties' +p17809 +(dp17810 +S'default_value' +p17811 +(dp17812 +S'editable' +p17813 +I00 +sS'value' +p17814 +NssS'summary_default' +p17815 +(dp17816 +S'editable' +p17817 +I01 +sS'value' +p17818 +S'earliest' +p17819 +sssS'description' +p17820 +(dp17821 +S'editable' +p17822 +I01 +sS'value' +p17823 +g47 +sssS'sibling_tasks' +p17824 +(dp17825 +S'mandatory' +p17826 +(dp17827 +S'editable' +p17828 +I00 +sS'value' +p17829 +I00 +ssS'name' +p17830 +(dp17831 +S'editable' +p17832 +I01 +sS'value' +p17833 +S'Sibling Tasks' +p17834 +ssS'data_type' +p17835 +(dp17836 +S'editable' +p17837 +I00 +sS'value' +p17838 +S'multi_entity' +p17839 +ssS'entity_type' +p17840 +(dp17841 +S'editable' +p17842 +I00 +sS'value' +p17843 +S'Task' +p17844 +ssS'editable' +p17845 +(dp17846 +S'editable' +p17847 +I00 +sS'value' +p17848 +I00 +ssS'unique' +p17849 +(dp17850 +S'editable' +p17851 +I00 +sS'value' +p17852 +I00 +ssS'properties' +p17853 +(dp17854 +S'default_value' +p17855 +(dp17856 +S'editable' +p17857 +I00 +sS'value' +p17858 +NssS'summary_default' +p17859 +(dp17860 +S'editable' +p17861 +I01 +sS'value' +p17862 +S'none' +p17863 +ssS'valid_types' +p17864 +(dp17865 +S'editable' +p17866 +I01 +sS'value' +p17867 +(lp17868 +S'Task' +p17869 +asssS'description' +p17870 +(dp17871 +S'editable' +p17872 +I01 +sS'value' +p17873 +g47 +sssS'due_date' +p17874 +(dp17875 +S'mandatory' +p17876 +(dp17877 +S'editable' +p17878 +I00 +sS'value' +p17879 +I00 +ssS'name' +p17880 +(dp17881 +S'editable' +p17882 +I01 +sS'value' +p17883 +S'Due Date' +p17884 +ssS'data_type' +p17885 +(dp17886 +S'editable' +p17887 +I00 +sS'value' +p17888 +S'date' +p17889 +ssS'entity_type' +p17890 +(dp17891 +S'editable' +p17892 +I00 +sS'value' +p17893 +S'Task' +p17894 +ssS'editable' +p17895 +(dp17896 +S'editable' +p17897 +I00 +sS'value' +p17898 +I01 +ssS'unique' +p17899 +(dp17900 +S'editable' +p17901 +I00 +sS'value' +p17902 +I00 +ssS'properties' +p17903 +(dp17904 +S'default_value' +p17905 +(dp17906 +S'editable' +p17907 +I00 +sS'value' +p17908 +NssS'summary_default' +p17909 +(dp17910 +S'editable' +p17911 +I01 +sS'value' +p17912 +S'latest' +p17913 +sssS'description' +p17914 +(dp17915 +S'editable' +p17916 +I01 +sS'value' +p17917 +g47 +sssS'updated_by' +p17918 +(dp17919 +S'mandatory' +p17920 +(dp17921 +S'editable' +p17922 +I00 +sS'value' +p17923 +I00 +ssS'name' +p17924 +(dp17925 +S'editable' +p17926 +I01 +sS'value' +p17927 +S'Updated by' +p17928 +ssS'data_type' +p17929 +(dp17930 +S'editable' +p17931 +I00 +sS'value' +p17932 +S'entity' +p17933 +ssS'entity_type' +p17934 +(dp17935 +S'editable' +p17936 +I00 +sS'value' +p17937 +S'Task' +p17938 +ssS'editable' +p17939 +(dp17940 +S'editable' +p17941 +I00 +sS'value' +p17942 +I00 +ssS'unique' +p17943 +(dp17944 +S'editable' +p17945 +I00 +sS'value' +p17946 +I00 +ssS'properties' +p17947 +(dp17948 +S'default_value' +p17949 +(dp17950 +S'editable' +p17951 +I00 +sS'value' +p17952 +NssS'summary_default' +p17953 +(dp17954 +S'editable' +p17955 +I01 +sS'value' +p17956 +S'none' +p17957 +ssS'valid_types' +p17958 +(dp17959 +S'editable' +p17960 +I01 +sS'value' +p17961 +(lp17962 +S'HumanUser' +p17963 +aS'ApiUser' +p17964 +asssS'description' +p17965 +(dp17966 +S'editable' +p17967 +I01 +sS'value' +p17968 +g47 +sssS'upstream_tasks' +p17969 +(dp17970 +S'mandatory' +p17971 +(dp17972 +S'editable' +p17973 +I00 +sS'value' +p17974 +I00 +ssS'name' +p17975 +(dp17976 +S'editable' +p17977 +I01 +sS'value' +p17978 +S'Upstream Dependency' +p17979 +ssS'data_type' +p17980 +(dp17981 +S'editable' +p17982 +I00 +sS'value' +p17983 +S'multi_entity' +p17984 +ssS'entity_type' +p17985 +(dp17986 +S'editable' +p17987 +I00 +sS'value' +p17988 +S'Task' +p17989 +ssS'editable' +p17990 +(dp17991 +S'editable' +p17992 +I00 +sS'value' +p17993 +I01 +ssS'unique' +p17994 +(dp17995 +S'editable' +p17996 +I00 +sS'value' +p17997 +I00 +ssS'properties' +p17998 +(dp17999 +S'default_value' +p18000 +(dp18001 +S'editable' +p18002 +I00 +sS'value' +p18003 +NssS'summary_default' +p18004 +(dp18005 +S'editable' +p18006 +I00 +sS'value' +p18007 +S'none' +p18008 +ssS'valid_types' +p18009 +(dp18010 +S'editable' +p18011 +I00 +sS'value' +p18012 +(lp18013 +S'Task' +p18014 +asssS'description' +p18015 +(dp18016 +S'editable' +p18017 +I01 +sS'value' +p18018 +g47 +sssS'dependency_violation' +p18019 +(dp18020 +S'mandatory' +p18021 +(dp18022 +S'editable' +p18023 +I00 +sS'value' +p18024 +I00 +ssS'name' +p18025 +(dp18026 +S'editable' +p18027 +I01 +sS'value' +p18028 +S'Dependency Violation' +p18029 +ssS'data_type' +p18030 +(dp18031 +S'editable' +p18032 +I00 +sS'value' +p18033 +S'checkbox' +p18034 +ssS'entity_type' +p18035 +(dp18036 +S'editable' +p18037 +I00 +sS'value' +p18038 +S'Task' +p18039 +ssS'editable' +p18040 +(dp18041 +S'editable' +p18042 +I00 +sS'value' +p18043 +I00 +ssS'unique' +p18044 +(dp18045 +S'editable' +p18046 +I00 +sS'value' +p18047 +I00 +ssS'properties' +p18048 +(dp18049 +S'default_value' +p18050 +(dp18051 +S'editable' +p18052 +I00 +sS'value' +p18053 +I00 +ssS'summary_default' +p18054 +(dp18055 +S'editable' +p18056 +I00 +sS'value' +p18057 +S'none' +p18058 +sssS'description' +p18059 +(dp18060 +S'editable' +p18061 +I01 +sS'value' +p18062 +g47 +sssS'time_vs_est' +p18063 +(dp18064 +S'mandatory' +p18065 +(dp18066 +S'editable' +p18067 +I00 +sS'value' +p18068 +I00 +ssS'name' +p18069 +(dp18070 +S'editable' +p18071 +I01 +sS'value' +p18072 +S'Time Logged - Over/Under Bid' +p18073 +ssS'data_type' +p18074 +(dp18075 +S'editable' +p18076 +I00 +sS'value' +p18077 +S'duration' +p18078 +ssS'entity_type' +p18079 +(dp18080 +S'editable' +p18081 +I00 +sS'value' +p18082 +S'Task' +p18083 +ssS'editable' +p18084 +(dp18085 +S'editable' +p18086 +I00 +sS'value' +p18087 +I00 +ssS'unique' +p18088 +(dp18089 +S'editable' +p18090 +I00 +sS'value' +p18091 +I00 +ssS'properties' +p18092 +(dp18093 +S'default_value' +p18094 +(dp18095 +S'editable' +p18096 +I00 +sS'value' +p18097 +NssS'summary_default' +p18098 +(dp18099 +S'editable' +p18100 +I01 +sS'value' +p18101 +S'sum' +p18102 +sssS'description' +p18103 +(dp18104 +S'editable' +p18105 +I01 +sS'value' +p18106 +g47 +sssS'template_task' +p18107 +(dp18108 +S'mandatory' +p18109 +(dp18110 +S'editable' +p18111 +I00 +sS'value' +p18112 +I00 +ssS'name' +p18113 +(dp18114 +S'editable' +p18115 +I01 +sS'value' +p18116 +S'Template Task' +p18117 +ssS'data_type' +p18118 +(dp18119 +S'editable' +p18120 +I00 +sS'value' +p18121 +S'entity' +p18122 +ssS'entity_type' +p18123 +(dp18124 +S'editable' +p18125 +I00 +sS'value' +p18126 +S'Task' +p18127 +ssS'editable' +p18128 +(dp18129 +S'editable' +p18130 +I00 +sS'value' +p18131 +I00 +ssS'unique' +p18132 +(dp18133 +S'editable' +p18134 +I00 +sS'value' +p18135 +I00 +ssS'properties' +p18136 +(dp18137 +S'default_value' +p18138 +(dp18139 +S'editable' +p18140 +I00 +sS'value' +p18141 +NssS'summary_default' +p18142 +(dp18143 +S'editable' +p18144 +I01 +sS'value' +p18145 +S'none' +p18146 +ssS'valid_types' +p18147 +(dp18148 +S'editable' +p18149 +I01 +sS'value' +p18150 +(lp18151 +S'Task' +p18152 +asssS'description' +p18153 +(dp18154 +S'editable' +p18155 +I01 +sS'value' +p18156 +g47 +sssS'step' +p18157 +(dp18158 +S'mandatory' +p18159 +(dp18160 +S'editable' +p18161 +I00 +sS'value' +p18162 +I00 +ssS'name' +p18163 +(dp18164 +S'editable' +p18165 +I01 +sS'value' +p18166 +S'Pipeline Step' +p18167 +ssS'data_type' +p18168 +(dp18169 +S'editable' +p18170 +I00 +sS'value' +p18171 +S'entity' +p18172 +ssS'entity_type' +p18173 +(dp18174 +S'editable' +p18175 +I00 +sS'value' +p18176 +S'Task' +p18177 +ssS'editable' +p18178 +(dp18179 +S'editable' +p18180 +I00 +sS'value' +p18181 +I01 +ssS'unique' +p18182 +(dp18183 +S'editable' +p18184 +I00 +sS'value' +p18185 +I00 +ssS'properties' +p18186 +(dp18187 +S'default_value' +p18188 +(dp18189 +S'editable' +p18190 +I00 +sS'value' +p18191 +NssS'summary_default' +p18192 +(dp18193 +S'editable' +p18194 +I01 +sS'value' +p18195 +S'none' +p18196 +ssS'valid_types' +p18197 +(dp18198 +S'editable' +p18199 +I01 +sS'value' +p18200 +(lp18201 +S'Step' +p18202 +asssS'description' +p18203 +(dp18204 +S'editable' +p18205 +I01 +sS'value' +p18206 +g47 +sssS'milestone' +p18207 +(dp18208 +S'mandatory' +p18209 +(dp18210 +S'editable' +p18211 +I00 +sS'value' +p18212 +I00 +ssS'name' +p18213 +(dp18214 +S'editable' +p18215 +I01 +sS'value' +p18216 +S'Milestone' +p18217 +ssS'data_type' +p18218 +(dp18219 +S'editable' +p18220 +I00 +sS'value' +p18221 +S'checkbox' +p18222 +ssS'entity_type' +p18223 +(dp18224 +S'editable' +p18225 +I00 +sS'value' +p18226 +S'Task' +p18227 +ssS'editable' +p18228 +(dp18229 +S'editable' +p18230 +I00 +sS'value' +p18231 +I01 +ssS'unique' +p18232 +(dp18233 +S'editable' +p18234 +I00 +sS'value' +p18235 +I00 +ssS'properties' +p18236 +(dp18237 +S'default_value' +p18238 +(dp18239 +S'editable' +p18240 +I00 +sS'value' +p18241 +I00 +ssS'summary_default' +p18242 +(dp18243 +S'editable' +p18244 +I01 +sS'value' +p18245 +S'none' +p18246 +sssS'description' +p18247 +(dp18248 +S'editable' +p18249 +I01 +sS'value' +p18250 +g47 +sssS'time_percent_of_est' +p18251 +(dp18252 +S'mandatory' +p18253 +(dp18254 +S'editable' +p18255 +I00 +sS'value' +p18256 +I00 +ssS'name' +p18257 +(dp18258 +S'editable' +p18259 +I01 +sS'value' +p18260 +S'Time Logged - % of Bid' +p18261 +ssS'data_type' +p18262 +(dp18263 +S'editable' +p18264 +I00 +sS'value' +p18265 +S'percent' +p18266 +ssS'entity_type' +p18267 +(dp18268 +S'editable' +p18269 +I00 +sS'value' +p18270 +S'Task' +p18271 +ssS'editable' +p18272 +(dp18273 +S'editable' +p18274 +I00 +sS'value' +p18275 +I00 +ssS'unique' +p18276 +(dp18277 +S'editable' +p18278 +I00 +sS'value' +p18279 +I00 +ssS'properties' +p18280 +(dp18281 +S'default_value' +p18282 +(dp18283 +S'editable' +p18284 +I00 +sS'value' +p18285 +NssS'summary_default' +p18286 +(dp18287 +S'editable' +p18288 +I01 +sS'value' +p18289 +S'none' +p18290 +sssS'description' +p18291 +(dp18292 +S'editable' +p18293 +I01 +sS'value' +p18294 +g47 +sssS'splits' +p18295 +(dp18296 +S'mandatory' +p18297 +(dp18298 +S'editable' +p18299 +I00 +sS'value' +p18300 +I00 +ssS'name' +p18301 +(dp18302 +S'editable' +p18303 +I01 +sS'value' +p18304 +S'Splits' +p18305 +ssS'data_type' +p18306 +(dp18307 +S'editable' +p18308 +I00 +sS'value' +p18309 +S'serializable' +p18310 +ssS'entity_type' +p18311 +(dp18312 +S'editable' +p18313 +I00 +sS'value' +p18314 +S'Task' +p18315 +ssS'editable' +p18316 +(dp18317 +S'editable' +p18318 +I00 +sS'value' +p18319 +I01 +ssS'unique' +p18320 +(dp18321 +S'editable' +p18322 +I00 +sS'value' +p18323 +I00 +ssS'properties' +p18324 +(dp18325 +S'default_value' +p18326 +(dp18327 +S'editable' +p18328 +I00 +sS'value' +p18329 +NssS'summary_default' +p18330 +(dp18331 +S'editable' +p18332 +I00 +sS'value' +p18333 +S'none' +p18334 +sssS'description' +p18335 +(dp18336 +S'editable' +p18337 +I01 +sS'value' +p18338 +g47 +sssS'created_at' +p18339 +(dp18340 +S'mandatory' +p18341 +(dp18342 +S'editable' +p18343 +I00 +sS'value' +p18344 +I00 +ssS'name' +p18345 +(dp18346 +S'editable' +p18347 +I01 +sS'value' +p18348 +S'Date Created' +p18349 +ssS'data_type' +p18350 +(dp18351 +S'editable' +p18352 +I00 +sS'value' +p18353 +S'date_time' +p18354 +ssS'entity_type' +p18355 +(dp18356 +S'editable' +p18357 +I00 +sS'value' +p18358 +S'Task' +p18359 +ssS'editable' +p18360 +(dp18361 +S'editable' +p18362 +I00 +sS'value' +p18363 +I00 +ssS'unique' +p18364 +(dp18365 +S'editable' +p18366 +I00 +sS'value' +p18367 +I00 +ssS'properties' +p18368 +(dp18369 +S'default_value' +p18370 +(dp18371 +S'editable' +p18372 +I00 +sS'value' +p18373 +NssS'summary_default' +p18374 +(dp18375 +S'editable' +p18376 +I01 +sS'value' +p18377 +S'none' +p18378 +sssS'description' +p18379 +(dp18380 +S'editable' +p18381 +I01 +sS'value' +p18382 +g47 +sssS'project' +p18383 +(dp18384 +S'mandatory' +p18385 +(dp18386 +S'editable' +p18387 +I00 +sS'value' +p18388 +I00 +ssS'name' +p18389 +(dp18390 +S'editable' +p18391 +I01 +sS'value' +p18392 +S'Project' +p18393 +ssS'data_type' +p18394 +(dp18395 +S'editable' +p18396 +I00 +sS'value' +p18397 +S'entity' +p18398 +ssS'entity_type' +p18399 +(dp18400 +S'editable' +p18401 +I00 +sS'value' +p18402 +S'Task' +p18403 +ssS'editable' +p18404 +(dp18405 +S'editable' +p18406 +I00 +sS'value' +p18407 +I01 +ssS'unique' +p18408 +(dp18409 +S'editable' +p18410 +I00 +sS'value' +p18411 +I00 +ssS'properties' +p18412 +(dp18413 +S'default_value' +p18414 +(dp18415 +S'editable' +p18416 +I00 +sS'value' +p18417 +NssS'summary_default' +p18418 +(dp18419 +S'editable' +p18420 +I01 +sS'value' +p18421 +S'none' +p18422 +ssS'valid_types' +p18423 +(dp18424 +S'editable' +p18425 +I01 +sS'value' +p18426 +(lp18427 +S'Project' +p18428 +asssS'description' +p18429 +(dp18430 +S'editable' +p18431 +I01 +sS'value' +p18432 +g47 +sssS'filmstrip_image' +p18433 +(dp18434 +S'mandatory' +p18435 +(dp18436 +S'editable' +p18437 +I00 +sS'value' +p18438 +I00 +ssS'name' +p18439 +(dp18440 +S'editable' +p18441 +I01 +sS'value' +p18442 +S'Filmstrip Thumbnail' +p18443 +ssS'data_type' +p18444 +(dp18445 +S'editable' +p18446 +I00 +sS'value' +p18447 +S'image' +p18448 +ssS'entity_type' +p18449 +(dp18450 +S'editable' +p18451 +I00 +sS'value' +p18452 +S'Task' +p18453 +ssS'editable' +p18454 +(dp18455 +S'editable' +p18456 +I00 +sS'value' +p18457 +I01 +ssS'unique' +p18458 +(dp18459 +S'editable' +p18460 +I00 +sS'value' +p18461 +I00 +ssS'properties' +p18462 +(dp18463 +S'default_value' +p18464 +(dp18465 +S'editable' +p18466 +I00 +sS'value' +p18467 +NssS'summary_default' +p18468 +(dp18469 +S'editable' +p18470 +I01 +sS'value' +p18471 +S'none' +p18472 +sssS'description' +p18473 +(dp18474 +S'editable' +p18475 +I01 +sS'value' +p18476 +g47 +sssS'est_in_mins' +p18477 +(dp18478 +S'mandatory' +p18479 +(dp18480 +S'editable' +p18481 +I00 +sS'value' +p18482 +I00 +ssS'name' +p18483 +(dp18484 +S'editable' +p18485 +I01 +sS'value' +p18486 +S'Bid' +p18487 +ssS'data_type' +p18488 +(dp18489 +S'editable' +p18490 +I00 +sS'value' +p18491 +S'duration' +p18492 +ssS'entity_type' +p18493 +(dp18494 +S'editable' +p18495 +I00 +sS'value' +p18496 +S'Task' +p18497 +ssS'editable' +p18498 +(dp18499 +S'editable' +p18500 +I00 +sS'value' +p18501 +I01 +ssS'unique' +p18502 +(dp18503 +S'editable' +p18504 +I00 +sS'value' +p18505 +I00 +ssS'properties' +p18506 +(dp18507 +S'default_value' +p18508 +(dp18509 +S'editable' +p18510 +I00 +sS'value' +p18511 +NssS'summary_default' +p18512 +(dp18513 +S'editable' +p18514 +I01 +sS'value' +p18515 +S'sum' +p18516 +sssS'description' +p18517 +(dp18518 +S'editable' +p18519 +I01 +sS'value' +p18520 +g47 +sssS'tag_list' +p18521 +(dp18522 +S'mandatory' +p18523 +(dp18524 +S'editable' +p18525 +I00 +sS'value' +p18526 +I00 +ssS'name' +p18527 +(dp18528 +S'editable' +p18529 +I01 +sS'value' +p18530 +S'Tags' +p18531 +ssS'data_type' +p18532 +(dp18533 +S'editable' +p18534 +I00 +sS'value' +p18535 +S'tag_list' +p18536 +ssS'entity_type' +p18537 +(dp18538 +S'editable' +p18539 +I00 +sS'value' +p18540 +S'Task' +p18541 +ssS'editable' +p18542 +(dp18543 +S'editable' +p18544 +I00 +sS'value' +p18545 +I01 +ssS'unique' +p18546 +(dp18547 +S'editable' +p18548 +I00 +sS'value' +p18549 +I00 +ssS'properties' +p18550 +(dp18551 +S'default_value' +p18552 +(dp18553 +S'editable' +p18554 +I00 +sS'value' +p18555 +NssS'summary_default' +p18556 +(dp18557 +S'editable' +p18558 +I01 +sS'value' +p18559 +S'none' +p18560 +ssS'valid_types' +p18561 +(dp18562 +S'editable' +p18563 +I01 +sS'value' +p18564 +(lp18565 +S'Tag' +p18566 +asssS'description' +p18567 +(dp18568 +S'editable' +p18569 +I01 +sS'value' +p18570 +g47 +sssS'notes' +p18571 +(dp18572 +S'mandatory' +p18573 +(dp18574 +S'editable' +p18575 +I00 +sS'value' +p18576 +I00 +ssS'name' +p18577 +(dp18578 +S'editable' +p18579 +I01 +sS'value' +p18580 +S'Notes' +p18581 +ssS'data_type' +p18582 +(dp18583 +S'editable' +p18584 +I00 +sS'value' +p18585 +S'multi_entity' +p18586 +ssS'entity_type' +p18587 +(dp18588 +S'editable' +p18589 +I00 +sS'value' +p18590 +S'Task' +p18591 +ssS'editable' +p18592 +(dp18593 +S'editable' +p18594 +I00 +sS'value' +p18595 +I01 +ssS'unique' +p18596 +(dp18597 +S'editable' +p18598 +I00 +sS'value' +p18599 +I00 +ssS'properties' +p18600 +(dp18601 +S'default_value' +p18602 +(dp18603 +S'editable' +p18604 +I00 +sS'value' +p18605 +NssS'summary_default' +p18606 +(dp18607 +S'editable' +p18608 +I01 +sS'value' +p18609 +S'none' +p18610 +ssS'valid_types' +p18611 +(dp18612 +S'editable' +p18613 +I01 +sS'value' +p18614 +(lp18615 +S'Note' +p18616 +asssS'description' +p18617 +(dp18618 +S'editable' +p18619 +I01 +sS'value' +p18620 +g47 +ssssS'CustomNonProjectEntity01' +p18621 +(dp18622 +S'created_at' +p18623 +(dp18624 +S'mandatory' +p18625 +(dp18626 +S'editable' +p18627 +I00 +sS'value' +p18628 +I00 +ssS'name' +p18629 +(dp18630 +S'editable' +p18631 +I01 +sS'value' +p18632 +S'Date Created' +p18633 +ssS'data_type' +p18634 +(dp18635 +S'editable' +p18636 +I00 +sS'value' +p18637 +S'date_time' +p18638 +ssS'entity_type' +p18639 +(dp18640 +S'editable' +p18641 +I00 +sS'value' +p18642 +S'CustomNonProjectEntity01' +p18643 +ssS'editable' +p18644 +(dp18645 +S'editable' +p18646 +I00 +sS'value' +p18647 +I00 +ssS'unique' +p18648 +(dp18649 +S'editable' +p18650 +I00 +sS'value' +p18651 +I00 +ssS'properties' +p18652 +(dp18653 +S'default_value' +p18654 +(dp18655 +S'editable' +p18656 +I00 +sS'value' +p18657 +NssS'summary_default' +p18658 +(dp18659 +S'editable' +p18660 +I01 +sS'value' +p18661 +S'none' +p18662 +sssS'description' +p18663 +(dp18664 +S'editable' +p18665 +I01 +sS'value' +p18666 +g47 +sssS'open_notes_count' +p18667 +(dp18668 +S'mandatory' +p18669 +(dp18670 +S'editable' +p18671 +I00 +sS'value' +p18672 +I00 +ssS'name' +p18673 +(dp18674 +S'editable' +p18675 +I01 +sS'value' +p18676 +S'Open Notes Count' +p18677 +ssS'data_type' +p18678 +(dp18679 +S'editable' +p18680 +I00 +sS'value' +p18681 +S'text' +p18682 +ssS'entity_type' +p18683 +(dp18684 +S'editable' +p18685 +I00 +sS'value' +p18686 +S'CustomNonProjectEntity01' +p18687 +ssS'editable' +p18688 +(dp18689 +S'editable' +p18690 +I00 +sS'value' +p18691 +I00 +ssS'unique' +p18692 +(dp18693 +S'editable' +p18694 +I00 +sS'value' +p18695 +I00 +ssS'properties' +p18696 +(dp18697 +S'default_value' +p18698 +(dp18699 +S'editable' +p18700 +I00 +sS'value' +p18701 +NssS'summary_default' +p18702 +(dp18703 +S'editable' +p18704 +I01 +sS'value' +p18705 +S'none' +p18706 +sssS'description' +p18707 +(dp18708 +S'editable' +p18709 +I01 +sS'value' +p18710 +g47 +sssS'code' +p18711 +(dp18712 +S'mandatory' +p18713 +(dp18714 +S'editable' +p18715 +I00 +sS'value' +p18716 +I01 +ssS'name' +p18717 +(dp18718 +S'editable' +p18719 +I01 +sS'value' +p18720 +S'Custom Non Project Entity01 Name' +p18721 +ssS'data_type' +p18722 +(dp18723 +S'editable' +p18724 +I00 +sS'value' +p18725 +S'text' +p18726 +ssS'entity_type' +p18727 +(dp18728 +S'editable' +p18729 +I00 +sS'value' +p18730 +S'CustomNonProjectEntity01' +p18731 +ssS'editable' +p18732 +(dp18733 +S'editable' +p18734 +I00 +sS'value' +p18735 +I01 +ssS'unique' +p18736 +(dp18737 +S'editable' +p18738 +I00 +sS'value' +p18739 +I00 +ssS'properties' +p18740 +(dp18741 +S'default_value' +p18742 +(dp18743 +S'editable' +p18744 +I00 +sS'value' +p18745 +NssS'summary_default' +p18746 +(dp18747 +S'editable' +p18748 +I01 +sS'value' +p18749 +S'none' +p18750 +sssS'description' +p18751 +(dp18752 +S'editable' +p18753 +I01 +sS'value' +p18754 +g47 +sssS'open_notes' +p18755 +(dp18756 +S'mandatory' +p18757 +(dp18758 +S'editable' +p18759 +I00 +sS'value' +p18760 +I00 +ssS'name' +p18761 +(dp18762 +S'editable' +p18763 +I01 +sS'value' +p18764 +S'Open Notes' +p18765 +ssS'data_type' +p18766 +(dp18767 +S'editable' +p18768 +I00 +sS'value' +p18769 +S'multi_entity' +p18770 +ssS'entity_type' +p18771 +(dp18772 +S'editable' +p18773 +I00 +sS'value' +p18774 +S'CustomNonProjectEntity01' +p18775 +ssS'editable' +p18776 +(dp18777 +S'editable' +p18778 +I00 +sS'value' +p18779 +I00 +ssS'unique' +p18780 +(dp18781 +S'editable' +p18782 +I00 +sS'value' +p18783 +I00 +ssS'properties' +p18784 +(dp18785 +S'default_value' +p18786 +(dp18787 +S'editable' +p18788 +I00 +sS'value' +p18789 +NssS'summary_default' +p18790 +(dp18791 +S'editable' +p18792 +I01 +sS'value' +p18793 +S'none' +p18794 +ssS'valid_types' +p18795 +(dp18796 +S'editable' +p18797 +I01 +sS'value' +p18798 +(lp18799 +S'Note' +p18800 +asssS'description' +p18801 +(dp18802 +S'editable' +p18803 +I01 +sS'value' +p18804 +g47 +sssS'description' +p18805 +(dp18806 +S'mandatory' +p18807 +(dp18808 +S'editable' +p18809 +I00 +sS'value' +p18810 +I00 +ssS'name' +p18811 +(dp18812 +S'editable' +p18813 +I01 +sS'value' +p18814 +S'Description' +p18815 +ssS'data_type' +p18816 +(dp18817 +S'editable' +p18818 +I00 +sS'value' +p18819 +S'text' +p18820 +ssS'entity_type' +p18821 +(dp18822 +S'editable' +p18823 +I00 +sS'value' +p18824 +S'CustomNonProjectEntity01' +p18825 +ssS'editable' +p18826 +(dp18827 +S'editable' +p18828 +I00 +sS'value' +p18829 +I01 +ssS'unique' +p18830 +(dp18831 +S'editable' +p18832 +I00 +sS'value' +p18833 +I00 +ssS'properties' +p18834 +(dp18835 +S'default_value' +p18836 +(dp18837 +S'editable' +p18838 +I00 +sS'value' +p18839 +NssS'summary_default' +p18840 +(dp18841 +S'editable' +p18842 +I01 +sS'value' +p18843 +S'none' +p18844 +sssS'description' +p18845 +(dp18846 +S'editable' +p18847 +I01 +sS'value' +p18848 +g47 +sssS'notes' +p18849 +(dp18850 +S'mandatory' +p18851 +(dp18852 +S'editable' +p18853 +I00 +sS'value' +p18854 +I00 +ssS'name' +p18855 +(dp18856 +S'editable' +p18857 +I01 +sS'value' +p18858 +S'Notes' +p18859 +ssS'data_type' +p18860 +(dp18861 +S'editable' +p18862 +I00 +sS'value' +p18863 +S'multi_entity' +p18864 +ssS'entity_type' +p18865 +(dp18866 +S'editable' +p18867 +I00 +sS'value' +p18868 +S'CustomNonProjectEntity01' +p18869 +ssS'editable' +p18870 +(dp18871 +S'editable' +p18872 +I00 +sS'value' +p18873 +I01 +ssS'unique' +p18874 +(dp18875 +S'editable' +p18876 +I00 +sS'value' +p18877 +I00 +ssS'properties' +p18878 +(dp18879 +S'default_value' +p18880 +(dp18881 +S'editable' +p18882 +I00 +sS'value' +p18883 +NssS'summary_default' +p18884 +(dp18885 +S'editable' +p18886 +I01 +sS'value' +p18887 +S'none' +p18888 +ssS'valid_types' +p18889 +(dp18890 +S'editable' +p18891 +I01 +sS'value' +p18892 +(lp18893 +S'Note' +p18894 +asssS'description' +p18895 +(dp18896 +S'editable' +p18897 +I01 +sS'value' +p18898 +g47 +sssS'updated_at' +p18899 +(dp18900 +S'mandatory' +p18901 +(dp18902 +S'editable' +p18903 +I00 +sS'value' +p18904 +I00 +ssS'name' +p18905 +(dp18906 +S'editable' +p18907 +I01 +sS'value' +p18908 +S'Date Updated' +p18909 +ssS'data_type' +p18910 +(dp18911 +S'editable' +p18912 +I00 +sS'value' +p18913 +S'date_time' +p18914 +ssS'entity_type' +p18915 +(dp18916 +S'editable' +p18917 +I00 +sS'value' +p18918 +S'CustomNonProjectEntity01' +p18919 +ssS'editable' +p18920 +(dp18921 +S'editable' +p18922 +I00 +sS'value' +p18923 +I00 +ssS'unique' +p18924 +(dp18925 +S'editable' +p18926 +I00 +sS'value' +p18927 +I00 +ssS'properties' +p18928 +(dp18929 +S'default_value' +p18930 +(dp18931 +S'editable' +p18932 +I00 +sS'value' +p18933 +NssS'summary_default' +p18934 +(dp18935 +S'editable' +p18936 +I01 +sS'value' +p18937 +S'none' +p18938 +sssS'description' +p18939 +(dp18940 +S'editable' +p18941 +I01 +sS'value' +p18942 +g47 +sssS'created_by' +p18943 +(dp18944 +S'mandatory' +p18945 +(dp18946 +S'editable' +p18947 +I00 +sS'value' +p18948 +I00 +ssS'name' +p18949 +(dp18950 +S'editable' +p18951 +I01 +sS'value' +p18952 +S'Created by' +p18953 +ssS'data_type' +p18954 +(dp18955 +S'editable' +p18956 +I00 +sS'value' +p18957 +S'entity' +p18958 +ssS'entity_type' +p18959 +(dp18960 +S'editable' +p18961 +I00 +sS'value' +p18962 +S'CustomNonProjectEntity01' +p18963 +ssS'editable' +p18964 +(dp18965 +S'editable' +p18966 +I00 +sS'value' +p18967 +I00 +ssS'unique' +p18968 +(dp18969 +S'editable' +p18970 +I00 +sS'value' +p18971 +I00 +ssS'properties' +p18972 +(dp18973 +S'default_value' +p18974 +(dp18975 +S'editable' +p18976 +I00 +sS'value' +p18977 +NssS'summary_default' +p18978 +(dp18979 +S'editable' +p18980 +I01 +sS'value' +p18981 +S'none' +p18982 +ssS'valid_types' +p18983 +(dp18984 +S'editable' +p18985 +I01 +sS'value' +p18986 +(lp18987 +S'HumanUser' +p18988 +aS'ApiUser' +p18989 +asssS'description' +p18990 +(dp18991 +S'editable' +p18992 +I01 +sS'value' +p18993 +g47 +sssS'filmstrip_image' +p18994 +(dp18995 +S'mandatory' +p18996 +(dp18997 +S'editable' +p18998 +I00 +sS'value' +p18999 +I00 +ssS'name' +p19000 +(dp19001 +S'editable' +p19002 +I01 +sS'value' +p19003 +S'Filmstrip Thumbnail' +p19004 +ssS'data_type' +p19005 +(dp19006 +S'editable' +p19007 +I00 +sS'value' +p19008 +S'image' +p19009 +ssS'entity_type' +p19010 +(dp19011 +S'editable' +p19012 +I00 +sS'value' +p19013 +S'CustomNonProjectEntity01' +p19014 +ssS'editable' +p19015 +(dp19016 +S'editable' +p19017 +I00 +sS'value' +p19018 +I01 +ssS'unique' +p19019 +(dp19020 +S'editable' +p19021 +I00 +sS'value' +p19022 +I00 +ssS'properties' +p19023 +(dp19024 +S'default_value' +p19025 +(dp19026 +S'editable' +p19027 +I00 +sS'value' +p19028 +NssS'summary_default' +p19029 +(dp19030 +S'editable' +p19031 +I01 +sS'value' +p19032 +S'none' +p19033 +sssS'description' +p19034 +(dp19035 +S'editable' +p19036 +I01 +sS'value' +p19037 +g47 +sssS'sg_status_list' +p19038 +(dp19039 +S'mandatory' +p19040 +(dp19041 +S'editable' +p19042 +I00 +sS'value' +p19043 +I00 +ssS'name' +p19044 +(dp19045 +S'editable' +p19046 +I01 +sS'value' +p19047 +S'Status' +p19048 +ssS'data_type' +p19049 +(dp19050 +S'editable' +p19051 +I00 +sS'value' +p19052 +S'status_list' +p19053 +ssS'entity_type' +p19054 +(dp19055 +S'editable' +p19056 +I00 +sS'value' +p19057 +S'CustomNonProjectEntity01' +p19058 +ssS'editable' +p19059 +(dp19060 +S'editable' +p19061 +I00 +sS'value' +p19062 +I01 +ssS'unique' +p19063 +(dp19064 +S'editable' +p19065 +I00 +sS'value' +p19066 +I00 +ssS'properties' +p19067 +(dp19068 +S'default_value' +p19069 +(dp19070 +S'editable' +p19071 +I01 +sS'value' +p19072 +S'wtg' +p19073 +ssS'valid_values' +p19074 +(dp19075 +S'editable' +p19076 +I01 +sS'value' +p19077 +(lp19078 +S'cmpt' +p19079 +aS'ip' +p19080 +aS'wtg' +p19081 +assS'summary_default' +p19082 +(dp19083 +S'editable' +p19084 +I01 +sS'value' +p19085 +S'none' +p19086 +sssS'description' +p19087 +(dp19088 +S'editable' +p19089 +I01 +sS'value' +p19090 +g47 +sssS'image' +p19091 +(dp19092 +S'mandatory' +p19093 +(dp19094 +S'editable' +p19095 +I00 +sS'value' +p19096 +I00 +ssS'name' +p19097 +(dp19098 +S'editable' +p19099 +I01 +sS'value' +p19100 +S'Thumbnail' +p19101 +ssS'data_type' +p19102 +(dp19103 +S'editable' +p19104 +I00 +sS'value' +p19105 +S'image' +p19106 +ssS'entity_type' +p19107 +(dp19108 +S'editable' +p19109 +I00 +sS'value' +p19110 +S'CustomNonProjectEntity01' +p19111 +ssS'editable' +p19112 +(dp19113 +S'editable' +p19114 +I00 +sS'value' +p19115 +I01 +ssS'unique' +p19116 +(dp19117 +S'editable' +p19118 +I00 +sS'value' +p19119 +I00 +ssS'properties' +p19120 +(dp19121 +S'default_value' +p19122 +(dp19123 +S'editable' +p19124 +I00 +sS'value' +p19125 +NssS'summary_default' +p19126 +(dp19127 +S'editable' +p19128 +I01 +sS'value' +p19129 +S'none' +p19130 +sssS'description' +p19131 +(dp19132 +S'editable' +p19133 +I01 +sS'value' +p19134 +g47 +sssS'cached_display_name' +p19135 +(dp19136 +S'mandatory' +p19137 +(dp19138 +S'editable' +p19139 +I00 +sS'value' +p19140 +I00 +ssS'name' +p19141 +(dp19142 +S'editable' +p19143 +I01 +sS'value' +p19144 +S'Cached Display Name' +p19145 +ssS'data_type' +p19146 +(dp19147 +S'editable' +p19148 +I00 +sS'value' +p19149 +S'text' +p19150 +ssS'entity_type' +p19151 +(dp19152 +S'editable' +p19153 +I00 +sS'value' +p19154 +S'CustomNonProjectEntity01' +p19155 +ssS'editable' +p19156 +(dp19157 +S'editable' +p19158 +I00 +sS'value' +p19159 +I01 +ssS'unique' +p19160 +(dp19161 +S'editable' +p19162 +I00 +sS'value' +p19163 +I00 +ssS'properties' +p19164 +(dp19165 +S'default_value' +p19166 +(dp19167 +S'editable' +p19168 +I00 +sS'value' +p19169 +NssS'summary_default' +p19170 +(dp19171 +S'editable' +p19172 +I00 +sS'value' +p19173 +S'none' +p19174 +sssS'description' +p19175 +(dp19176 +S'editable' +p19177 +I01 +sS'value' +p19178 +g47 +sssS'tag_list' +p19179 +(dp19180 +S'mandatory' +p19181 +(dp19182 +S'editable' +p19183 +I00 +sS'value' +p19184 +I00 +ssS'name' +p19185 +(dp19186 +S'editable' +p19187 +I01 +sS'value' +p19188 +S'Tags' +p19189 +ssS'data_type' +p19190 +(dp19191 +S'editable' +p19192 +I00 +sS'value' +p19193 +S'tag_list' +p19194 +ssS'entity_type' +p19195 +(dp19196 +S'editable' +p19197 +I00 +sS'value' +p19198 +S'CustomNonProjectEntity01' +p19199 +ssS'editable' +p19200 +(dp19201 +S'editable' +p19202 +I00 +sS'value' +p19203 +I01 +ssS'unique' +p19204 +(dp19205 +S'editable' +p19206 +I00 +sS'value' +p19207 +I00 +ssS'properties' +p19208 +(dp19209 +S'default_value' +p19210 +(dp19211 +S'editable' +p19212 +I00 +sS'value' +p19213 +NssS'summary_default' +p19214 +(dp19215 +S'editable' +p19216 +I01 +sS'value' +p19217 +S'none' +p19218 +ssS'valid_types' +p19219 +(dp19220 +S'editable' +p19221 +I01 +sS'value' +p19222 +(lp19223 +S'Tag' +p19224 +asssS'description' +p19225 +(dp19226 +S'editable' +p19227 +I01 +sS'value' +p19228 +g47 +sssS'id' +p19229 +(dp19230 +S'mandatory' +p19231 +(dp19232 +S'editable' +p19233 +I00 +sS'value' +p19234 +I00 +ssS'name' +p19235 +(dp19236 +S'editable' +p19237 +I01 +sS'value' +p19238 +S'Id' +p19239 +ssS'data_type' +p19240 +(dp19241 +S'editable' +p19242 +I00 +sS'value' +p19243 +S'number' +p19244 +ssS'entity_type' +p19245 +(dp19246 +S'editable' +p19247 +I00 +sS'value' +p19248 +S'CustomNonProjectEntity01' +p19249 +ssS'editable' +p19250 +(dp19251 +S'editable' +p19252 +I00 +sS'value' +p19253 +I00 +ssS'unique' +p19254 +(dp19255 +S'editable' +p19256 +I00 +sS'value' +p19257 +I00 +ssS'properties' +p19258 +(dp19259 +S'default_value' +p19260 +(dp19261 +S'editable' +p19262 +I00 +sS'value' +p19263 +NssS'summary_default' +p19264 +(dp19265 +S'editable' +p19266 +I01 +sS'value' +p19267 +S'none' +p19268 +sssS'description' +p19269 +(dp19270 +S'editable' +p19271 +I01 +sS'value' +p19272 +g47 +sssS'updated_by' +p19273 +(dp19274 +S'mandatory' +p19275 +(dp19276 +S'editable' +p19277 +I00 +sS'value' +p19278 +I00 +ssS'name' +p19279 +(dp19280 +S'editable' +p19281 +I01 +sS'value' +p19282 +S'Updated by' +p19283 +ssS'data_type' +p19284 +(dp19285 +S'editable' +p19286 +I00 +sS'value' +p19287 +S'entity' +p19288 +ssS'entity_type' +p19289 +(dp19290 +S'editable' +p19291 +I00 +sS'value' +p19292 +S'CustomNonProjectEntity01' +p19293 +ssS'editable' +p19294 +(dp19295 +S'editable' +p19296 +I00 +sS'value' +p19297 +I00 +ssS'unique' +p19298 +(dp19299 +S'editable' +p19300 +I00 +sS'value' +p19301 +I00 +ssS'properties' +p19302 +(dp19303 +S'default_value' +p19304 +(dp19305 +S'editable' +p19306 +I00 +sS'value' +p19307 +NssS'summary_default' +p19308 +(dp19309 +S'editable' +p19310 +I01 +sS'value' +p19311 +S'none' +p19312 +ssS'valid_types' +p19313 +(dp19314 +S'editable' +p19315 +I01 +sS'value' +p19316 +(lp19317 +S'HumanUser' +p19318 +aS'ApiUser' +p19319 +asssS'description' +p19320 +(dp19321 +S'editable' +p19322 +I01 +sS'value' +p19323 +g47 +ssssS'ApiUser' +p19324 +(dp19325 +S'description' +p19326 +(dp19327 +S'mandatory' +p19328 +(dp19329 +S'editable' +p19330 +I00 +sS'value' +p19331 +I00 +ssS'name' +p19332 +(dp19333 +S'editable' +p19334 +I01 +sS'value' +p19335 +S'Description' +p19336 +ssS'data_type' +p19337 +(dp19338 +S'editable' +p19339 +I00 +sS'value' +p19340 +S'text' +p19341 +ssS'entity_type' +p19342 +(dp19343 +S'editable' +p19344 +I00 +sS'value' +p19345 +S'ApiUser' +p19346 +ssS'editable' +p19347 +(dp19348 +S'editable' +p19349 +I00 +sS'value' +p19350 +I01 +ssS'unique' +p19351 +(dp19352 +S'editable' +p19353 +I00 +sS'value' +p19354 +I00 +ssS'properties' +p19355 +(dp19356 +S'default_value' +p19357 +(dp19358 +S'editable' +p19359 +I00 +sS'value' +p19360 +NssS'summary_default' +p19361 +(dp19362 +S'editable' +p19363 +I01 +sS'value' +p19364 +S'none' +p19365 +sssS'description' +p19366 +(dp19367 +S'editable' +p19368 +I01 +sS'value' +p19369 +g47 +sssS'firstname' +p19370 +(dp19371 +S'mandatory' +p19372 +(dp19373 +S'editable' +p19374 +I00 +sS'value' +p19375 +I01 +ssS'name' +p19376 +(dp19377 +S'editable' +p19378 +I01 +sS'value' +p19379 +S'Script Name' +p19380 +ssS'data_type' +p19381 +(dp19382 +S'editable' +p19383 +I00 +sS'value' +p19384 +S'text' +p19385 +ssS'entity_type' +p19386 +(dp19387 +S'editable' +p19388 +I00 +sS'value' +p19389 +S'ApiUser' +p19390 +ssS'editable' +p19391 +(dp19392 +S'editable' +p19393 +I00 +sS'value' +p19394 +I01 +ssS'unique' +p19395 +(dp19396 +S'editable' +p19397 +I00 +sS'value' +p19398 +I00 +ssS'properties' +p19399 +(dp19400 +S'default_value' +p19401 +(dp19402 +S'editable' +p19403 +I00 +sS'value' +p19404 +NssS'summary_default' +p19405 +(dp19406 +S'editable' +p19407 +I01 +sS'value' +p19408 +S'none' +p19409 +sssS'description' +p19410 +(dp19411 +S'editable' +p19412 +I01 +sS'value' +p19413 +g47 +sssS'lastname' +p19414 +(dp19415 +S'mandatory' +p19416 +(dp19417 +S'editable' +p19418 +I00 +sS'value' +p19419 +I00 +ssS'name' +p19420 +(dp19421 +S'editable' +p19422 +I01 +sS'value' +p19423 +S'Version' +p19424 +ssS'data_type' +p19425 +(dp19426 +S'editable' +p19427 +I00 +sS'value' +p19428 +S'text' +p19429 +ssS'entity_type' +p19430 +(dp19431 +S'editable' +p19432 +I00 +sS'value' +p19433 +S'ApiUser' +p19434 +ssS'editable' +p19435 +(dp19436 +S'editable' +p19437 +I00 +sS'value' +p19438 +I01 +ssS'unique' +p19439 +(dp19440 +S'editable' +p19441 +I00 +sS'value' +p19442 +I00 +ssS'properties' +p19443 +(dp19444 +S'default_value' +p19445 +(dp19446 +S'editable' +p19447 +I00 +sS'value' +p19448 +NssS'summary_default' +p19449 +(dp19450 +S'editable' +p19451 +I01 +sS'value' +p19452 +S'none' +p19453 +sssS'description' +p19454 +(dp19455 +S'editable' +p19456 +I01 +sS'value' +p19457 +g47 +sssS'created_at' +p19458 +(dp19459 +S'mandatory' +p19460 +(dp19461 +S'editable' +p19462 +I00 +sS'value' +p19463 +I00 +ssS'name' +p19464 +(dp19465 +S'editable' +p19466 +I01 +sS'value' +p19467 +S'Date Created' +p19468 +ssS'data_type' +p19469 +(dp19470 +S'editable' +p19471 +I00 +sS'value' +p19472 +S'date_time' +p19473 +ssS'entity_type' +p19474 +(dp19475 +S'editable' +p19476 +I00 +sS'value' +p19477 +S'ApiUser' +p19478 +ssS'editable' +p19479 +(dp19480 +S'editable' +p19481 +I00 +sS'value' +p19482 +I00 +ssS'unique' +p19483 +(dp19484 +S'editable' +p19485 +I00 +sS'value' +p19486 +I00 +ssS'properties' +p19487 +(dp19488 +S'default_value' +p19489 +(dp19490 +S'editable' +p19491 +I00 +sS'value' +p19492 +NssS'summary_default' +p19493 +(dp19494 +S'editable' +p19495 +I01 +sS'value' +p19496 +S'none' +p19497 +sssS'description' +p19498 +(dp19499 +S'editable' +p19500 +I01 +sS'value' +p19501 +g47 +sssS'generate_event_log_entries' +p19502 +(dp19503 +S'mandatory' +p19504 +(dp19505 +S'editable' +p19506 +I00 +sS'value' +p19507 +I00 +ssS'name' +p19508 +(dp19509 +S'editable' +p19510 +I01 +sS'value' +p19511 +S'Generate Events' +p19512 +ssS'data_type' +p19513 +(dp19514 +S'editable' +p19515 +I00 +sS'value' +p19516 +S'checkbox' +p19517 +ssS'entity_type' +p19518 +(dp19519 +S'editable' +p19520 +I00 +sS'value' +p19521 +S'ApiUser' +p19522 +ssS'editable' +p19523 +(dp19524 +S'editable' +p19525 +I00 +sS'value' +p19526 +I01 +ssS'unique' +p19527 +(dp19528 +S'editable' +p19529 +I00 +sS'value' +p19530 +I00 +ssS'properties' +p19531 +(dp19532 +S'default_value' +p19533 +(dp19534 +S'editable' +p19535 +I00 +sS'value' +p19536 +I01 +ssS'summary_default' +p19537 +(dp19538 +S'editable' +p19539 +I01 +sS'value' +p19540 +S'none' +p19541 +sssS'description' +p19542 +(dp19543 +S'editable' +p19544 +I01 +sS'value' +p19545 +g47 +sssS'updated_at' +p19546 +(dp19547 +S'mandatory' +p19548 +(dp19549 +S'editable' +p19550 +I00 +sS'value' +p19551 +I00 +ssS'name' +p19552 +(dp19553 +S'editable' +p19554 +I01 +sS'value' +p19555 +S'Date Updated' +p19556 +ssS'data_type' +p19557 +(dp19558 +S'editable' +p19559 +I00 +sS'value' +p19560 +S'date_time' +p19561 +ssS'entity_type' +p19562 +(dp19563 +S'editable' +p19564 +I00 +sS'value' +p19565 +S'ApiUser' +p19566 +ssS'editable' +p19567 +(dp19568 +S'editable' +p19569 +I00 +sS'value' +p19570 +I00 +ssS'unique' +p19571 +(dp19572 +S'editable' +p19573 +I00 +sS'value' +p19574 +I00 +ssS'properties' +p19575 +(dp19576 +S'default_value' +p19577 +(dp19578 +S'editable' +p19579 +I00 +sS'value' +p19580 +NssS'summary_default' +p19581 +(dp19582 +S'editable' +p19583 +I01 +sS'value' +p19584 +S'none' +p19585 +sssS'description' +p19586 +(dp19587 +S'editable' +p19588 +I01 +sS'value' +p19589 +g47 +sssS'created_by' +p19590 +(dp19591 +S'mandatory' +p19592 +(dp19593 +S'editable' +p19594 +I00 +sS'value' +p19595 +I00 +ssS'name' +p19596 +(dp19597 +S'editable' +p19598 +I01 +sS'value' +p19599 +S'Created by' +p19600 +ssS'data_type' +p19601 +(dp19602 +S'editable' +p19603 +I00 +sS'value' +p19604 +S'entity' +p19605 +ssS'entity_type' +p19606 +(dp19607 +S'editable' +p19608 +I00 +sS'value' +p19609 +S'ApiUser' +p19610 +ssS'editable' +p19611 +(dp19612 +S'editable' +p19613 +I00 +sS'value' +p19614 +I00 +ssS'unique' +p19615 +(dp19616 +S'editable' +p19617 +I00 +sS'value' +p19618 +I00 +ssS'properties' +p19619 +(dp19620 +S'default_value' +p19621 +(dp19622 +S'editable' +p19623 +I00 +sS'value' +p19624 +NssS'summary_default' +p19625 +(dp19626 +S'editable' +p19627 +I01 +sS'value' +p19628 +S'none' +p19629 +ssS'valid_types' +p19630 +(dp19631 +S'editable' +p19632 +I01 +sS'value' +p19633 +(lp19634 +S'HumanUser' +p19635 +aS'ApiUser' +p19636 +asssS'description' +p19637 +(dp19638 +S'editable' +p19639 +I01 +sS'value' +p19640 +g47 +sssS'email' +p19641 +(dp19642 +S'mandatory' +p19643 +(dp19644 +S'editable' +p19645 +I00 +sS'value' +p19646 +I00 +ssS'name' +p19647 +(dp19648 +S'editable' +p19649 +I01 +sS'value' +p19650 +S'Maintainer' +p19651 +ssS'data_type' +p19652 +(dp19653 +S'editable' +p19654 +I00 +sS'value' +p19655 +S'text' +p19656 +ssS'entity_type' +p19657 +(dp19658 +S'editable' +p19659 +I00 +sS'value' +p19660 +S'ApiUser' +p19661 +ssS'editable' +p19662 +(dp19663 +S'editable' +p19664 +I00 +sS'value' +p19665 +I01 +ssS'unique' +p19666 +(dp19667 +S'editable' +p19668 +I00 +sS'value' +p19669 +I00 +ssS'properties' +p19670 +(dp19671 +S'default_value' +p19672 +(dp19673 +S'editable' +p19674 +I00 +sS'value' +p19675 +g47 +ssS'summary_default' +p19676 +(dp19677 +S'editable' +p19678 +I01 +sS'value' +p19679 +S'none' +p19680 +sssS'description' +p19681 +(dp19682 +S'editable' +p19683 +I01 +sS'value' +p19684 +g47 +sssS'permission_rule_set' +p19685 +(dp19686 +S'mandatory' +p19687 +(dp19688 +S'editable' +p19689 +I00 +sS'value' +p19690 +I00 +ssS'name' +p19691 +(dp19692 +S'editable' +p19693 +I01 +sS'value' +p19694 +S'Permission Group' +p19695 +ssS'data_type' +p19696 +(dp19697 +S'editable' +p19698 +I00 +sS'value' +p19699 +S'entity' +p19700 +ssS'entity_type' +p19701 +(dp19702 +S'editable' +p19703 +I00 +sS'value' +p19704 +S'ApiUser' +p19705 +ssS'editable' +p19706 +(dp19707 +S'editable' +p19708 +I00 +sS'value' +p19709 +I00 +ssS'unique' +p19710 +(dp19711 +S'editable' +p19712 +I00 +sS'value' +p19713 +I00 +ssS'properties' +p19714 +(dp19715 +S'default_value' +p19716 +(dp19717 +S'editable' +p19718 +I00 +sS'value' +p19719 +NssS'summary_default' +p19720 +(dp19721 +S'editable' +p19722 +I01 +sS'value' +p19723 +S'none' +p19724 +ssS'valid_types' +p19725 +(dp19726 +S'editable' +p19727 +I01 +sS'value' +p19728 +(lp19729 +S'PermissionRuleSet' +p19730 +asssS'description' +p19731 +(dp19732 +S'editable' +p19733 +I01 +sS'value' +p19734 +g47 +sssS'filmstrip_image' +p19735 +(dp19736 +S'mandatory' +p19737 +(dp19738 +S'editable' +p19739 +I00 +sS'value' +p19740 +I00 +ssS'name' +p19741 +(dp19742 +S'editable' +p19743 +I01 +sS'value' +p19744 +S'Filmstrip Thumbnail' +p19745 +ssS'data_type' +p19746 +(dp19747 +S'editable' +p19748 +I00 +sS'value' +p19749 +S'image' +p19750 +ssS'entity_type' +p19751 +(dp19752 +S'editable' +p19753 +I00 +sS'value' +p19754 +S'ApiUser' +p19755 +ssS'editable' +p19756 +(dp19757 +S'editable' +p19758 +I00 +sS'value' +p19759 +I01 +ssS'unique' +p19760 +(dp19761 +S'editable' +p19762 +I00 +sS'value' +p19763 +I00 +ssS'properties' +p19764 +(dp19765 +S'default_value' +p19766 +(dp19767 +S'editable' +p19768 +I00 +sS'value' +p19769 +NssS'summary_default' +p19770 +(dp19771 +S'editable' +p19772 +I01 +sS'value' +p19773 +S'none' +p19774 +sssS'description' +p19775 +(dp19776 +S'editable' +p19777 +I01 +sS'value' +p19778 +g47 +sssS'image' +p19779 +(dp19780 +S'mandatory' +p19781 +(dp19782 +S'editable' +p19783 +I00 +sS'value' +p19784 +I00 +ssS'name' +p19785 +(dp19786 +S'editable' +p19787 +I01 +sS'value' +p19788 +S'Thumbnail' +p19789 +ssS'data_type' +p19790 +(dp19791 +S'editable' +p19792 +I00 +sS'value' +p19793 +S'image' +p19794 +ssS'entity_type' +p19795 +(dp19796 +S'editable' +p19797 +I00 +sS'value' +p19798 +S'ApiUser' +p19799 +ssS'editable' +p19800 +(dp19801 +S'editable' +p19802 +I00 +sS'value' +p19803 +I01 +ssS'unique' +p19804 +(dp19805 +S'editable' +p19806 +I00 +sS'value' +p19807 +I00 +ssS'properties' +p19808 +(dp19809 +S'default_value' +p19810 +(dp19811 +S'editable' +p19812 +I00 +sS'value' +p19813 +NssS'summary_default' +p19814 +(dp19815 +S'editable' +p19816 +I01 +sS'value' +p19817 +S'none' +p19818 +sssS'description' +p19819 +(dp19820 +S'editable' +p19821 +I01 +sS'value' +p19822 +g47 +sssS'cached_display_name' +p19823 +(dp19824 +S'mandatory' +p19825 +(dp19826 +S'editable' +p19827 +I00 +sS'value' +p19828 +I00 +ssS'name' +p19829 +(dp19830 +S'editable' +p19831 +I01 +sS'value' +p19832 +S'Cached Display Name' +p19833 +ssS'data_type' +p19834 +(dp19835 +S'editable' +p19836 +I00 +sS'value' +p19837 +S'text' +p19838 +ssS'entity_type' +p19839 +(dp19840 +S'editable' +p19841 +I00 +sS'value' +p19842 +S'ApiUser' +p19843 +ssS'editable' +p19844 +(dp19845 +S'editable' +p19846 +I00 +sS'value' +p19847 +I01 +ssS'unique' +p19848 +(dp19849 +S'editable' +p19850 +I00 +sS'value' +p19851 +I00 +ssS'properties' +p19852 +(dp19853 +S'default_value' +p19854 +(dp19855 +S'editable' +p19856 +I00 +sS'value' +p19857 +NssS'summary_default' +p19858 +(dp19859 +S'editable' +p19860 +I00 +sS'value' +p19861 +S'none' +p19862 +sssS'description' +p19863 +(dp19864 +S'editable' +p19865 +I01 +sS'value' +p19866 +g47 +sssS'tag_list' +p19867 +(dp19868 +S'mandatory' +p19869 +(dp19870 +S'editable' +p19871 +I00 +sS'value' +p19872 +I00 +ssS'name' +p19873 +(dp19874 +S'editable' +p19875 +I01 +sS'value' +p19876 +S'Tags' +p19877 +ssS'data_type' +p19878 +(dp19879 +S'editable' +p19880 +I00 +sS'value' +p19881 +S'tag_list' +p19882 +ssS'entity_type' +p19883 +(dp19884 +S'editable' +p19885 +I00 +sS'value' +p19886 +S'ApiUser' +p19887 +ssS'editable' +p19888 +(dp19889 +S'editable' +p19890 +I00 +sS'value' +p19891 +I01 +ssS'unique' +p19892 +(dp19893 +S'editable' +p19894 +I00 +sS'value' +p19895 +I00 +ssS'properties' +p19896 +(dp19897 +S'default_value' +p19898 +(dp19899 +S'editable' +p19900 +I00 +sS'value' +p19901 +NssS'summary_default' +p19902 +(dp19903 +S'editable' +p19904 +I01 +sS'value' +p19905 +S'none' +p19906 +ssS'valid_types' +p19907 +(dp19908 +S'editable' +p19909 +I01 +sS'value' +p19910 +(lp19911 +S'Tag' +p19912 +asssS'description' +p19913 +(dp19914 +S'editable' +p19915 +I01 +sS'value' +p19916 +g47 +sssS'id' +p19917 +(dp19918 +S'mandatory' +p19919 +(dp19920 +S'editable' +p19921 +I00 +sS'value' +p19922 +I00 +ssS'name' +p19923 +(dp19924 +S'editable' +p19925 +I01 +sS'value' +p19926 +S'Id' +p19927 +ssS'data_type' +p19928 +(dp19929 +S'editable' +p19930 +I00 +sS'value' +p19931 +S'number' +p19932 +ssS'entity_type' +p19933 +(dp19934 +S'editable' +p19935 +I00 +sS'value' +p19936 +S'ApiUser' +p19937 +ssS'editable' +p19938 +(dp19939 +S'editable' +p19940 +I00 +sS'value' +p19941 +I00 +ssS'unique' +p19942 +(dp19943 +S'editable' +p19944 +I00 +sS'value' +p19945 +I00 +ssS'properties' +p19946 +(dp19947 +S'default_value' +p19948 +(dp19949 +S'editable' +p19950 +I00 +sS'value' +p19951 +NssS'summary_default' +p19952 +(dp19953 +S'editable' +p19954 +I01 +sS'value' +p19955 +S'none' +p19956 +sssS'description' +p19957 +(dp19958 +S'editable' +p19959 +I01 +sS'value' +p19960 +g47 +sssS'salted_password' +p19961 +(dp19962 +S'mandatory' +p19963 +(dp19964 +S'editable' +p19965 +I00 +sS'value' +p19966 +I00 +ssS'name' +p19967 +(dp19968 +S'editable' +p19969 +I01 +sS'value' +p19970 +S'Application Key' +p19971 +ssS'data_type' +p19972 +(dp19973 +S'editable' +p19974 +I00 +sS'value' +p19975 +S'text' +p19976 +ssS'entity_type' +p19977 +(dp19978 +S'editable' +p19979 +I00 +sS'value' +p19980 +S'ApiUser' +p19981 +ssS'editable' +p19982 +(dp19983 +S'editable' +p19984 +I00 +sS'value' +p19985 +I00 +ssS'unique' +p19986 +(dp19987 +S'editable' +p19988 +I00 +sS'value' +p19989 +I00 +ssS'properties' +p19990 +(dp19991 +S'default_value' +p19992 +(dp19993 +S'editable' +p19994 +I00 +sS'value' +p19995 +g47 +ssS'summary_default' +p19996 +(dp19997 +S'editable' +p19998 +I01 +sS'value' +p19999 +S'none' +p20000 +sssS'description' +p20001 +(dp20002 +S'editable' +p20003 +I01 +sS'value' +p20004 +g47 +sssS'updated_by' +p20005 +(dp20006 +S'mandatory' +p20007 +(dp20008 +S'editable' +p20009 +I00 +sS'value' +p20010 +I00 +ssS'name' +p20011 +(dp20012 +S'editable' +p20013 +I01 +sS'value' +p20014 +S'Updated by' +p20015 +ssS'data_type' +p20016 +(dp20017 +S'editable' +p20018 +I00 +sS'value' +p20019 +S'entity' +p20020 +ssS'entity_type' +p20021 +(dp20022 +S'editable' +p20023 +I00 +sS'value' +p20024 +S'ApiUser' +p20025 +ssS'editable' +p20026 +(dp20027 +S'editable' +p20028 +I00 +sS'value' +p20029 +I00 +ssS'unique' +p20030 +(dp20031 +S'editable' +p20032 +I00 +sS'value' +p20033 +I00 +ssS'properties' +p20034 +(dp20035 +S'default_value' +p20036 +(dp20037 +S'editable' +p20038 +I00 +sS'value' +p20039 +NssS'summary_default' +p20040 +(dp20041 +S'editable' +p20042 +I01 +sS'value' +p20043 +S'none' +p20044 +ssS'valid_types' +p20045 +(dp20046 +S'editable' +p20047 +I01 +sS'value' +p20048 +(lp20049 +S'HumanUser' +p20050 +aS'ApiUser' +p20051 +asssS'description' +p20052 +(dp20053 +S'editable' +p20054 +I01 +sS'value' +p20055 +g47 +ssssS'CustomNonProjectEntity03' +p20056 +(dp20057 +S'open_notes_count' +p20058 +(dp20059 +S'mandatory' +p20060 +(dp20061 +S'editable' +p20062 +I00 +sS'value' +p20063 +I00 +ssS'name' +p20064 +(dp20065 +S'editable' +p20066 +I01 +sS'value' +p20067 +S'Open Notes Count' +p20068 +ssS'data_type' +p20069 +(dp20070 +S'editable' +p20071 +I00 +sS'value' +p20072 +S'text' +p20073 +ssS'entity_type' +p20074 +(dp20075 +S'editable' +p20076 +I00 +sS'value' +p20077 +S'CustomNonProjectEntity03' +p20078 +ssS'editable' +p20079 +(dp20080 +S'editable' +p20081 +I00 +sS'value' +p20082 +I00 +ssS'unique' +p20083 +(dp20084 +S'editable' +p20085 +I00 +sS'value' +p20086 +I00 +ssS'properties' +p20087 +(dp20088 +S'default_value' +p20089 +(dp20090 +S'editable' +p20091 +I00 +sS'value' +p20092 +NssS'summary_default' +p20093 +(dp20094 +S'editable' +p20095 +I01 +sS'value' +p20096 +S'none' +p20097 +sssS'description' +p20098 +(dp20099 +S'editable' +p20100 +I01 +sS'value' +p20101 +g47 +sssS'code' +p20102 +(dp20103 +S'mandatory' +p20104 +(dp20105 +S'editable' +p20106 +I00 +sS'value' +p20107 +I01 +ssS'name' +p20108 +(dp20109 +S'editable' +p20110 +I01 +sS'value' +p20111 +S'Custom Non Project Entity03 Name' +p20112 +ssS'data_type' +p20113 +(dp20114 +S'editable' +p20115 +I00 +sS'value' +p20116 +S'text' +p20117 +ssS'entity_type' +p20118 +(dp20119 +S'editable' +p20120 +I00 +sS'value' +p20121 +S'CustomNonProjectEntity03' +p20122 +ssS'editable' +p20123 +(dp20124 +S'editable' +p20125 +I00 +sS'value' +p20126 +I01 +ssS'unique' +p20127 +(dp20128 +S'editable' +p20129 +I00 +sS'value' +p20130 +I00 +ssS'properties' +p20131 +(dp20132 +S'default_value' +p20133 +(dp20134 +S'editable' +p20135 +I00 +sS'value' +p20136 +NssS'summary_default' +p20137 +(dp20138 +S'editable' +p20139 +I01 +sS'value' +p20140 +S'none' +p20141 +sssS'description' +p20142 +(dp20143 +S'editable' +p20144 +I01 +sS'value' +p20145 +g47 +sssS'open_notes' +p20146 +(dp20147 +S'mandatory' +p20148 +(dp20149 +S'editable' +p20150 +I00 +sS'value' +p20151 +I00 +ssS'name' +p20152 +(dp20153 +S'editable' +p20154 +I01 +sS'value' +p20155 +S'Open Notes' +p20156 +ssS'data_type' +p20157 +(dp20158 +S'editable' +p20159 +I00 +sS'value' +p20160 +S'multi_entity' +p20161 +ssS'entity_type' +p20162 +(dp20163 +S'editable' +p20164 +I00 +sS'value' +p20165 +S'CustomNonProjectEntity03' +p20166 +ssS'editable' +p20167 +(dp20168 +S'editable' +p20169 +I00 +sS'value' +p20170 +I00 +ssS'unique' +p20171 +(dp20172 +S'editable' +p20173 +I00 +sS'value' +p20174 +I00 +ssS'properties' +p20175 +(dp20176 +S'default_value' +p20177 +(dp20178 +S'editable' +p20179 +I00 +sS'value' +p20180 +NssS'summary_default' +p20181 +(dp20182 +S'editable' +p20183 +I01 +sS'value' +p20184 +S'none' +p20185 +ssS'valid_types' +p20186 +(dp20187 +S'editable' +p20188 +I01 +sS'value' +p20189 +(lp20190 +S'Note' +p20191 +asssS'description' +p20192 +(dp20193 +S'editable' +p20194 +I01 +sS'value' +p20195 +g47 +sssS'description' +p20196 +(dp20197 +S'mandatory' +p20198 +(dp20199 +S'editable' +p20200 +I00 +sS'value' +p20201 +I00 +ssS'name' +p20202 +(dp20203 +S'editable' +p20204 +I01 +sS'value' +p20205 +S'Description' +p20206 +ssS'data_type' +p20207 +(dp20208 +S'editable' +p20209 +I00 +sS'value' +p20210 +S'text' +p20211 +ssS'entity_type' +p20212 +(dp20213 +S'editable' +p20214 +I00 +sS'value' +p20215 +S'CustomNonProjectEntity03' +p20216 +ssS'editable' +p20217 +(dp20218 +S'editable' +p20219 +I00 +sS'value' +p20220 +I01 +ssS'unique' +p20221 +(dp20222 +S'editable' +p20223 +I00 +sS'value' +p20224 +I00 +ssS'properties' +p20225 +(dp20226 +S'default_value' +p20227 +(dp20228 +S'editable' +p20229 +I00 +sS'value' +p20230 +NssS'summary_default' +p20231 +(dp20232 +S'editable' +p20233 +I01 +sS'value' +p20234 +S'none' +p20235 +sssS'description' +p20236 +(dp20237 +S'editable' +p20238 +I01 +sS'value' +p20239 +g47 +sssS'created_at' +p20240 +(dp20241 +S'mandatory' +p20242 +(dp20243 +S'editable' +p20244 +I00 +sS'value' +p20245 +I00 +ssS'name' +p20246 +(dp20247 +S'editable' +p20248 +I01 +sS'value' +p20249 +S'Date Created' +p20250 +ssS'data_type' +p20251 +(dp20252 +S'editable' +p20253 +I00 +sS'value' +p20254 +S'date_time' +p20255 +ssS'entity_type' +p20256 +(dp20257 +S'editable' +p20258 +I00 +sS'value' +p20259 +S'CustomNonProjectEntity03' +p20260 +ssS'editable' +p20261 +(dp20262 +S'editable' +p20263 +I00 +sS'value' +p20264 +I00 +ssS'unique' +p20265 +(dp20266 +S'editable' +p20267 +I00 +sS'value' +p20268 +I00 +ssS'properties' +p20269 +(dp20270 +S'default_value' +p20271 +(dp20272 +S'editable' +p20273 +I00 +sS'value' +p20274 +NssS'summary_default' +p20275 +(dp20276 +S'editable' +p20277 +I01 +sS'value' +p20278 +S'none' +p20279 +sssS'description' +p20280 +(dp20281 +S'editable' +p20282 +I01 +sS'value' +p20283 +g47 +sssS'updated_at' +p20284 +(dp20285 +S'mandatory' +p20286 +(dp20287 +S'editable' +p20288 +I00 +sS'value' +p20289 +I00 +ssS'name' +p20290 +(dp20291 +S'editable' +p20292 +I01 +sS'value' +p20293 +S'Date Updated' +p20294 +ssS'data_type' +p20295 +(dp20296 +S'editable' +p20297 +I00 +sS'value' +p20298 +S'date_time' +p20299 +ssS'entity_type' +p20300 +(dp20301 +S'editable' +p20302 +I00 +sS'value' +p20303 +S'CustomNonProjectEntity03' +p20304 +ssS'editable' +p20305 +(dp20306 +S'editable' +p20307 +I00 +sS'value' +p20308 +I00 +ssS'unique' +p20309 +(dp20310 +S'editable' +p20311 +I00 +sS'value' +p20312 +I00 +ssS'properties' +p20313 +(dp20314 +S'default_value' +p20315 +(dp20316 +S'editable' +p20317 +I00 +sS'value' +p20318 +NssS'summary_default' +p20319 +(dp20320 +S'editable' +p20321 +I01 +sS'value' +p20322 +S'none' +p20323 +sssS'description' +p20324 +(dp20325 +S'editable' +p20326 +I01 +sS'value' +p20327 +g47 +sssS'created_by' +p20328 +(dp20329 +S'mandatory' +p20330 +(dp20331 +S'editable' +p20332 +I00 +sS'value' +p20333 +I00 +ssS'name' +p20334 +(dp20335 +S'editable' +p20336 +I01 +sS'value' +p20337 +S'Created by' +p20338 +ssS'data_type' +p20339 +(dp20340 +S'editable' +p20341 +I00 +sS'value' +p20342 +S'entity' +p20343 +ssS'entity_type' +p20344 +(dp20345 +S'editable' +p20346 +I00 +sS'value' +p20347 +S'CustomNonProjectEntity03' +p20348 +ssS'editable' +p20349 +(dp20350 +S'editable' +p20351 +I00 +sS'value' +p20352 +I00 +ssS'unique' +p20353 +(dp20354 +S'editable' +p20355 +I00 +sS'value' +p20356 +I00 +ssS'properties' +p20357 +(dp20358 +S'default_value' +p20359 +(dp20360 +S'editable' +p20361 +I00 +sS'value' +p20362 +NssS'summary_default' +p20363 +(dp20364 +S'editable' +p20365 +I01 +sS'value' +p20366 +S'none' +p20367 +ssS'valid_types' +p20368 +(dp20369 +S'editable' +p20370 +I01 +sS'value' +p20371 +(lp20372 +S'HumanUser' +p20373 +aS'ApiUser' +p20374 +asssS'description' +p20375 +(dp20376 +S'editable' +p20377 +I01 +sS'value' +p20378 +g47 +sssS'filmstrip_image' +p20379 +(dp20380 +S'mandatory' +p20381 +(dp20382 +S'editable' +p20383 +I00 +sS'value' +p20384 +I00 +ssS'name' +p20385 +(dp20386 +S'editable' +p20387 +I01 +sS'value' +p20388 +S'Filmstrip Thumbnail' +p20389 +ssS'data_type' +p20390 +(dp20391 +S'editable' +p20392 +I00 +sS'value' +p20393 +S'image' +p20394 +ssS'entity_type' +p20395 +(dp20396 +S'editable' +p20397 +I00 +sS'value' +p20398 +S'CustomNonProjectEntity03' +p20399 +ssS'editable' +p20400 +(dp20401 +S'editable' +p20402 +I00 +sS'value' +p20403 +I01 +ssS'unique' +p20404 +(dp20405 +S'editable' +p20406 +I00 +sS'value' +p20407 +I00 +ssS'properties' +p20408 +(dp20409 +S'default_value' +p20410 +(dp20411 +S'editable' +p20412 +I00 +sS'value' +p20413 +NssS'summary_default' +p20414 +(dp20415 +S'editable' +p20416 +I01 +sS'value' +p20417 +S'none' +p20418 +sssS'description' +p20419 +(dp20420 +S'editable' +p20421 +I01 +sS'value' +p20422 +g47 +sssS'sg_status_list' +p20423 +(dp20424 +S'mandatory' +p20425 +(dp20426 +S'editable' +p20427 +I00 +sS'value' +p20428 +I00 +ssS'name' +p20429 +(dp20430 +S'editable' +p20431 +I01 +sS'value' +p20432 +S'Status' +p20433 +ssS'data_type' +p20434 +(dp20435 +S'editable' +p20436 +I00 +sS'value' +p20437 +S'status_list' +p20438 +ssS'entity_type' +p20439 +(dp20440 +S'editable' +p20441 +I00 +sS'value' +p20442 +S'CustomNonProjectEntity03' +p20443 +ssS'editable' +p20444 +(dp20445 +S'editable' +p20446 +I00 +sS'value' +p20447 +I01 +ssS'unique' +p20448 +(dp20449 +S'editable' +p20450 +I00 +sS'value' +p20451 +I00 +ssS'properties' +p20452 +(dp20453 +S'default_value' +p20454 +(dp20455 +S'editable' +p20456 +I01 +sS'value' +p20457 +S'wtg' +p20458 +ssS'valid_values' +p20459 +(dp20460 +S'editable' +p20461 +I01 +sS'value' +p20462 +(lp20463 +S'cmpt' +p20464 +aS'ip' +p20465 +aS'wtg' +p20466 +assS'summary_default' +p20467 +(dp20468 +S'editable' +p20469 +I01 +sS'value' +p20470 +S'none' +p20471 +sssS'description' +p20472 +(dp20473 +S'editable' +p20474 +I01 +sS'value' +p20475 +g47 +sssS'notes' +p20476 +(dp20477 +S'mandatory' +p20478 +(dp20479 +S'editable' +p20480 +I00 +sS'value' +p20481 +I00 +ssS'name' +p20482 +(dp20483 +S'editable' +p20484 +I01 +sS'value' +p20485 +S'Notes' +p20486 +ssS'data_type' +p20487 +(dp20488 +S'editable' +p20489 +I00 +sS'value' +p20490 +S'multi_entity' +p20491 +ssS'entity_type' +p20492 +(dp20493 +S'editable' +p20494 +I00 +sS'value' +p20495 +S'CustomNonProjectEntity03' +p20496 +ssS'editable' +p20497 +(dp20498 +S'editable' +p20499 +I00 +sS'value' +p20500 +I01 +ssS'unique' +p20501 +(dp20502 +S'editable' +p20503 +I00 +sS'value' +p20504 +I00 +ssS'properties' +p20505 +(dp20506 +S'default_value' +p20507 +(dp20508 +S'editable' +p20509 +I00 +sS'value' +p20510 +NssS'summary_default' +p20511 +(dp20512 +S'editable' +p20513 +I01 +sS'value' +p20514 +S'none' +p20515 +ssS'valid_types' +p20516 +(dp20517 +S'editable' +p20518 +I01 +sS'value' +p20519 +(lp20520 +S'Note' +p20521 +asssS'description' +p20522 +(dp20523 +S'editable' +p20524 +I01 +sS'value' +p20525 +g47 +sssS'image' +p20526 +(dp20527 +S'mandatory' +p20528 +(dp20529 +S'editable' +p20530 +I00 +sS'value' +p20531 +I00 +ssS'name' +p20532 +(dp20533 +S'editable' +p20534 +I01 +sS'value' +p20535 +S'Thumbnail' +p20536 +ssS'data_type' +p20537 +(dp20538 +S'editable' +p20539 +I00 +sS'value' +p20540 +S'image' +p20541 +ssS'entity_type' +p20542 +(dp20543 +S'editable' +p20544 +I00 +sS'value' +p20545 +S'CustomNonProjectEntity03' +p20546 +ssS'editable' +p20547 +(dp20548 +S'editable' +p20549 +I00 +sS'value' +p20550 +I01 +ssS'unique' +p20551 +(dp20552 +S'editable' +p20553 +I00 +sS'value' +p20554 +I00 +ssS'properties' +p20555 +(dp20556 +S'default_value' +p20557 +(dp20558 +S'editable' +p20559 +I00 +sS'value' +p20560 +NssS'summary_default' +p20561 +(dp20562 +S'editable' +p20563 +I01 +sS'value' +p20564 +S'none' +p20565 +sssS'description' +p20566 +(dp20567 +S'editable' +p20568 +I01 +sS'value' +p20569 +g47 +sssS'cached_display_name' +p20570 +(dp20571 +S'mandatory' +p20572 +(dp20573 +S'editable' +p20574 +I00 +sS'value' +p20575 +I00 +ssS'name' +p20576 +(dp20577 +S'editable' +p20578 +I01 +sS'value' +p20579 +S'Cached Display Name' +p20580 +ssS'data_type' +p20581 +(dp20582 +S'editable' +p20583 +I00 +sS'value' +p20584 +S'text' +p20585 +ssS'entity_type' +p20586 +(dp20587 +S'editable' +p20588 +I00 +sS'value' +p20589 +S'CustomNonProjectEntity03' +p20590 +ssS'editable' +p20591 +(dp20592 +S'editable' +p20593 +I00 +sS'value' +p20594 +I01 +ssS'unique' +p20595 +(dp20596 +S'editable' +p20597 +I00 +sS'value' +p20598 +I00 +ssS'properties' +p20599 +(dp20600 +S'default_value' +p20601 +(dp20602 +S'editable' +p20603 +I00 +sS'value' +p20604 +NssS'summary_default' +p20605 +(dp20606 +S'editable' +p20607 +I00 +sS'value' +p20608 +S'none' +p20609 +sssS'description' +p20610 +(dp20611 +S'editable' +p20612 +I01 +sS'value' +p20613 +g47 +sssS'tag_list' +p20614 +(dp20615 +S'mandatory' +p20616 +(dp20617 +S'editable' +p20618 +I00 +sS'value' +p20619 +I00 +ssS'name' +p20620 +(dp20621 +S'editable' +p20622 +I01 +sS'value' +p20623 +S'Tags' +p20624 +ssS'data_type' +p20625 +(dp20626 +S'editable' +p20627 +I00 +sS'value' +p20628 +S'tag_list' +p20629 +ssS'entity_type' +p20630 +(dp20631 +S'editable' +p20632 +I00 +sS'value' +p20633 +S'CustomNonProjectEntity03' +p20634 +ssS'editable' +p20635 +(dp20636 +S'editable' +p20637 +I00 +sS'value' +p20638 +I01 +ssS'unique' +p20639 +(dp20640 +S'editable' +p20641 +I00 +sS'value' +p20642 +I00 +ssS'properties' +p20643 +(dp20644 +S'default_value' +p20645 +(dp20646 +S'editable' +p20647 +I00 +sS'value' +p20648 +NssS'summary_default' +p20649 +(dp20650 +S'editable' +p20651 +I01 +sS'value' +p20652 +S'none' +p20653 +ssS'valid_types' +p20654 +(dp20655 +S'editable' +p20656 +I01 +sS'value' +p20657 +(lp20658 +S'Tag' +p20659 +asssS'description' +p20660 +(dp20661 +S'editable' +p20662 +I01 +sS'value' +p20663 +g47 +sssS'id' +p20664 +(dp20665 +S'mandatory' +p20666 +(dp20667 +S'editable' +p20668 +I00 +sS'value' +p20669 +I00 +ssS'name' +p20670 +(dp20671 +S'editable' +p20672 +I01 +sS'value' +p20673 +S'Id' +p20674 +ssS'data_type' +p20675 +(dp20676 +S'editable' +p20677 +I00 +sS'value' +p20678 +S'number' +p20679 +ssS'entity_type' +p20680 +(dp20681 +S'editable' +p20682 +I00 +sS'value' +p20683 +S'CustomNonProjectEntity03' +p20684 +ssS'editable' +p20685 +(dp20686 +S'editable' +p20687 +I00 +sS'value' +p20688 +I00 +ssS'unique' +p20689 +(dp20690 +S'editable' +p20691 +I00 +sS'value' +p20692 +I00 +ssS'properties' +p20693 +(dp20694 +S'default_value' +p20695 +(dp20696 +S'editable' +p20697 +I00 +sS'value' +p20698 +NssS'summary_default' +p20699 +(dp20700 +S'editable' +p20701 +I01 +sS'value' +p20702 +S'none' +p20703 +sssS'description' +p20704 +(dp20705 +S'editable' +p20706 +I01 +sS'value' +p20707 +g47 +sssS'updated_by' +p20708 +(dp20709 +S'mandatory' +p20710 +(dp20711 +S'editable' +p20712 +I00 +sS'value' +p20713 +I00 +ssS'name' +p20714 +(dp20715 +S'editable' +p20716 +I01 +sS'value' +p20717 +S'Updated by' +p20718 +ssS'data_type' +p20719 +(dp20720 +S'editable' +p20721 +I00 +sS'value' +p20722 +S'entity' +p20723 +ssS'entity_type' +p20724 +(dp20725 +S'editable' +p20726 +I00 +sS'value' +p20727 +S'CustomNonProjectEntity03' +p20728 +ssS'editable' +p20729 +(dp20730 +S'editable' +p20731 +I00 +sS'value' +p20732 +I00 +ssS'unique' +p20733 +(dp20734 +S'editable' +p20735 +I00 +sS'value' +p20736 +I00 +ssS'properties' +p20737 +(dp20738 +S'default_value' +p20739 +(dp20740 +S'editable' +p20741 +I00 +sS'value' +p20742 +NssS'summary_default' +p20743 +(dp20744 +S'editable' +p20745 +I01 +sS'value' +p20746 +S'none' +p20747 +ssS'valid_types' +p20748 +(dp20749 +S'editable' +p20750 +I01 +sS'value' +p20751 +(lp20752 +S'HumanUser' +p20753 +aS'ApiUser' +p20754 +asssS'description' +p20755 +(dp20756 +S'editable' +p20757 +I01 +sS'value' +p20758 +g47 +ssssS'LaunchShotConnection' +p20759 +(dp20760 +S'cached_display_name' +p20761 +(dp20762 +S'mandatory' +p20763 +(dp20764 +S'editable' +p20765 +I00 +sS'value' +p20766 +I00 +ssS'name' +p20767 +(dp20768 +S'editable' +p20769 +I01 +sS'value' +p20770 +S'Cached Display Name' +p20771 +ssS'data_type' +p20772 +(dp20773 +S'editable' +p20774 +I00 +sS'value' +p20775 +S'text' +p20776 +ssS'entity_type' +p20777 +(dp20778 +S'editable' +p20779 +I00 +sS'value' +p20780 +S'LaunchShotConnection' +p20781 +ssS'editable' +p20782 +(dp20783 +S'editable' +p20784 +I00 +sS'value' +p20785 +I01 +ssS'unique' +p20786 +(dp20787 +S'editable' +p20788 +I00 +sS'value' +p20789 +I00 +ssS'properties' +p20790 +(dp20791 +S'default_value' +p20792 +(dp20793 +S'editable' +p20794 +I00 +sS'value' +p20795 +NssS'summary_default' +p20796 +(dp20797 +S'editable' +p20798 +I00 +sS'value' +p20799 +S'none' +p20800 +sssS'description' +p20801 +(dp20802 +S'editable' +p20803 +I01 +sS'value' +p20804 +g47 +sssS'shot' +p20805 +(dp20806 +S'mandatory' +p20807 +(dp20808 +S'editable' +p20809 +I00 +sS'value' +p20810 +I00 +ssS'name' +p20811 +(dp20812 +S'editable' +p20813 +I01 +sS'value' +p20814 +S'Shot' +p20815 +ssS'data_type' +p20816 +(dp20817 +S'editable' +p20818 +I00 +sS'value' +p20819 +S'entity' +p20820 +ssS'entity_type' +p20821 +(dp20822 +S'editable' +p20823 +I00 +sS'value' +p20824 +S'LaunchShotConnection' +p20825 +ssS'editable' +p20826 +(dp20827 +S'editable' +p20828 +I00 +sS'value' +p20829 +I00 +ssS'unique' +p20830 +(dp20831 +S'editable' +p20832 +I00 +sS'value' +p20833 +I00 +ssS'properties' +p20834 +(dp20835 +S'default_value' +p20836 +(dp20837 +S'editable' +p20838 +I00 +sS'value' +p20839 +NssS'summary_default' +p20840 +(dp20841 +S'editable' +p20842 +I00 +sS'value' +p20843 +S'none' +p20844 +ssS'valid_types' +p20845 +(dp20846 +S'editable' +p20847 +I00 +sS'value' +p20848 +(lp20849 +S'Shot' +p20850 +asssS'description' +p20851 +(dp20852 +S'editable' +p20853 +I01 +sS'value' +p20854 +g47 +sssS'id' +p20855 +(dp20856 +S'mandatory' +p20857 +(dp20858 +S'editable' +p20859 +I00 +sS'value' +p20860 +I01 +ssS'name' +p20861 +(dp20862 +S'editable' +p20863 +I01 +sS'value' +p20864 +S'Id' +p20865 +ssS'data_type' +p20866 +(dp20867 +S'editable' +p20868 +I00 +sS'value' +p20869 +S'number' +p20870 +ssS'entity_type' +p20871 +(dp20872 +S'editable' +p20873 +I00 +sS'value' +p20874 +S'LaunchShotConnection' +p20875 +ssS'editable' +p20876 +(dp20877 +S'editable' +p20878 +I00 +sS'value' +p20879 +I00 +ssS'unique' +p20880 +(dp20881 +S'editable' +p20882 +I00 +sS'value' +p20883 +I00 +ssS'properties' +p20884 +(dp20885 +S'default_value' +p20886 +(dp20887 +S'editable' +p20888 +I00 +sS'value' +p20889 +NssS'summary_default' +p20890 +(dp20891 +S'editable' +p20892 +I00 +sS'value' +p20893 +S'none' +p20894 +sssS'description' +p20895 +(dp20896 +S'editable' +p20897 +I01 +sS'value' +p20898 +g47 +sssS'launch' +p20899 +(dp20900 +S'mandatory' +p20901 +(dp20902 +S'editable' +p20903 +I00 +sS'value' +p20904 +I00 +ssS'name' +p20905 +(dp20906 +S'editable' +p20907 +I01 +sS'value' +p20908 +S'Launch' +p20909 +ssS'data_type' +p20910 +(dp20911 +S'editable' +p20912 +I00 +sS'value' +p20913 +S'entity' +p20914 +ssS'entity_type' +p20915 +(dp20916 +S'editable' +p20917 +I00 +sS'value' +p20918 +S'LaunchShotConnection' +p20919 +ssS'editable' +p20920 +(dp20921 +S'editable' +p20922 +I00 +sS'value' +p20923 +I00 +ssS'unique' +p20924 +(dp20925 +S'editable' +p20926 +I00 +sS'value' +p20927 +I00 +ssS'properties' +p20928 +(dp20929 +S'default_value' +p20930 +(dp20931 +S'editable' +p20932 +I00 +sS'value' +p20933 +NssS'summary_default' +p20934 +(dp20935 +S'editable' +p20936 +I00 +sS'value' +p20937 +S'none' +p20938 +ssS'valid_types' +p20939 +(dp20940 +S'editable' +p20941 +I00 +sS'value' +p20942 +(lp20943 +S'Launch' +p20944 +asssS'description' +p20945 +(dp20946 +S'editable' +p20947 +I01 +sS'value' +p20948 +g47 +ssssS'ShotShotConnection' +p20949 +(dp20950 +S'shot' +p20951 +(dp20952 +S'mandatory' +p20953 +(dp20954 +S'editable' +p20955 +I00 +sS'value' +p20956 +I00 +ssS'name' +p20957 +(dp20958 +S'editable' +p20959 +I01 +sS'value' +p20960 +S'Shot' +p20961 +ssS'data_type' +p20962 +(dp20963 +S'editable' +p20964 +I00 +sS'value' +p20965 +S'entity' +p20966 +ssS'entity_type' +p20967 +(dp20968 +S'editable' +p20969 +I00 +sS'value' +p20970 +S'ShotShotConnection' +p20971 +ssS'editable' +p20972 +(dp20973 +S'editable' +p20974 +I00 +sS'value' +p20975 +I00 +ssS'unique' +p20976 +(dp20977 +S'editable' +p20978 +I00 +sS'value' +p20979 +I00 +ssS'properties' +p20980 +(dp20981 +S'default_value' +p20982 +(dp20983 +S'editable' +p20984 +I00 +sS'value' +p20985 +NssS'summary_default' +p20986 +(dp20987 +S'editable' +p20988 +I00 +sS'value' +p20989 +S'none' +p20990 +ssS'valid_types' +p20991 +(dp20992 +S'editable' +p20993 +I00 +sS'value' +p20994 +(lp20995 +S'Shot' +p20996 +asssS'description' +p20997 +(dp20998 +S'editable' +p20999 +I01 +sS'value' +p21000 +g47 +sssS'cached_display_name' +p21001 +(dp21002 +S'mandatory' +p21003 +(dp21004 +S'editable' +p21005 +I00 +sS'value' +p21006 +I00 +ssS'name' +p21007 +(dp21008 +S'editable' +p21009 +I01 +sS'value' +p21010 +S'Cached Display Name' +p21011 +ssS'data_type' +p21012 +(dp21013 +S'editable' +p21014 +I00 +sS'value' +p21015 +S'text' +p21016 +ssS'entity_type' +p21017 +(dp21018 +S'editable' +p21019 +I00 +sS'value' +p21020 +S'ShotShotConnection' +p21021 +ssS'editable' +p21022 +(dp21023 +S'editable' +p21024 +I00 +sS'value' +p21025 +I01 +ssS'unique' +p21026 +(dp21027 +S'editable' +p21028 +I00 +sS'value' +p21029 +I00 +ssS'properties' +p21030 +(dp21031 +S'default_value' +p21032 +(dp21033 +S'editable' +p21034 +I00 +sS'value' +p21035 +NssS'summary_default' +p21036 +(dp21037 +S'editable' +p21038 +I00 +sS'value' +p21039 +S'none' +p21040 +sssS'description' +p21041 +(dp21042 +S'editable' +p21043 +I01 +sS'value' +p21044 +g47 +sssS'parent_shot' +p21045 +(dp21046 +S'mandatory' +p21047 +(dp21048 +S'editable' +p21049 +I00 +sS'value' +p21050 +I00 +ssS'name' +p21051 +(dp21052 +S'editable' +p21053 +I01 +sS'value' +p21054 +S'Shot' +p21055 +ssS'data_type' +p21056 +(dp21057 +S'editable' +p21058 +I00 +sS'value' +p21059 +S'entity' +p21060 +ssS'entity_type' +p21061 +(dp21062 +S'editable' +p21063 +I00 +sS'value' +p21064 +S'ShotShotConnection' +p21065 +ssS'editable' +p21066 +(dp21067 +S'editable' +p21068 +I00 +sS'value' +p21069 +I00 +ssS'unique' +p21070 +(dp21071 +S'editable' +p21072 +I00 +sS'value' +p21073 +I00 +ssS'properties' +p21074 +(dp21075 +S'default_value' +p21076 +(dp21077 +S'editable' +p21078 +I00 +sS'value' +p21079 +NssS'summary_default' +p21080 +(dp21081 +S'editable' +p21082 +I00 +sS'value' +p21083 +S'none' +p21084 +ssS'valid_types' +p21085 +(dp21086 +S'editable' +p21087 +I00 +sS'value' +p21088 +(lp21089 +S'Shot' +p21090 +asssS'description' +p21091 +(dp21092 +S'editable' +p21093 +I01 +sS'value' +p21094 +g47 +sssS'id' +p21095 +(dp21096 +S'mandatory' +p21097 +(dp21098 +S'editable' +p21099 +I00 +sS'value' +p21100 +I01 +ssS'name' +p21101 +(dp21102 +S'editable' +p21103 +I01 +sS'value' +p21104 +S'Id' +p21105 +ssS'data_type' +p21106 +(dp21107 +S'editable' +p21108 +I00 +sS'value' +p21109 +S'number' +p21110 +ssS'entity_type' +p21111 +(dp21112 +S'editable' +p21113 +I00 +sS'value' +p21114 +S'ShotShotConnection' +p21115 +ssS'editable' +p21116 +(dp21117 +S'editable' +p21118 +I00 +sS'value' +p21119 +I00 +ssS'unique' +p21120 +(dp21121 +S'editable' +p21122 +I00 +sS'value' +p21123 +I00 +ssS'properties' +p21124 +(dp21125 +S'default_value' +p21126 +(dp21127 +S'editable' +p21128 +I00 +sS'value' +p21129 +NssS'summary_default' +p21130 +(dp21131 +S'editable' +p21132 +I00 +sS'value' +p21133 +S'none' +p21134 +sssS'description' +p21135 +(dp21136 +S'editable' +p21137 +I01 +sS'value' +p21138 +g47 +ssssS'PerformerRoutineConnection' +p21139 +(dp21140 +S'cached_display_name' +p21141 +(dp21142 +S'mandatory' +p21143 +(dp21144 +S'editable' +p21145 +I00 +sS'value' +p21146 +I00 +ssS'name' +p21147 +(dp21148 +S'editable' +p21149 +I01 +sS'value' +p21150 +S'Cached Display Name' +p21151 +ssS'data_type' +p21152 +(dp21153 +S'editable' +p21154 +I00 +sS'value' +p21155 +S'text' +p21156 +ssS'entity_type' +p21157 +(dp21158 +S'editable' +p21159 +I00 +sS'value' +p21160 +S'PerformerRoutineConnection' +p21161 +ssS'editable' +p21162 +(dp21163 +S'editable' +p21164 +I00 +sS'value' +p21165 +I01 +ssS'unique' +p21166 +(dp21167 +S'editable' +p21168 +I00 +sS'value' +p21169 +I00 +ssS'properties' +p21170 +(dp21171 +S'default_value' +p21172 +(dp21173 +S'editable' +p21174 +I00 +sS'value' +p21175 +NssS'summary_default' +p21176 +(dp21177 +S'editable' +p21178 +I00 +sS'value' +p21179 +S'none' +p21180 +sssS'description' +p21181 +(dp21182 +S'editable' +p21183 +I01 +sS'value' +p21184 +g47 +sssS'performer' +p21185 +(dp21186 +S'mandatory' +p21187 +(dp21188 +S'editable' +p21189 +I00 +sS'value' +p21190 +I00 +ssS'name' +p21191 +(dp21192 +S'editable' +p21193 +I01 +sS'value' +p21194 +S'Performer' +p21195 +ssS'data_type' +p21196 +(dp21197 +S'editable' +p21198 +I00 +sS'value' +p21199 +S'entity' +p21200 +ssS'entity_type' +p21201 +(dp21202 +S'editable' +p21203 +I00 +sS'value' +p21204 +S'PerformerRoutineConnection' +p21205 +ssS'editable' +p21206 +(dp21207 +S'editable' +p21208 +I00 +sS'value' +p21209 +I00 +ssS'unique' +p21210 +(dp21211 +S'editable' +p21212 +I00 +sS'value' +p21213 +I00 +ssS'properties' +p21214 +(dp21215 +S'default_value' +p21216 +(dp21217 +S'editable' +p21218 +I00 +sS'value' +p21219 +NssS'summary_default' +p21220 +(dp21221 +S'editable' +p21222 +I00 +sS'value' +p21223 +S'none' +p21224 +ssS'valid_types' +p21225 +(dp21226 +S'editable' +p21227 +I00 +sS'value' +p21228 +(lp21229 +S'Performer' +p21230 +asssS'description' +p21231 +(dp21232 +S'editable' +p21233 +I01 +sS'value' +p21234 +g47 +sssS'id' +p21235 +(dp21236 +S'mandatory' +p21237 +(dp21238 +S'editable' +p21239 +I00 +sS'value' +p21240 +I01 +ssS'name' +p21241 +(dp21242 +S'editable' +p21243 +I01 +sS'value' +p21244 +S'Id' +p21245 +ssS'data_type' +p21246 +(dp21247 +S'editable' +p21248 +I00 +sS'value' +p21249 +S'number' +p21250 +ssS'entity_type' +p21251 +(dp21252 +S'editable' +p21253 +I00 +sS'value' +p21254 +S'PerformerRoutineConnection' +p21255 +ssS'editable' +p21256 +(dp21257 +S'editable' +p21258 +I00 +sS'value' +p21259 +I00 +ssS'unique' +p21260 +(dp21261 +S'editable' +p21262 +I00 +sS'value' +p21263 +I00 +ssS'properties' +p21264 +(dp21265 +S'default_value' +p21266 +(dp21267 +S'editable' +p21268 +I00 +sS'value' +p21269 +NssS'summary_default' +p21270 +(dp21271 +S'editable' +p21272 +I00 +sS'value' +p21273 +S'none' +p21274 +sssS'description' +p21275 +(dp21276 +S'editable' +p21277 +I01 +sS'value' +p21278 +g47 +sssS'routine' +p21279 +(dp21280 +S'mandatory' +p21281 +(dp21282 +S'editable' +p21283 +I00 +sS'value' +p21284 +I00 +ssS'name' +p21285 +(dp21286 +S'editable' +p21287 +I01 +sS'value' +p21288 +S'Mocap Routine' +p21289 +ssS'data_type' +p21290 +(dp21291 +S'editable' +p21292 +I00 +sS'value' +p21293 +S'entity' +p21294 +ssS'entity_type' +p21295 +(dp21296 +S'editable' +p21297 +I00 +sS'value' +p21298 +S'PerformerRoutineConnection' +p21299 +ssS'editable' +p21300 +(dp21301 +S'editable' +p21302 +I00 +sS'value' +p21303 +I00 +ssS'unique' +p21304 +(dp21305 +S'editable' +p21306 +I00 +sS'value' +p21307 +I00 +ssS'properties' +p21308 +(dp21309 +S'default_value' +p21310 +(dp21311 +S'editable' +p21312 +I00 +sS'value' +p21313 +NssS'summary_default' +p21314 +(dp21315 +S'editable' +p21316 +I00 +sS'value' +p21317 +S'none' +p21318 +ssS'valid_types' +p21319 +(dp21320 +S'editable' +p21321 +I00 +sS'value' +p21322 +(lp21323 +S'Routine' +p21324 +asssS'description' +p21325 +(dp21326 +S'editable' +p21327 +I01 +sS'value' +p21328 +g47 +ssssS'PublishedFileType' +p21329 +(dp21330 +S'code' +p21331 +(dp21332 +S'mandatory' +p21333 +(dp21334 +S'editable' +p21335 +I00 +sS'value' +p21336 +I01 +ssS'name' +p21337 +(dp21338 +S'editable' +p21339 +I01 +sS'value' +p21340 +S'Published File Type Name' +p21341 +ssS'data_type' +p21342 +(dp21343 +S'editable' +p21344 +I00 +sS'value' +p21345 +S'text' +p21346 +ssS'entity_type' +p21347 +(dp21348 +S'editable' +p21349 +I00 +sS'value' +p21350 +S'PublishedFileType' +p21351 +ssS'editable' +p21352 +(dp21353 +S'editable' +p21354 +I00 +sS'value' +p21355 +I01 +ssS'unique' +p21356 +(dp21357 +S'editable' +p21358 +I00 +sS'value' +p21359 +I00 +ssS'properties' +p21360 +(dp21361 +S'default_value' +p21362 +(dp21363 +S'editable' +p21364 +I00 +sS'value' +p21365 +NssS'summary_default' +p21366 +(dp21367 +S'editable' +p21368 +I01 +sS'value' +p21369 +S'none' +p21370 +sssS'description' +p21371 +(dp21372 +S'editable' +p21373 +I01 +sS'value' +p21374 +g47 +sssS'description' +p21375 +(dp21376 +S'mandatory' +p21377 +(dp21378 +S'editable' +p21379 +I00 +sS'value' +p21380 +I00 +ssS'name' +p21381 +(dp21382 +S'editable' +p21383 +I01 +sS'value' +p21384 +S'Description' +p21385 +ssS'data_type' +p21386 +(dp21387 +S'editable' +p21388 +I00 +sS'value' +p21389 +S'text' +p21390 +ssS'entity_type' +p21391 +(dp21392 +S'editable' +p21393 +I00 +sS'value' +p21394 +S'PublishedFileType' +p21395 +ssS'editable' +p21396 +(dp21397 +S'editable' +p21398 +I00 +sS'value' +p21399 +I01 +ssS'unique' +p21400 +(dp21401 +S'editable' +p21402 +I00 +sS'value' +p21403 +I00 +ssS'properties' +p21404 +(dp21405 +S'default_value' +p21406 +(dp21407 +S'editable' +p21408 +I00 +sS'value' +p21409 +NssS'summary_default' +p21410 +(dp21411 +S'editable' +p21412 +I01 +sS'value' +p21413 +S'none' +p21414 +sssS'description' +p21415 +(dp21416 +S'editable' +p21417 +I01 +sS'value' +p21418 +g47 +sssS'short_name' +p21419 +(dp21420 +S'mandatory' +p21421 +(dp21422 +S'editable' +p21423 +I00 +sS'value' +p21424 +I00 +ssS'name' +p21425 +(dp21426 +S'editable' +p21427 +I01 +sS'value' +p21428 +S'Short Name' +p21429 +ssS'data_type' +p21430 +(dp21431 +S'editable' +p21432 +I00 +sS'value' +p21433 +S'text' +p21434 +ssS'entity_type' +p21435 +(dp21436 +S'editable' +p21437 +I00 +sS'value' +p21438 +S'PublishedFileType' +p21439 +ssS'editable' +p21440 +(dp21441 +S'editable' +p21442 +I00 +sS'value' +p21443 +I01 +ssS'unique' +p21444 +(dp21445 +S'editable' +p21446 +I00 +sS'value' +p21447 +I00 +ssS'properties' +p21448 +(dp21449 +S'default_value' +p21450 +(dp21451 +S'editable' +p21452 +I00 +sS'value' +p21453 +NssS'summary_default' +p21454 +(dp21455 +S'editable' +p21456 +I01 +sS'value' +p21457 +S'none' +p21458 +sssS'description' +p21459 +(dp21460 +S'editable' +p21461 +I01 +sS'value' +p21462 +g47 +sssS'created_at' +p21463 +(dp21464 +S'mandatory' +p21465 +(dp21466 +S'editable' +p21467 +I00 +sS'value' +p21468 +I00 +ssS'name' +p21469 +(dp21470 +S'editable' +p21471 +I01 +sS'value' +p21472 +S'Date Created' +p21473 +ssS'data_type' +p21474 +(dp21475 +S'editable' +p21476 +I00 +sS'value' +p21477 +S'date_time' +p21478 +ssS'entity_type' +p21479 +(dp21480 +S'editable' +p21481 +I00 +sS'value' +p21482 +S'PublishedFileType' +p21483 +ssS'editable' +p21484 +(dp21485 +S'editable' +p21486 +I00 +sS'value' +p21487 +I00 +ssS'unique' +p21488 +(dp21489 +S'editable' +p21490 +I00 +sS'value' +p21491 +I00 +ssS'properties' +p21492 +(dp21493 +S'default_value' +p21494 +(dp21495 +S'editable' +p21496 +I00 +sS'value' +p21497 +NssS'summary_default' +p21498 +(dp21499 +S'editable' +p21500 +I01 +sS'value' +p21501 +S'none' +p21502 +sssS'description' +p21503 +(dp21504 +S'editable' +p21505 +I01 +sS'value' +p21506 +g47 +sssS'updated_at' +p21507 +(dp21508 +S'mandatory' +p21509 +(dp21510 +S'editable' +p21511 +I00 +sS'value' +p21512 +I00 +ssS'name' +p21513 +(dp21514 +S'editable' +p21515 +I01 +sS'value' +p21516 +S'Date Updated' +p21517 +ssS'data_type' +p21518 +(dp21519 +S'editable' +p21520 +I00 +sS'value' +p21521 +S'date_time' +p21522 +ssS'entity_type' +p21523 +(dp21524 +S'editable' +p21525 +I00 +sS'value' +p21526 +S'PublishedFileType' +p21527 +ssS'editable' +p21528 +(dp21529 +S'editable' +p21530 +I00 +sS'value' +p21531 +I00 +ssS'unique' +p21532 +(dp21533 +S'editable' +p21534 +I00 +sS'value' +p21535 +I00 +ssS'properties' +p21536 +(dp21537 +S'default_value' +p21538 +(dp21539 +S'editable' +p21540 +I00 +sS'value' +p21541 +NssS'summary_default' +p21542 +(dp21543 +S'editable' +p21544 +I01 +sS'value' +p21545 +S'none' +p21546 +sssS'description' +p21547 +(dp21548 +S'editable' +p21549 +I01 +sS'value' +p21550 +g47 +sssS'created_by' +p21551 +(dp21552 +S'mandatory' +p21553 +(dp21554 +S'editable' +p21555 +I00 +sS'value' +p21556 +I00 +ssS'name' +p21557 +(dp21558 +S'editable' +p21559 +I01 +sS'value' +p21560 +S'Created by' +p21561 +ssS'data_type' +p21562 +(dp21563 +S'editable' +p21564 +I00 +sS'value' +p21565 +S'entity' +p21566 +ssS'entity_type' +p21567 +(dp21568 +S'editable' +p21569 +I00 +sS'value' +p21570 +S'PublishedFileType' +p21571 +ssS'editable' +p21572 +(dp21573 +S'editable' +p21574 +I00 +sS'value' +p21575 +I00 +ssS'unique' +p21576 +(dp21577 +S'editable' +p21578 +I00 +sS'value' +p21579 +I00 +ssS'properties' +p21580 +(dp21581 +S'default_value' +p21582 +(dp21583 +S'editable' +p21584 +I00 +sS'value' +p21585 +NssS'summary_default' +p21586 +(dp21587 +S'editable' +p21588 +I01 +sS'value' +p21589 +S'none' +p21590 +ssS'valid_types' +p21591 +(dp21592 +S'editable' +p21593 +I01 +sS'value' +p21594 +(lp21595 +S'HumanUser' +p21596 +aS'ApiUser' +p21597 +asssS'description' +p21598 +(dp21599 +S'editable' +p21600 +I01 +sS'value' +p21601 +g47 +sssS'sg_status_list' +p21602 +(dp21603 +S'mandatory' +p21604 +(dp21605 +S'editable' +p21606 +I00 +sS'value' +p21607 +I00 +ssS'name' +p21608 +(dp21609 +S'editable' +p21610 +I01 +sS'value' +p21611 +S'Status' +p21612 +ssS'data_type' +p21613 +(dp21614 +S'editable' +p21615 +I00 +sS'value' +p21616 +S'status_list' +p21617 +ssS'entity_type' +p21618 +(dp21619 +S'editable' +p21620 +I00 +sS'value' +p21621 +S'PublishedFileType' +p21622 +ssS'editable' +p21623 +(dp21624 +S'editable' +p21625 +I00 +sS'value' +p21626 +I01 +ssS'unique' +p21627 +(dp21628 +S'editable' +p21629 +I00 +sS'value' +p21630 +I00 +ssS'properties' +p21631 +(dp21632 +S'default_value' +p21633 +(dp21634 +S'editable' +p21635 +I01 +sS'value' +p21636 +S'wtg' +p21637 +ssS'valid_values' +p21638 +(dp21639 +S'editable' +p21640 +I01 +sS'value' +p21641 +(lp21642 +S'wtg' +p21643 +aS'ip' +p21644 +aS'cmpt' +p21645 +assS'summary_default' +p21646 +(dp21647 +S'editable' +p21648 +I01 +sS'value' +p21649 +S'none' +p21650 +sssS'description' +p21651 +(dp21652 +S'editable' +p21653 +I01 +sS'value' +p21654 +g47 +sssS'image' +p21655 +(dp21656 +S'mandatory' +p21657 +(dp21658 +S'editable' +p21659 +I00 +sS'value' +p21660 +I00 +ssS'name' +p21661 +(dp21662 +S'editable' +p21663 +I01 +sS'value' +p21664 +S'Thumbnail' +p21665 +ssS'data_type' +p21666 +(dp21667 +S'editable' +p21668 +I00 +sS'value' +p21669 +S'image' +p21670 +ssS'entity_type' +p21671 +(dp21672 +S'editable' +p21673 +I00 +sS'value' +p21674 +S'PublishedFileType' +p21675 +ssS'editable' +p21676 +(dp21677 +S'editable' +p21678 +I00 +sS'value' +p21679 +I01 +ssS'unique' +p21680 +(dp21681 +S'editable' +p21682 +I00 +sS'value' +p21683 +I00 +ssS'properties' +p21684 +(dp21685 +S'default_value' +p21686 +(dp21687 +S'editable' +p21688 +I00 +sS'value' +p21689 +NssS'summary_default' +p21690 +(dp21691 +S'editable' +p21692 +I01 +sS'value' +p21693 +S'none' +p21694 +sssS'description' +p21695 +(dp21696 +S'editable' +p21697 +I01 +sS'value' +p21698 +g47 +sssS'cached_display_name' +p21699 +(dp21700 +S'mandatory' +p21701 +(dp21702 +S'editable' +p21703 +I00 +sS'value' +p21704 +I00 +ssS'name' +p21705 +(dp21706 +S'editable' +p21707 +I01 +sS'value' +p21708 +S'Cached Display Name' +p21709 +ssS'data_type' +p21710 +(dp21711 +S'editable' +p21712 +I00 +sS'value' +p21713 +S'text' +p21714 +ssS'entity_type' +p21715 +(dp21716 +S'editable' +p21717 +I00 +sS'value' +p21718 +S'PublishedFileType' +p21719 +ssS'editable' +p21720 +(dp21721 +S'editable' +p21722 +I00 +sS'value' +p21723 +I01 +ssS'unique' +p21724 +(dp21725 +S'editable' +p21726 +I00 +sS'value' +p21727 +I00 +ssS'properties' +p21728 +(dp21729 +S'default_value' +p21730 +(dp21731 +S'editable' +p21732 +I00 +sS'value' +p21733 +NssS'summary_default' +p21734 +(dp21735 +S'editable' +p21736 +I00 +sS'value' +p21737 +S'none' +p21738 +sssS'description' +p21739 +(dp21740 +S'editable' +p21741 +I01 +sS'value' +p21742 +g47 +sssS'tag_list' +p21743 +(dp21744 +S'mandatory' +p21745 +(dp21746 +S'editable' +p21747 +I00 +sS'value' +p21748 +I00 +ssS'name' +p21749 +(dp21750 +S'editable' +p21751 +I01 +sS'value' +p21752 +S'Tags' +p21753 +ssS'data_type' +p21754 +(dp21755 +S'editable' +p21756 +I00 +sS'value' +p21757 +S'tag_list' +p21758 +ssS'entity_type' +p21759 +(dp21760 +S'editable' +p21761 +I00 +sS'value' +p21762 +S'PublishedFileType' +p21763 +ssS'editable' +p21764 +(dp21765 +S'editable' +p21766 +I00 +sS'value' +p21767 +I01 +ssS'unique' +p21768 +(dp21769 +S'editable' +p21770 +I00 +sS'value' +p21771 +I00 +ssS'properties' +p21772 +(dp21773 +S'default_value' +p21774 +(dp21775 +S'editable' +p21776 +I00 +sS'value' +p21777 +NssS'summary_default' +p21778 +(dp21779 +S'editable' +p21780 +I01 +sS'value' +p21781 +S'none' +p21782 +ssS'valid_types' +p21783 +(dp21784 +S'editable' +p21785 +I01 +sS'value' +p21786 +(lp21787 +S'Tag' +p21788 +asssS'description' +p21789 +(dp21790 +S'editable' +p21791 +I01 +sS'value' +p21792 +g47 +sssS'id' +p21793 +(dp21794 +S'mandatory' +p21795 +(dp21796 +S'editable' +p21797 +I00 +sS'value' +p21798 +I00 +ssS'name' +p21799 +(dp21800 +S'editable' +p21801 +I01 +sS'value' +p21802 +S'Id' +p21803 +ssS'data_type' +p21804 +(dp21805 +S'editable' +p21806 +I00 +sS'value' +p21807 +S'number' +p21808 +ssS'entity_type' +p21809 +(dp21810 +S'editable' +p21811 +I00 +sS'value' +p21812 +S'PublishedFileType' +p21813 +ssS'editable' +p21814 +(dp21815 +S'editable' +p21816 +I00 +sS'value' +p21817 +I00 +ssS'unique' +p21818 +(dp21819 +S'editable' +p21820 +I00 +sS'value' +p21821 +I00 +ssS'properties' +p21822 +(dp21823 +S'default_value' +p21824 +(dp21825 +S'editable' +p21826 +I00 +sS'value' +p21827 +NssS'summary_default' +p21828 +(dp21829 +S'editable' +p21830 +I01 +sS'value' +p21831 +S'none' +p21832 +sssS'description' +p21833 +(dp21834 +S'editable' +p21835 +I01 +sS'value' +p21836 +g47 +sssS'updated_by' +p21837 +(dp21838 +S'mandatory' +p21839 +(dp21840 +S'editable' +p21841 +I00 +sS'value' +p21842 +I00 +ssS'name' +p21843 +(dp21844 +S'editable' +p21845 +I01 +sS'value' +p21846 +S'Updated by' +p21847 +ssS'data_type' +p21848 +(dp21849 +S'editable' +p21850 +I00 +sS'value' +p21851 +S'entity' +p21852 +ssS'entity_type' +p21853 +(dp21854 +S'editable' +p21855 +I00 +sS'value' +p21856 +S'PublishedFileType' +p21857 +ssS'editable' +p21858 +(dp21859 +S'editable' +p21860 +I00 +sS'value' +p21861 +I00 +ssS'unique' +p21862 +(dp21863 +S'editable' +p21864 +I00 +sS'value' +p21865 +I00 +ssS'properties' +p21866 +(dp21867 +S'default_value' +p21868 +(dp21869 +S'editable' +p21870 +I00 +sS'value' +p21871 +NssS'summary_default' +p21872 +(dp21873 +S'editable' +p21874 +I01 +sS'value' +p21875 +S'none' +p21876 +ssS'valid_types' +p21877 +(dp21878 +S'editable' +p21879 +I01 +sS'value' +p21880 +(lp21881 +S'HumanUser' +p21882 +aS'ApiUser' +p21883 +asssS'description' +p21884 +(dp21885 +S'editable' +p21886 +I01 +sS'value' +p21887 +g47 +ssssS'Element' +p21888 +(dp21889 +S'sg_element_type' +p21890 +(dp21891 +S'mandatory' +p21892 +(dp21893 +S'editable' +p21894 +I00 +sS'value' +p21895 +I00 +ssS'name' +p21896 +(dp21897 +S'editable' +p21898 +I01 +sS'value' +p21899 +S'Type' +p21900 +ssS'data_type' +p21901 +(dp21902 +S'editable' +p21903 +I00 +sS'value' +p21904 +S'list' +p21905 +ssS'entity_type' +p21906 +(dp21907 +S'editable' +p21908 +I00 +sS'value' +p21909 +S'Element' +p21910 +ssS'editable' +p21911 +(dp21912 +S'editable' +p21913 +I00 +sS'value' +p21914 +I01 +ssS'unique' +p21915 +(dp21916 +S'editable' +p21917 +I00 +sS'value' +p21918 +I00 +ssS'properties' +p21919 +(dp21920 +S'default_value' +p21921 +(dp21922 +S'editable' +p21923 +I00 +sS'value' +p21924 +NssS'valid_values' +p21925 +(dp21926 +S'editable' +p21927 +I01 +sS'value' +p21928 +(lp21929 +ssS'summary_default' +p21930 +(dp21931 +S'editable' +p21932 +I01 +sS'value' +p21933 +S'none' +p21934 +sssS'description' +p21935 +(dp21936 +S'editable' +p21937 +I01 +sS'value' +p21938 +g47 +sssS'open_notes_count' +p21939 +(dp21940 +S'mandatory' +p21941 +(dp21942 +S'editable' +p21943 +I00 +sS'value' +p21944 +I00 +ssS'name' +p21945 +(dp21946 +S'editable' +p21947 +I01 +sS'value' +p21948 +S'Open Notes Count' +p21949 +ssS'data_type' +p21950 +(dp21951 +S'editable' +p21952 +I00 +sS'value' +p21953 +S'text' +p21954 +ssS'entity_type' +p21955 +(dp21956 +S'editable' +p21957 +I00 +sS'value' +p21958 +S'Element' +p21959 +ssS'editable' +p21960 +(dp21961 +S'editable' +p21962 +I00 +sS'value' +p21963 +I00 +ssS'unique' +p21964 +(dp21965 +S'editable' +p21966 +I00 +sS'value' +p21967 +I00 +ssS'properties' +p21968 +(dp21969 +S'default_value' +p21970 +(dp21971 +S'editable' +p21972 +I00 +sS'value' +p21973 +NssS'summary_default' +p21974 +(dp21975 +S'editable' +p21976 +I01 +sS'value' +p21977 +S'none' +p21978 +sssS'description' +p21979 +(dp21980 +S'editable' +p21981 +I01 +sS'value' +p21982 +g47 +sssS'code' +p21983 +(dp21984 +S'mandatory' +p21985 +(dp21986 +S'editable' +p21987 +I00 +sS'value' +p21988 +I01 +ssS'name' +p21989 +(dp21990 +S'editable' +p21991 +I01 +sS'value' +p21992 +S'Element Name' +p21993 +ssS'data_type' +p21994 +(dp21995 +S'editable' +p21996 +I00 +sS'value' +p21997 +S'text' +p21998 +ssS'entity_type' +p21999 +(dp22000 +S'editable' +p22001 +I00 +sS'value' +p22002 +S'Element' +p22003 +ssS'editable' +p22004 +(dp22005 +S'editable' +p22006 +I00 +sS'value' +p22007 +I01 +ssS'unique' +p22008 +(dp22009 +S'editable' +p22010 +I00 +sS'value' +p22011 +I00 +ssS'properties' +p22012 +(dp22013 +S'default_value' +p22014 +(dp22015 +S'editable' +p22016 +I00 +sS'value' +p22017 +NssS'summary_default' +p22018 +(dp22019 +S'editable' +p22020 +I01 +sS'value' +p22021 +S'none' +p22022 +sssS'description' +p22023 +(dp22024 +S'editable' +p22025 +I01 +sS'value' +p22026 +g47 +sssS'image' +p22027 +(dp22028 +S'mandatory' +p22029 +(dp22030 +S'editable' +p22031 +I00 +sS'value' +p22032 +I00 +ssS'name' +p22033 +(dp22034 +S'editable' +p22035 +I01 +sS'value' +p22036 +S'Thumbnail' +p22037 +ssS'data_type' +p22038 +(dp22039 +S'editable' +p22040 +I00 +sS'value' +p22041 +S'image' +p22042 +ssS'entity_type' +p22043 +(dp22044 +S'editable' +p22045 +I00 +sS'value' +p22046 +S'Element' +p22047 +ssS'editable' +p22048 +(dp22049 +S'editable' +p22050 +I00 +sS'value' +p22051 +I01 +ssS'unique' +p22052 +(dp22053 +S'editable' +p22054 +I00 +sS'value' +p22055 +I00 +ssS'properties' +p22056 +(dp22057 +S'default_value' +p22058 +(dp22059 +S'editable' +p22060 +I00 +sS'value' +p22061 +NssS'summary_default' +p22062 +(dp22063 +S'editable' +p22064 +I01 +sS'value' +p22065 +S'none' +p22066 +sssS'description' +p22067 +(dp22068 +S'editable' +p22069 +I01 +sS'value' +p22070 +g47 +sssS'tag_list' +p22071 +(dp22072 +S'mandatory' +p22073 +(dp22074 +S'editable' +p22075 +I00 +sS'value' +p22076 +I00 +ssS'name' +p22077 +(dp22078 +S'editable' +p22079 +I01 +sS'value' +p22080 +S'Tags' +p22081 +ssS'data_type' +p22082 +(dp22083 +S'editable' +p22084 +I00 +sS'value' +p22085 +S'tag_list' +p22086 +ssS'entity_type' +p22087 +(dp22088 +S'editable' +p22089 +I00 +sS'value' +p22090 +S'Element' +p22091 +ssS'editable' +p22092 +(dp22093 +S'editable' +p22094 +I00 +sS'value' +p22095 +I01 +ssS'unique' +p22096 +(dp22097 +S'editable' +p22098 +I00 +sS'value' +p22099 +I00 +ssS'properties' +p22100 +(dp22101 +S'default_value' +p22102 +(dp22103 +S'editable' +p22104 +I00 +sS'value' +p22105 +NssS'summary_default' +p22106 +(dp22107 +S'editable' +p22108 +I01 +sS'value' +p22109 +S'none' +p22110 +ssS'valid_types' +p22111 +(dp22112 +S'editable' +p22113 +I01 +sS'value' +p22114 +(lp22115 +S'Tag' +p22116 +asssS'description' +p22117 +(dp22118 +S'editable' +p22119 +I01 +sS'value' +p22120 +g47 +sssS'head_duration' +p22121 +(dp22122 +S'mandatory' +p22123 +(dp22124 +S'editable' +p22125 +I00 +sS'value' +p22126 +I00 +ssS'name' +p22127 +(dp22128 +S'editable' +p22129 +I01 +sS'value' +p22130 +S'Raw Head Duration' +p22131 +ssS'data_type' +p22132 +(dp22133 +S'editable' +p22134 +I00 +sS'value' +p22135 +S'number' +p22136 +ssS'entity_type' +p22137 +(dp22138 +S'editable' +p22139 +I00 +sS'value' +p22140 +S'Element' +p22141 +ssS'editable' +p22142 +(dp22143 +S'editable' +p22144 +I00 +sS'value' +p22145 +I01 +ssS'unique' +p22146 +(dp22147 +S'editable' +p22148 +I00 +sS'value' +p22149 +I00 +ssS'properties' +p22150 +(dp22151 +S'default_value' +p22152 +(dp22153 +S'editable' +p22154 +I00 +sS'value' +p22155 +NssS'summary_default' +p22156 +(dp22157 +S'editable' +p22158 +I01 +sS'value' +p22159 +S'none' +p22160 +sssS'description' +p22161 +(dp22162 +S'editable' +p22163 +I01 +sS'value' +p22164 +g47 +sssS'updated_at' +p22165 +(dp22166 +S'mandatory' +p22167 +(dp22168 +S'editable' +p22169 +I00 +sS'value' +p22170 +I00 +ssS'name' +p22171 +(dp22172 +S'editable' +p22173 +I01 +sS'value' +p22174 +S'Date Updated' +p22175 +ssS'data_type' +p22176 +(dp22177 +S'editable' +p22178 +I00 +sS'value' +p22179 +S'date_time' +p22180 +ssS'entity_type' +p22181 +(dp22182 +S'editable' +p22183 +I00 +sS'value' +p22184 +S'Element' +p22185 +ssS'editable' +p22186 +(dp22187 +S'editable' +p22188 +I00 +sS'value' +p22189 +I00 +ssS'unique' +p22190 +(dp22191 +S'editable' +p22192 +I00 +sS'value' +p22193 +I00 +ssS'properties' +p22194 +(dp22195 +S'default_value' +p22196 +(dp22197 +S'editable' +p22198 +I00 +sS'value' +p22199 +NssS'summary_default' +p22200 +(dp22201 +S'editable' +p22202 +I01 +sS'value' +p22203 +S'none' +p22204 +sssS'description' +p22205 +(dp22206 +S'editable' +p22207 +I01 +sS'value' +p22208 +g47 +sssS'tasks' +p22209 +(dp22210 +S'mandatory' +p22211 +(dp22212 +S'editable' +p22213 +I00 +sS'value' +p22214 +I00 +ssS'name' +p22215 +(dp22216 +S'editable' +p22217 +I01 +sS'value' +p22218 +S'Tasks' +p22219 +ssS'data_type' +p22220 +(dp22221 +S'editable' +p22222 +I00 +sS'value' +p22223 +S'multi_entity' +p22224 +ssS'entity_type' +p22225 +(dp22226 +S'editable' +p22227 +I00 +sS'value' +p22228 +S'Element' +p22229 +ssS'editable' +p22230 +(dp22231 +S'editable' +p22232 +I00 +sS'value' +p22233 +I01 +ssS'unique' +p22234 +(dp22235 +S'editable' +p22236 +I00 +sS'value' +p22237 +I00 +ssS'properties' +p22238 +(dp22239 +S'default_value' +p22240 +(dp22241 +S'editable' +p22242 +I00 +sS'value' +p22243 +NssS'summary_default' +p22244 +(dp22245 +S'editable' +p22246 +I01 +sS'value' +p22247 +S'none' +p22248 +ssS'valid_types' +p22249 +(dp22250 +S'editable' +p22251 +I01 +sS'value' +p22252 +(lp22253 +S'Task' +p22254 +asssS'description' +p22255 +(dp22256 +S'editable' +p22257 +I01 +sS'value' +p22258 +g47 +sssS'cached_display_name' +p22259 +(dp22260 +S'mandatory' +p22261 +(dp22262 +S'editable' +p22263 +I00 +sS'value' +p22264 +I00 +ssS'name' +p22265 +(dp22266 +S'editable' +p22267 +I01 +sS'value' +p22268 +S'Cached Display Name' +p22269 +ssS'data_type' +p22270 +(dp22271 +S'editable' +p22272 +I00 +sS'value' +p22273 +S'text' +p22274 +ssS'entity_type' +p22275 +(dp22276 +S'editable' +p22277 +I00 +sS'value' +p22278 +S'Element' +p22279 +ssS'editable' +p22280 +(dp22281 +S'editable' +p22282 +I00 +sS'value' +p22283 +I01 +ssS'unique' +p22284 +(dp22285 +S'editable' +p22286 +I00 +sS'value' +p22287 +I00 +ssS'properties' +p22288 +(dp22289 +S'default_value' +p22290 +(dp22291 +S'editable' +p22292 +I00 +sS'value' +p22293 +NssS'summary_default' +p22294 +(dp22295 +S'editable' +p22296 +I00 +sS'value' +p22297 +S'none' +p22298 +sssS'description' +p22299 +(dp22300 +S'editable' +p22301 +I01 +sS'value' +p22302 +g47 +sssS'smart_cut_duration' +p22303 +(dp22304 +S'mandatory' +p22305 +(dp22306 +S'editable' +p22307 +I00 +sS'value' +p22308 +I00 +ssS'name' +p22309 +(dp22310 +S'editable' +p22311 +I01 +sS'value' +p22312 +S'Cut Duration' +p22313 +ssS'data_type' +p22314 +(dp22315 +S'editable' +p22316 +I00 +sS'value' +p22317 +S'number' +p22318 +ssS'entity_type' +p22319 +(dp22320 +S'editable' +p22321 +I00 +sS'value' +p22322 +S'Element' +p22323 +ssS'editable' +p22324 +(dp22325 +S'editable' +p22326 +I00 +sS'value' +p22327 +I01 +ssS'unique' +p22328 +(dp22329 +S'editable' +p22330 +I00 +sS'value' +p22331 +I00 +ssS'properties' +p22332 +(dp22333 +S'default_value' +p22334 +(dp22335 +S'editable' +p22336 +I00 +sS'value' +p22337 +NssS'summary_default' +p22338 +(dp22339 +S'editable' +p22340 +I01 +sS'value' +p22341 +S'none' +p22342 +sssS'description' +p22343 +(dp22344 +S'editable' +p22345 +I01 +sS'value' +p22346 +g47 +sssS'id' +p22347 +(dp22348 +S'mandatory' +p22349 +(dp22350 +S'editable' +p22351 +I00 +sS'value' +p22352 +I00 +ssS'name' +p22353 +(dp22354 +S'editable' +p22355 +I01 +sS'value' +p22356 +S'Id' +p22357 +ssS'data_type' +p22358 +(dp22359 +S'editable' +p22360 +I00 +sS'value' +p22361 +S'number' +p22362 +ssS'entity_type' +p22363 +(dp22364 +S'editable' +p22365 +I00 +sS'value' +p22366 +S'Element' +p22367 +ssS'editable' +p22368 +(dp22369 +S'editable' +p22370 +I00 +sS'value' +p22371 +I00 +ssS'unique' +p22372 +(dp22373 +S'editable' +p22374 +I00 +sS'value' +p22375 +I00 +ssS'properties' +p22376 +(dp22377 +S'default_value' +p22378 +(dp22379 +S'editable' +p22380 +I00 +sS'value' +p22381 +NssS'summary_default' +p22382 +(dp22383 +S'editable' +p22384 +I01 +sS'value' +p22385 +S'none' +p22386 +sssS'description' +p22387 +(dp22388 +S'editable' +p22389 +I01 +sS'value' +p22390 +g47 +sssS'updated_by' +p22391 +(dp22392 +S'mandatory' +p22393 +(dp22394 +S'editable' +p22395 +I00 +sS'value' +p22396 +I00 +ssS'name' +p22397 +(dp22398 +S'editable' +p22399 +I01 +sS'value' +p22400 +S'Updated by' +p22401 +ssS'data_type' +p22402 +(dp22403 +S'editable' +p22404 +I00 +sS'value' +p22405 +S'entity' +p22406 +ssS'entity_type' +p22407 +(dp22408 +S'editable' +p22409 +I00 +sS'value' +p22410 +S'Element' +p22411 +ssS'editable' +p22412 +(dp22413 +S'editable' +p22414 +I00 +sS'value' +p22415 +I00 +ssS'unique' +p22416 +(dp22417 +S'editable' +p22418 +I00 +sS'value' +p22419 +I00 +ssS'properties' +p22420 +(dp22421 +S'default_value' +p22422 +(dp22423 +S'editable' +p22424 +I00 +sS'value' +p22425 +NssS'summary_default' +p22426 +(dp22427 +S'editable' +p22428 +I01 +sS'value' +p22429 +S'none' +p22430 +ssS'valid_types' +p22431 +(dp22432 +S'editable' +p22433 +I01 +sS'value' +p22434 +(lp22435 +S'HumanUser' +p22436 +aS'ApiUser' +p22437 +asssS'description' +p22438 +(dp22439 +S'editable' +p22440 +I01 +sS'value' +p22441 +g47 +sssS'open_notes' +p22442 +(dp22443 +S'mandatory' +p22444 +(dp22445 +S'editable' +p22446 +I00 +sS'value' +p22447 +I00 +ssS'name' +p22448 +(dp22449 +S'editable' +p22450 +I01 +sS'value' +p22451 +S'Open Notes' +p22452 +ssS'data_type' +p22453 +(dp22454 +S'editable' +p22455 +I00 +sS'value' +p22456 +S'multi_entity' +p22457 +ssS'entity_type' +p22458 +(dp22459 +S'editable' +p22460 +I00 +sS'value' +p22461 +S'Element' +p22462 +ssS'editable' +p22463 +(dp22464 +S'editable' +p22465 +I00 +sS'value' +p22466 +I00 +ssS'unique' +p22467 +(dp22468 +S'editable' +p22469 +I00 +sS'value' +p22470 +I00 +ssS'properties' +p22471 +(dp22472 +S'default_value' +p22473 +(dp22474 +S'editable' +p22475 +I00 +sS'value' +p22476 +NssS'summary_default' +p22477 +(dp22478 +S'editable' +p22479 +I01 +sS'value' +p22480 +S'none' +p22481 +ssS'valid_types' +p22482 +(dp22483 +S'editable' +p22484 +I01 +sS'value' +p22485 +(lp22486 +S'Note' +p22487 +asssS'description' +p22488 +(dp22489 +S'editable' +p22490 +I01 +sS'value' +p22491 +g47 +sssS'task_template' +p22492 +(dp22493 +S'mandatory' +p22494 +(dp22495 +S'editable' +p22496 +I00 +sS'value' +p22497 +I00 +ssS'name' +p22498 +(dp22499 +S'editable' +p22500 +I01 +sS'value' +p22501 +S'Task Template' +p22502 +ssS'data_type' +p22503 +(dp22504 +S'editable' +p22505 +I00 +sS'value' +p22506 +S'entity' +p22507 +ssS'entity_type' +p22508 +(dp22509 +S'editable' +p22510 +I00 +sS'value' +p22511 +S'Element' +p22512 +ssS'editable' +p22513 +(dp22514 +S'editable' +p22515 +I00 +sS'value' +p22516 +I01 +ssS'unique' +p22517 +(dp22518 +S'editable' +p22519 +I00 +sS'value' +p22520 +I00 +ssS'properties' +p22521 +(dp22522 +S'default_value' +p22523 +(dp22524 +S'editable' +p22525 +I00 +sS'value' +p22526 +NssS'summary_default' +p22527 +(dp22528 +S'editable' +p22529 +I01 +sS'value' +p22530 +S'none' +p22531 +ssS'valid_types' +p22532 +(dp22533 +S'editable' +p22534 +I01 +sS'value' +p22535 +(lp22536 +S'TaskTemplate' +p22537 +asssS'description' +p22538 +(dp22539 +S'editable' +p22540 +I01 +sS'value' +p22541 +g47 +sssS'created_by' +p22542 +(dp22543 +S'mandatory' +p22544 +(dp22545 +S'editable' +p22546 +I00 +sS'value' +p22547 +I00 +ssS'name' +p22548 +(dp22549 +S'editable' +p22550 +I01 +sS'value' +p22551 +S'Created by' +p22552 +ssS'data_type' +p22553 +(dp22554 +S'editable' +p22555 +I00 +sS'value' +p22556 +S'entity' +p22557 +ssS'entity_type' +p22558 +(dp22559 +S'editable' +p22560 +I00 +sS'value' +p22561 +S'Element' +p22562 +ssS'editable' +p22563 +(dp22564 +S'editable' +p22565 +I00 +sS'value' +p22566 +I00 +ssS'unique' +p22567 +(dp22568 +S'editable' +p22569 +I00 +sS'value' +p22570 +I00 +ssS'properties' +p22571 +(dp22572 +S'default_value' +p22573 +(dp22574 +S'editable' +p22575 +I00 +sS'value' +p22576 +NssS'summary_default' +p22577 +(dp22578 +S'editable' +p22579 +I01 +sS'value' +p22580 +S'none' +p22581 +ssS'valid_types' +p22582 +(dp22583 +S'editable' +p22584 +I01 +sS'value' +p22585 +(lp22586 +S'HumanUser' +p22587 +aS'ApiUser' +p22588 +asssS'description' +p22589 +(dp22590 +S'editable' +p22591 +I01 +sS'value' +p22592 +g47 +sssS'smart_tail_duration' +p22593 +(dp22594 +S'mandatory' +p22595 +(dp22596 +S'editable' +p22597 +I00 +sS'value' +p22598 +I00 +ssS'name' +p22599 +(dp22600 +S'editable' +p22601 +I01 +sS'value' +p22602 +S'Tail Duration' +p22603 +ssS'data_type' +p22604 +(dp22605 +S'editable' +p22606 +I00 +sS'value' +p22607 +S'number' +p22608 +ssS'entity_type' +p22609 +(dp22610 +S'editable' +p22611 +I00 +sS'value' +p22612 +S'Element' +p22613 +ssS'editable' +p22614 +(dp22615 +S'editable' +p22616 +I00 +sS'value' +p22617 +I01 +ssS'unique' +p22618 +(dp22619 +S'editable' +p22620 +I00 +sS'value' +p22621 +I00 +ssS'properties' +p22622 +(dp22623 +S'default_value' +p22624 +(dp22625 +S'editable' +p22626 +I00 +sS'value' +p22627 +NssS'summary_default' +p22628 +(dp22629 +S'editable' +p22630 +I01 +sS'value' +p22631 +S'none' +p22632 +sssS'description' +p22633 +(dp22634 +S'editable' +p22635 +I01 +sS'value' +p22636 +g47 +sssS'sg_status_list' +p22637 +(dp22638 +S'mandatory' +p22639 +(dp22640 +S'editable' +p22641 +I00 +sS'value' +p22642 +I00 +ssS'name' +p22643 +(dp22644 +S'editable' +p22645 +I01 +sS'value' +p22646 +S'Status' +p22647 +ssS'data_type' +p22648 +(dp22649 +S'editable' +p22650 +I00 +sS'value' +p22651 +S'status_list' +p22652 +ssS'entity_type' +p22653 +(dp22654 +S'editable' +p22655 +I00 +sS'value' +p22656 +S'Element' +p22657 +ssS'editable' +p22658 +(dp22659 +S'editable' +p22660 +I00 +sS'value' +p22661 +I01 +ssS'unique' +p22662 +(dp22663 +S'editable' +p22664 +I00 +sS'value' +p22665 +I00 +ssS'properties' +p22666 +(dp22667 +S'default_value' +p22668 +(dp22669 +S'editable' +p22670 +I01 +sS'value' +p22671 +S'na' +p22672 +ssS'valid_values' +p22673 +(dp22674 +S'editable' +p22675 +I01 +sS'value' +p22676 +(lp22677 +S'na' +p22678 +assS'summary_default' +p22679 +(dp22680 +S'editable' +p22681 +I01 +sS'value' +p22682 +S'status_list' +p22683 +sssS'description' +p22684 +(dp22685 +S'editable' +p22686 +I01 +sS'value' +p22687 +g47 +sssS'smart_head_in' +p22688 +(dp22689 +S'mandatory' +p22690 +(dp22691 +S'editable' +p22692 +I00 +sS'value' +p22693 +I00 +ssS'name' +p22694 +(dp22695 +S'editable' +p22696 +I01 +sS'value' +p22697 +S'Head In' +p22698 +ssS'data_type' +p22699 +(dp22700 +S'editable' +p22701 +I00 +sS'value' +p22702 +S'number' +p22703 +ssS'entity_type' +p22704 +(dp22705 +S'editable' +p22706 +I00 +sS'value' +p22707 +S'Element' +p22708 +ssS'editable' +p22709 +(dp22710 +S'editable' +p22711 +I00 +sS'value' +p22712 +I01 +ssS'unique' +p22713 +(dp22714 +S'editable' +p22715 +I00 +sS'value' +p22716 +I00 +ssS'properties' +p22717 +(dp22718 +S'default_value' +p22719 +(dp22720 +S'editable' +p22721 +I00 +sS'value' +p22722 +NssS'summary_default' +p22723 +(dp22724 +S'editable' +p22725 +I01 +sS'value' +p22726 +S'none' +p22727 +sssS'description' +p22728 +(dp22729 +S'editable' +p22730 +I01 +sS'value' +p22731 +g47 +sssS'smart_working_duration' +p22732 +(dp22733 +S'mandatory' +p22734 +(dp22735 +S'editable' +p22736 +I00 +sS'value' +p22737 +I00 +ssS'name' +p22738 +(dp22739 +S'editable' +p22740 +I01 +sS'value' +p22741 +S'Working Duration' +p22742 +ssS'data_type' +p22743 +(dp22744 +S'editable' +p22745 +I00 +sS'value' +p22746 +S'number' +p22747 +ssS'entity_type' +p22748 +(dp22749 +S'editable' +p22750 +I00 +sS'value' +p22751 +S'Element' +p22752 +ssS'editable' +p22753 +(dp22754 +S'editable' +p22755 +I00 +sS'value' +p22756 +I00 +ssS'unique' +p22757 +(dp22758 +S'editable' +p22759 +I00 +sS'value' +p22760 +I00 +ssS'properties' +p22761 +(dp22762 +S'default_value' +p22763 +(dp22764 +S'editable' +p22765 +I00 +sS'value' +p22766 +NssS'summary_default' +p22767 +(dp22768 +S'editable' +p22769 +I01 +sS'value' +p22770 +S'none' +p22771 +sssS'description' +p22772 +(dp22773 +S'editable' +p22774 +I01 +sS'value' +p22775 +g47 +sssS'head_in' +p22776 +(dp22777 +S'mandatory' +p22778 +(dp22779 +S'editable' +p22780 +I00 +sS'value' +p22781 +I00 +ssS'name' +p22782 +(dp22783 +S'editable' +p22784 +I01 +sS'value' +p22785 +S'Raw Head In' +p22786 +ssS'data_type' +p22787 +(dp22788 +S'editable' +p22789 +I00 +sS'value' +p22790 +S'number' +p22791 +ssS'entity_type' +p22792 +(dp22793 +S'editable' +p22794 +I00 +sS'value' +p22795 +S'Element' +p22796 +ssS'editable' +p22797 +(dp22798 +S'editable' +p22799 +I00 +sS'value' +p22800 +I01 +ssS'unique' +p22801 +(dp22802 +S'editable' +p22803 +I00 +sS'value' +p22804 +I00 +ssS'properties' +p22805 +(dp22806 +S'default_value' +p22807 +(dp22808 +S'editable' +p22809 +I00 +sS'value' +p22810 +NssS'summary_default' +p22811 +(dp22812 +S'editable' +p22813 +I01 +sS'value' +p22814 +S'none' +p22815 +sssS'description' +p22816 +(dp22817 +S'editable' +p22818 +I01 +sS'value' +p22819 +g47 +sssS'description' +p22820 +(dp22821 +S'mandatory' +p22822 +(dp22823 +S'editable' +p22824 +I00 +sS'value' +p22825 +I00 +ssS'name' +p22826 +(dp22827 +S'editable' +p22828 +I01 +sS'value' +p22829 +S'Description' +p22830 +ssS'data_type' +p22831 +(dp22832 +S'editable' +p22833 +I00 +sS'value' +p22834 +S'text' +p22835 +ssS'entity_type' +p22836 +(dp22837 +S'editable' +p22838 +I00 +sS'value' +p22839 +S'Element' +p22840 +ssS'editable' +p22841 +(dp22842 +S'editable' +p22843 +I00 +sS'value' +p22844 +I01 +ssS'unique' +p22845 +(dp22846 +S'editable' +p22847 +I00 +sS'value' +p22848 +I00 +ssS'properties' +p22849 +(dp22850 +S'default_value' +p22851 +(dp22852 +S'editable' +p22853 +I00 +sS'value' +p22854 +NssS'summary_default' +p22855 +(dp22856 +S'editable' +p22857 +I01 +sS'value' +p22858 +S'none' +p22859 +sssS'description' +p22860 +(dp22861 +S'editable' +p22862 +I01 +sS'value' +p22863 +g47 +sssS'smart_cut_out' +p22864 +(dp22865 +S'mandatory' +p22866 +(dp22867 +S'editable' +p22868 +I00 +sS'value' +p22869 +I00 +ssS'name' +p22870 +(dp22871 +S'editable' +p22872 +I01 +sS'value' +p22873 +S'Cut Out' +p22874 +ssS'data_type' +p22875 +(dp22876 +S'editable' +p22877 +I00 +sS'value' +p22878 +S'number' +p22879 +ssS'entity_type' +p22880 +(dp22881 +S'editable' +p22882 +I00 +sS'value' +p22883 +S'Element' +p22884 +ssS'editable' +p22885 +(dp22886 +S'editable' +p22887 +I00 +sS'value' +p22888 +I01 +ssS'unique' +p22889 +(dp22890 +S'editable' +p22891 +I00 +sS'value' +p22892 +I00 +ssS'properties' +p22893 +(dp22894 +S'default_value' +p22895 +(dp22896 +S'editable' +p22897 +I00 +sS'value' +p22898 +NssS'summary_default' +p22899 +(dp22900 +S'editable' +p22901 +I01 +sS'value' +p22902 +S'none' +p22903 +sssS'description' +p22904 +(dp22905 +S'editable' +p22906 +I01 +sS'value' +p22907 +g47 +sssS'tail_out' +p22908 +(dp22909 +S'mandatory' +p22910 +(dp22911 +S'editable' +p22912 +I00 +sS'value' +p22913 +I00 +ssS'name' +p22914 +(dp22915 +S'editable' +p22916 +I01 +sS'value' +p22917 +S'Raw Tail Out' +p22918 +ssS'data_type' +p22919 +(dp22920 +S'editable' +p22921 +I00 +sS'value' +p22922 +S'number' +p22923 +ssS'entity_type' +p22924 +(dp22925 +S'editable' +p22926 +I00 +sS'value' +p22927 +S'Element' +p22928 +ssS'editable' +p22929 +(dp22930 +S'editable' +p22931 +I00 +sS'value' +p22932 +I01 +ssS'unique' +p22933 +(dp22934 +S'editable' +p22935 +I00 +sS'value' +p22936 +I00 +ssS'properties' +p22937 +(dp22938 +S'default_value' +p22939 +(dp22940 +S'editable' +p22941 +I00 +sS'value' +p22942 +NssS'summary_default' +p22943 +(dp22944 +S'editable' +p22945 +I01 +sS'value' +p22946 +S'none' +p22947 +sssS'description' +p22948 +(dp22949 +S'editable' +p22950 +I01 +sS'value' +p22951 +g47 +sssS'smart_cut_in' +p22952 +(dp22953 +S'mandatory' +p22954 +(dp22955 +S'editable' +p22956 +I00 +sS'value' +p22957 +I00 +ssS'name' +p22958 +(dp22959 +S'editable' +p22960 +I01 +sS'value' +p22961 +S'Cut In' +p22962 +ssS'data_type' +p22963 +(dp22964 +S'editable' +p22965 +I00 +sS'value' +p22966 +S'number' +p22967 +ssS'entity_type' +p22968 +(dp22969 +S'editable' +p22970 +I00 +sS'value' +p22971 +S'Element' +p22972 +ssS'editable' +p22973 +(dp22974 +S'editable' +p22975 +I00 +sS'value' +p22976 +I01 +ssS'unique' +p22977 +(dp22978 +S'editable' +p22979 +I00 +sS'value' +p22980 +I00 +ssS'properties' +p22981 +(dp22982 +S'default_value' +p22983 +(dp22984 +S'editable' +p22985 +I00 +sS'value' +p22986 +NssS'summary_default' +p22987 +(dp22988 +S'editable' +p22989 +I01 +sS'value' +p22990 +S'none' +p22991 +sssS'description' +p22992 +(dp22993 +S'editable' +p22994 +I01 +sS'value' +p22995 +g47 +sssS'smart_cut_summary_display' +p22996 +(dp22997 +S'mandatory' +p22998 +(dp22999 +S'editable' +p23000 +I00 +sS'value' +p23001 +I00 +ssS'name' +p23002 +(dp23003 +S'editable' +p23004 +I01 +sS'value' +p23005 +S'Cut Summary' +p23006 +ssS'data_type' +p23007 +(dp23008 +S'editable' +p23009 +I00 +sS'value' +p23010 +S'text' +p23011 +ssS'entity_type' +p23012 +(dp23013 +S'editable' +p23014 +I00 +sS'value' +p23015 +S'Element' +p23016 +ssS'editable' +p23017 +(dp23018 +S'editable' +p23019 +I00 +sS'value' +p23020 +I00 +ssS'unique' +p23021 +(dp23022 +S'editable' +p23023 +I00 +sS'value' +p23024 +I00 +ssS'properties' +p23025 +(dp23026 +S'default_value' +p23027 +(dp23028 +S'editable' +p23029 +I00 +sS'value' +p23030 +NssS'summary_default' +p23031 +(dp23032 +S'editable' +p23033 +I01 +sS'value' +p23034 +S'none' +p23035 +sssS'description' +p23036 +(dp23037 +S'editable' +p23038 +I01 +sS'value' +p23039 +g47 +sssS'cut_in' +p23040 +(dp23041 +S'mandatory' +p23042 +(dp23043 +S'editable' +p23044 +I00 +sS'value' +p23045 +I00 +ssS'name' +p23046 +(dp23047 +S'editable' +p23048 +I01 +sS'value' +p23049 +S'Raw Cut In' +p23050 +ssS'data_type' +p23051 +(dp23052 +S'editable' +p23053 +I00 +sS'value' +p23054 +S'number' +p23055 +ssS'entity_type' +p23056 +(dp23057 +S'editable' +p23058 +I00 +sS'value' +p23059 +S'Element' +p23060 +ssS'editable' +p23061 +(dp23062 +S'editable' +p23063 +I00 +sS'value' +p23064 +I01 +ssS'unique' +p23065 +(dp23066 +S'editable' +p23067 +I00 +sS'value' +p23068 +I00 +ssS'properties' +p23069 +(dp23070 +S'default_value' +p23071 +(dp23072 +S'editable' +p23073 +I00 +sS'value' +p23074 +NssS'summary_default' +p23075 +(dp23076 +S'editable' +p23077 +I01 +sS'value' +p23078 +S'none' +p23079 +sssS'description' +p23080 +(dp23081 +S'editable' +p23082 +I01 +sS'value' +p23083 +g47 +sssS'smart_duration_summary_display' +p23084 +(dp23085 +S'mandatory' +p23086 +(dp23087 +S'editable' +p23088 +I00 +sS'value' +p23089 +I00 +ssS'name' +p23090 +(dp23091 +S'editable' +p23092 +I01 +sS'value' +p23093 +S'Duration Summary' +p23094 +ssS'data_type' +p23095 +(dp23096 +S'editable' +p23097 +I00 +sS'value' +p23098 +S'text' +p23099 +ssS'entity_type' +p23100 +(dp23101 +S'editable' +p23102 +I00 +sS'value' +p23103 +S'Element' +p23104 +ssS'editable' +p23105 +(dp23106 +S'editable' +p23107 +I00 +sS'value' +p23108 +I00 +ssS'unique' +p23109 +(dp23110 +S'editable' +p23111 +I00 +sS'value' +p23112 +I00 +ssS'properties' +p23113 +(dp23114 +S'default_value' +p23115 +(dp23116 +S'editable' +p23117 +I00 +sS'value' +p23118 +NssS'summary_default' +p23119 +(dp23120 +S'editable' +p23121 +I01 +sS'value' +p23122 +S'none' +p23123 +sssS'description' +p23124 +(dp23125 +S'editable' +p23126 +I01 +sS'value' +p23127 +g47 +sssS'tail_duration' +p23128 +(dp23129 +S'mandatory' +p23130 +(dp23131 +S'editable' +p23132 +I00 +sS'value' +p23133 +I00 +ssS'name' +p23134 +(dp23135 +S'editable' +p23136 +I01 +sS'value' +p23137 +S'Raw Tail Duration' +p23138 +ssS'data_type' +p23139 +(dp23140 +S'editable' +p23141 +I00 +sS'value' +p23142 +S'number' +p23143 +ssS'entity_type' +p23144 +(dp23145 +S'editable' +p23146 +I00 +sS'value' +p23147 +S'Element' +p23148 +ssS'editable' +p23149 +(dp23150 +S'editable' +p23151 +I00 +sS'value' +p23152 +I01 +ssS'unique' +p23153 +(dp23154 +S'editable' +p23155 +I00 +sS'value' +p23156 +I00 +ssS'properties' +p23157 +(dp23158 +S'default_value' +p23159 +(dp23160 +S'editable' +p23161 +I00 +sS'value' +p23162 +NssS'summary_default' +p23163 +(dp23164 +S'editable' +p23165 +I01 +sS'value' +p23166 +S'none' +p23167 +sssS'description' +p23168 +(dp23169 +S'editable' +p23170 +I01 +sS'value' +p23171 +g47 +sssS'smart_tail_out' +p23172 +(dp23173 +S'mandatory' +p23174 +(dp23175 +S'editable' +p23176 +I00 +sS'value' +p23177 +I00 +ssS'name' +p23178 +(dp23179 +S'editable' +p23180 +I01 +sS'value' +p23181 +S'Tail Out' +p23182 +ssS'data_type' +p23183 +(dp23184 +S'editable' +p23185 +I00 +sS'value' +p23186 +S'number' +p23187 +ssS'entity_type' +p23188 +(dp23189 +S'editable' +p23190 +I00 +sS'value' +p23191 +S'Element' +p23192 +ssS'editable' +p23193 +(dp23194 +S'editable' +p23195 +I00 +sS'value' +p23196 +I01 +ssS'unique' +p23197 +(dp23198 +S'editable' +p23199 +I00 +sS'value' +p23200 +I00 +ssS'properties' +p23201 +(dp23202 +S'default_value' +p23203 +(dp23204 +S'editable' +p23205 +I00 +sS'value' +p23206 +NssS'summary_default' +p23207 +(dp23208 +S'editable' +p23209 +I01 +sS'value' +p23210 +S'none' +p23211 +sssS'description' +p23212 +(dp23213 +S'editable' +p23214 +I01 +sS'value' +p23215 +g47 +sssS'step_0' +p23216 +(dp23217 +S'mandatory' +p23218 +(dp23219 +S'editable' +p23220 +I00 +sS'value' +p23221 +I00 +ssS'name' +p23222 +(dp23223 +S'editable' +p23224 +I01 +sS'value' +p23225 +S'ALL TASKS' +p23226 +ssS'data_type' +p23227 +(dp23228 +S'editable' +p23229 +I00 +sS'value' +p23230 +S'pivot_column' +p23231 +ssS'entity_type' +p23232 +(dp23233 +S'editable' +p23234 +I00 +sS'value' +p23235 +S'Element' +p23236 +ssS'editable' +p23237 +(dp23238 +S'editable' +p23239 +I00 +sS'value' +p23240 +I00 +ssS'unique' +p23241 +(dp23242 +S'editable' +p23243 +I00 +sS'value' +p23244 +I00 +ssS'properties' +p23245 +(dp23246 +S'default_value' +p23247 +(dp23248 +S'editable' +p23249 +I00 +sS'value' +p23250 +NssS'summary_default' +p23251 +(dp23252 +S'editable' +p23253 +I00 +sS'value' +p23254 +S'none' +p23255 +sssS'description' +p23256 +(dp23257 +S'editable' +p23258 +I01 +sS'value' +p23259 +g47 +sssS'cut_duration' +p23260 +(dp23261 +S'mandatory' +p23262 +(dp23263 +S'editable' +p23264 +I00 +sS'value' +p23265 +I00 +ssS'name' +p23266 +(dp23267 +S'editable' +p23268 +I01 +sS'value' +p23269 +S'Raw Cut Duration' +p23270 +ssS'data_type' +p23271 +(dp23272 +S'editable' +p23273 +I00 +sS'value' +p23274 +S'number' +p23275 +ssS'entity_type' +p23276 +(dp23277 +S'editable' +p23278 +I00 +sS'value' +p23279 +S'Element' +p23280 +ssS'editable' +p23281 +(dp23282 +S'editable' +p23283 +I00 +sS'value' +p23284 +I01 +ssS'unique' +p23285 +(dp23286 +S'editable' +p23287 +I00 +sS'value' +p23288 +I00 +ssS'properties' +p23289 +(dp23290 +S'default_value' +p23291 +(dp23292 +S'editable' +p23293 +I00 +sS'value' +p23294 +NssS'summary_default' +p23295 +(dp23296 +S'editable' +p23297 +I01 +sS'value' +p23298 +S'none' +p23299 +sssS'description' +p23300 +(dp23301 +S'editable' +p23302 +I01 +sS'value' +p23303 +g47 +sssS'smart_tail_in' +p23304 +(dp23305 +S'mandatory' +p23306 +(dp23307 +S'editable' +p23308 +I00 +sS'value' +p23309 +I00 +ssS'name' +p23310 +(dp23311 +S'editable' +p23312 +I01 +sS'value' +p23313 +S'Tail In' +p23314 +ssS'data_type' +p23315 +(dp23316 +S'editable' +p23317 +I00 +sS'value' +p23318 +S'number' +p23319 +ssS'entity_type' +p23320 +(dp23321 +S'editable' +p23322 +I00 +sS'value' +p23323 +S'Element' +p23324 +ssS'editable' +p23325 +(dp23326 +S'editable' +p23327 +I00 +sS'value' +p23328 +I01 +ssS'unique' +p23329 +(dp23330 +S'editable' +p23331 +I00 +sS'value' +p23332 +I00 +ssS'properties' +p23333 +(dp23334 +S'default_value' +p23335 +(dp23336 +S'editable' +p23337 +I00 +sS'value' +p23338 +NssS'summary_default' +p23339 +(dp23340 +S'editable' +p23341 +I01 +sS'value' +p23342 +S'none' +p23343 +sssS'description' +p23344 +(dp23345 +S'editable' +p23346 +I01 +sS'value' +p23347 +g47 +sssS'assets' +p23348 +(dp23349 +S'mandatory' +p23350 +(dp23351 +S'editable' +p23352 +I00 +sS'value' +p23353 +I00 +ssS'name' +p23354 +(dp23355 +S'editable' +p23356 +I01 +sS'value' +p23357 +S'Assets' +p23358 +ssS'data_type' +p23359 +(dp23360 +S'editable' +p23361 +I00 +sS'value' +p23362 +S'multi_entity' +p23363 +ssS'entity_type' +p23364 +(dp23365 +S'editable' +p23366 +I00 +sS'value' +p23367 +S'Element' +p23368 +ssS'editable' +p23369 +(dp23370 +S'editable' +p23371 +I00 +sS'value' +p23372 +I01 +ssS'unique' +p23373 +(dp23374 +S'editable' +p23375 +I00 +sS'value' +p23376 +I00 +ssS'properties' +p23377 +(dp23378 +S'default_value' +p23379 +(dp23380 +S'editable' +p23381 +I00 +sS'value' +p23382 +NssS'summary_default' +p23383 +(dp23384 +S'editable' +p23385 +I01 +sS'value' +p23386 +S'none' +p23387 +ssS'valid_types' +p23388 +(dp23389 +S'editable' +p23390 +I01 +sS'value' +p23391 +(lp23392 +S'Asset' +p23393 +asssS'description' +p23394 +(dp23395 +S'editable' +p23396 +I01 +sS'value' +p23397 +g47 +sssS'smart_head_out' +p23398 +(dp23399 +S'mandatory' +p23400 +(dp23401 +S'editable' +p23402 +I00 +sS'value' +p23403 +I00 +ssS'name' +p23404 +(dp23405 +S'editable' +p23406 +I01 +sS'value' +p23407 +S'Head Out' +p23408 +ssS'data_type' +p23409 +(dp23410 +S'editable' +p23411 +I00 +sS'value' +p23412 +S'number' +p23413 +ssS'entity_type' +p23414 +(dp23415 +S'editable' +p23416 +I00 +sS'value' +p23417 +S'Element' +p23418 +ssS'editable' +p23419 +(dp23420 +S'editable' +p23421 +I00 +sS'value' +p23422 +I01 +ssS'unique' +p23423 +(dp23424 +S'editable' +p23425 +I00 +sS'value' +p23426 +I00 +ssS'properties' +p23427 +(dp23428 +S'default_value' +p23429 +(dp23430 +S'editable' +p23431 +I00 +sS'value' +p23432 +NssS'summary_default' +p23433 +(dp23434 +S'editable' +p23435 +I01 +sS'value' +p23436 +S'none' +p23437 +sssS'description' +p23438 +(dp23439 +S'editable' +p23440 +I01 +sS'value' +p23441 +g47 +sssS'created_at' +p23442 +(dp23443 +S'mandatory' +p23444 +(dp23445 +S'editable' +p23446 +I00 +sS'value' +p23447 +I00 +ssS'name' +p23448 +(dp23449 +S'editable' +p23450 +I01 +sS'value' +p23451 +S'Date Created' +p23452 +ssS'data_type' +p23453 +(dp23454 +S'editable' +p23455 +I00 +sS'value' +p23456 +S'date_time' +p23457 +ssS'entity_type' +p23458 +(dp23459 +S'editable' +p23460 +I00 +sS'value' +p23461 +S'Element' +p23462 +ssS'editable' +p23463 +(dp23464 +S'editable' +p23465 +I00 +sS'value' +p23466 +I00 +ssS'unique' +p23467 +(dp23468 +S'editable' +p23469 +I00 +sS'value' +p23470 +I00 +ssS'properties' +p23471 +(dp23472 +S'default_value' +p23473 +(dp23474 +S'editable' +p23475 +I00 +sS'value' +p23476 +NssS'summary_default' +p23477 +(dp23478 +S'editable' +p23479 +I01 +sS'value' +p23480 +S'none' +p23481 +sssS'description' +p23482 +(dp23483 +S'editable' +p23484 +I01 +sS'value' +p23485 +g47 +sssS'project' +p23486 +(dp23487 +S'mandatory' +p23488 +(dp23489 +S'editable' +p23490 +I00 +sS'value' +p23491 +I00 +ssS'name' +p23492 +(dp23493 +S'editable' +p23494 +I01 +sS'value' +p23495 +S'Project' +p23496 +ssS'data_type' +p23497 +(dp23498 +S'editable' +p23499 +I00 +sS'value' +p23500 +S'entity' +p23501 +ssS'entity_type' +p23502 +(dp23503 +S'editable' +p23504 +I00 +sS'value' +p23505 +S'Element' +p23506 +ssS'editable' +p23507 +(dp23508 +S'editable' +p23509 +I00 +sS'value' +p23510 +I01 +ssS'unique' +p23511 +(dp23512 +S'editable' +p23513 +I00 +sS'value' +p23514 +I00 +ssS'properties' +p23515 +(dp23516 +S'default_value' +p23517 +(dp23518 +S'editable' +p23519 +I00 +sS'value' +p23520 +NssS'summary_default' +p23521 +(dp23522 +S'editable' +p23523 +I01 +sS'value' +p23524 +S'none' +p23525 +ssS'valid_types' +p23526 +(dp23527 +S'editable' +p23528 +I01 +sS'value' +p23529 +(lp23530 +S'Project' +p23531 +asssS'description' +p23532 +(dp23533 +S'editable' +p23534 +I01 +sS'value' +p23535 +g47 +sssS'filmstrip_image' +p23536 +(dp23537 +S'mandatory' +p23538 +(dp23539 +S'editable' +p23540 +I00 +sS'value' +p23541 +I00 +ssS'name' +p23542 +(dp23543 +S'editable' +p23544 +I01 +sS'value' +p23545 +S'Filmstrip Thumbnail' +p23546 +ssS'data_type' +p23547 +(dp23548 +S'editable' +p23549 +I00 +sS'value' +p23550 +S'image' +p23551 +ssS'entity_type' +p23552 +(dp23553 +S'editable' +p23554 +I00 +sS'value' +p23555 +S'Element' +p23556 +ssS'editable' +p23557 +(dp23558 +S'editable' +p23559 +I00 +sS'value' +p23560 +I01 +ssS'unique' +p23561 +(dp23562 +S'editable' +p23563 +I00 +sS'value' +p23564 +I00 +ssS'properties' +p23565 +(dp23566 +S'default_value' +p23567 +(dp23568 +S'editable' +p23569 +I00 +sS'value' +p23570 +NssS'summary_default' +p23571 +(dp23572 +S'editable' +p23573 +I01 +sS'value' +p23574 +S'none' +p23575 +sssS'description' +p23576 +(dp23577 +S'editable' +p23578 +I01 +sS'value' +p23579 +g47 +sssS'tail_in' +p23580 +(dp23581 +S'mandatory' +p23582 +(dp23583 +S'editable' +p23584 +I00 +sS'value' +p23585 +I00 +ssS'name' +p23586 +(dp23587 +S'editable' +p23588 +I01 +sS'value' +p23589 +S'Raw Tail In' +p23590 +ssS'data_type' +p23591 +(dp23592 +S'editable' +p23593 +I00 +sS'value' +p23594 +S'number' +p23595 +ssS'entity_type' +p23596 +(dp23597 +S'editable' +p23598 +I00 +sS'value' +p23599 +S'Element' +p23600 +ssS'editable' +p23601 +(dp23602 +S'editable' +p23603 +I00 +sS'value' +p23604 +I01 +ssS'unique' +p23605 +(dp23606 +S'editable' +p23607 +I00 +sS'value' +p23608 +I00 +ssS'properties' +p23609 +(dp23610 +S'default_value' +p23611 +(dp23612 +S'editable' +p23613 +I00 +sS'value' +p23614 +NssS'summary_default' +p23615 +(dp23616 +S'editable' +p23617 +I01 +sS'value' +p23618 +S'none' +p23619 +sssS'description' +p23620 +(dp23621 +S'editable' +p23622 +I01 +sS'value' +p23623 +g47 +sssS'shots' +p23624 +(dp23625 +S'mandatory' +p23626 +(dp23627 +S'editable' +p23628 +I00 +sS'value' +p23629 +I00 +ssS'name' +p23630 +(dp23631 +S'editable' +p23632 +I01 +sS'value' +p23633 +S'Shots' +p23634 +ssS'data_type' +p23635 +(dp23636 +S'editable' +p23637 +I00 +sS'value' +p23638 +S'multi_entity' +p23639 +ssS'entity_type' +p23640 +(dp23641 +S'editable' +p23642 +I00 +sS'value' +p23643 +S'Element' +p23644 +ssS'editable' +p23645 +(dp23646 +S'editable' +p23647 +I00 +sS'value' +p23648 +I01 +ssS'unique' +p23649 +(dp23650 +S'editable' +p23651 +I00 +sS'value' +p23652 +I00 +ssS'properties' +p23653 +(dp23654 +S'default_value' +p23655 +(dp23656 +S'editable' +p23657 +I00 +sS'value' +p23658 +NssS'summary_default' +p23659 +(dp23660 +S'editable' +p23661 +I01 +sS'value' +p23662 +S'none' +p23663 +ssS'valid_types' +p23664 +(dp23665 +S'editable' +p23666 +I01 +sS'value' +p23667 +(lp23668 +S'Shot' +p23669 +asssS'description' +p23670 +(dp23671 +S'editable' +p23672 +I01 +sS'value' +p23673 +g47 +sssS'smart_head_duration' +p23674 +(dp23675 +S'mandatory' +p23676 +(dp23677 +S'editable' +p23678 +I00 +sS'value' +p23679 +I00 +ssS'name' +p23680 +(dp23681 +S'editable' +p23682 +I01 +sS'value' +p23683 +S'Head Duration' +p23684 +ssS'data_type' +p23685 +(dp23686 +S'editable' +p23687 +I00 +sS'value' +p23688 +S'number' +p23689 +ssS'entity_type' +p23690 +(dp23691 +S'editable' +p23692 +I00 +sS'value' +p23693 +S'Element' +p23694 +ssS'editable' +p23695 +(dp23696 +S'editable' +p23697 +I00 +sS'value' +p23698 +I01 +ssS'unique' +p23699 +(dp23700 +S'editable' +p23701 +I00 +sS'value' +p23702 +I00 +ssS'properties' +p23703 +(dp23704 +S'default_value' +p23705 +(dp23706 +S'editable' +p23707 +I00 +sS'value' +p23708 +NssS'summary_default' +p23709 +(dp23710 +S'editable' +p23711 +I01 +sS'value' +p23712 +S'none' +p23713 +sssS'description' +p23714 +(dp23715 +S'editable' +p23716 +I01 +sS'value' +p23717 +g47 +sssS'cut_out' +p23718 +(dp23719 +S'mandatory' +p23720 +(dp23721 +S'editable' +p23722 +I00 +sS'value' +p23723 +I00 +ssS'name' +p23724 +(dp23725 +S'editable' +p23726 +I01 +sS'value' +p23727 +S'Raw Cut Out' +p23728 +ssS'data_type' +p23729 +(dp23730 +S'editable' +p23731 +I00 +sS'value' +p23732 +S'number' +p23733 +ssS'entity_type' +p23734 +(dp23735 +S'editable' +p23736 +I00 +sS'value' +p23737 +S'Element' +p23738 +ssS'editable' +p23739 +(dp23740 +S'editable' +p23741 +I00 +sS'value' +p23742 +I01 +ssS'unique' +p23743 +(dp23744 +S'editable' +p23745 +I00 +sS'value' +p23746 +I00 +ssS'properties' +p23747 +(dp23748 +S'default_value' +p23749 +(dp23750 +S'editable' +p23751 +I00 +sS'value' +p23752 +NssS'summary_default' +p23753 +(dp23754 +S'editable' +p23755 +I01 +sS'value' +p23756 +S'none' +p23757 +sssS'description' +p23758 +(dp23759 +S'editable' +p23760 +I01 +sS'value' +p23761 +g47 +sssS'head_out' +p23762 +(dp23763 +S'mandatory' +p23764 +(dp23765 +S'editable' +p23766 +I00 +sS'value' +p23767 +I00 +ssS'name' +p23768 +(dp23769 +S'editable' +p23770 +I01 +sS'value' +p23771 +S'Raw Head Out' +p23772 +ssS'data_type' +p23773 +(dp23774 +S'editable' +p23775 +I00 +sS'value' +p23776 +S'number' +p23777 +ssS'entity_type' +p23778 +(dp23779 +S'editable' +p23780 +I00 +sS'value' +p23781 +S'Element' +p23782 +ssS'editable' +p23783 +(dp23784 +S'editable' +p23785 +I00 +sS'value' +p23786 +I01 +ssS'unique' +p23787 +(dp23788 +S'editable' +p23789 +I00 +sS'value' +p23790 +I00 +ssS'properties' +p23791 +(dp23792 +S'default_value' +p23793 +(dp23794 +S'editable' +p23795 +I00 +sS'value' +p23796 +NssS'summary_default' +p23797 +(dp23798 +S'editable' +p23799 +I01 +sS'value' +p23800 +S'none' +p23801 +sssS'description' +p23802 +(dp23803 +S'editable' +p23804 +I01 +sS'value' +p23805 +g47 +sssS'notes' +p23806 +(dp23807 +S'mandatory' +p23808 +(dp23809 +S'editable' +p23810 +I00 +sS'value' +p23811 +I00 +ssS'name' +p23812 +(dp23813 +S'editable' +p23814 +I01 +sS'value' +p23815 +S'Notes' +p23816 +ssS'data_type' +p23817 +(dp23818 +S'editable' +p23819 +I00 +sS'value' +p23820 +S'multi_entity' +p23821 +ssS'entity_type' +p23822 +(dp23823 +S'editable' +p23824 +I00 +sS'value' +p23825 +S'Element' +p23826 +ssS'editable' +p23827 +(dp23828 +S'editable' +p23829 +I00 +sS'value' +p23830 +I01 +ssS'unique' +p23831 +(dp23832 +S'editable' +p23833 +I00 +sS'value' +p23834 +I00 +ssS'properties' +p23835 +(dp23836 +S'default_value' +p23837 +(dp23838 +S'editable' +p23839 +I00 +sS'value' +p23840 +NssS'summary_default' +p23841 +(dp23842 +S'editable' +p23843 +I01 +sS'value' +p23844 +S'none' +p23845 +ssS'valid_types' +p23846 +(dp23847 +S'editable' +p23848 +I01 +sS'value' +p23849 +(lp23850 +S'Note' +p23851 +asssS'description' +p23852 +(dp23853 +S'editable' +p23854 +I01 +sS'value' +p23855 +g47 +ssssS'TankType' +p23856 +(dp23857 +S'code' +p23858 +(dp23859 +S'mandatory' +p23860 +(dp23861 +S'editable' +p23862 +I00 +sS'value' +p23863 +I01 +ssS'name' +p23864 +(dp23865 +S'editable' +p23866 +I01 +sS'value' +p23867 +S'Tank Type Name' +p23868 +ssS'data_type' +p23869 +(dp23870 +S'editable' +p23871 +I00 +sS'value' +p23872 +S'text' +p23873 +ssS'entity_type' +p23874 +(dp23875 +S'editable' +p23876 +I00 +sS'value' +p23877 +S'TankType' +p23878 +ssS'editable' +p23879 +(dp23880 +S'editable' +p23881 +I00 +sS'value' +p23882 +I01 +ssS'unique' +p23883 +(dp23884 +S'editable' +p23885 +I00 +sS'value' +p23886 +I01 +ssS'properties' +p23887 +(dp23888 +S'default_value' +p23889 +(dp23890 +S'editable' +p23891 +I00 +sS'value' +p23892 +NssS'summary_default' +p23893 +(dp23894 +S'editable' +p23895 +I01 +sS'value' +p23896 +S'none' +p23897 +sssS'description' +p23898 +(dp23899 +S'editable' +p23900 +I01 +sS'value' +p23901 +g47 +sssS'description' +p23902 +(dp23903 +S'mandatory' +p23904 +(dp23905 +S'editable' +p23906 +I00 +sS'value' +p23907 +I00 +ssS'name' +p23908 +(dp23909 +S'editable' +p23910 +I01 +sS'value' +p23911 +S'Description' +p23912 +ssS'data_type' +p23913 +(dp23914 +S'editable' +p23915 +I00 +sS'value' +p23916 +S'text' +p23917 +ssS'entity_type' +p23918 +(dp23919 +S'editable' +p23920 +I00 +sS'value' +p23921 +S'TankType' +p23922 +ssS'editable' +p23923 +(dp23924 +S'editable' +p23925 +I00 +sS'value' +p23926 +I01 +ssS'unique' +p23927 +(dp23928 +S'editable' +p23929 +I00 +sS'value' +p23930 +I00 +ssS'properties' +p23931 +(dp23932 +S'default_value' +p23933 +(dp23934 +S'editable' +p23935 +I00 +sS'value' +p23936 +NssS'summary_default' +p23937 +(dp23938 +S'editable' +p23939 +I01 +sS'value' +p23940 +S'none' +p23941 +sssS'description' +p23942 +(dp23943 +S'editable' +p23944 +I01 +sS'value' +p23945 +g47 +sssS'created_at' +p23946 +(dp23947 +S'mandatory' +p23948 +(dp23949 +S'editable' +p23950 +I00 +sS'value' +p23951 +I00 +ssS'name' +p23952 +(dp23953 +S'editable' +p23954 +I01 +sS'value' +p23955 +S'Date Created' +p23956 +ssS'data_type' +p23957 +(dp23958 +S'editable' +p23959 +I00 +sS'value' +p23960 +S'date_time' +p23961 +ssS'entity_type' +p23962 +(dp23963 +S'editable' +p23964 +I00 +sS'value' +p23965 +S'TankType' +p23966 +ssS'editable' +p23967 +(dp23968 +S'editable' +p23969 +I00 +sS'value' +p23970 +I00 +ssS'unique' +p23971 +(dp23972 +S'editable' +p23973 +I00 +sS'value' +p23974 +I00 +ssS'properties' +p23975 +(dp23976 +S'default_value' +p23977 +(dp23978 +S'editable' +p23979 +I00 +sS'value' +p23980 +NssS'summary_default' +p23981 +(dp23982 +S'editable' +p23983 +I01 +sS'value' +p23984 +S'none' +p23985 +sssS'description' +p23986 +(dp23987 +S'editable' +p23988 +I01 +sS'value' +p23989 +g47 +sssS'updated_at' +p23990 +(dp23991 +S'mandatory' +p23992 +(dp23993 +S'editable' +p23994 +I00 +sS'value' +p23995 +I00 +ssS'name' +p23996 +(dp23997 +S'editable' +p23998 +I01 +sS'value' +p23999 +S'Date Updated' +p24000 +ssS'data_type' +p24001 +(dp24002 +S'editable' +p24003 +I00 +sS'value' +p24004 +S'date_time' +p24005 +ssS'entity_type' +p24006 +(dp24007 +S'editable' +p24008 +I00 +sS'value' +p24009 +S'TankType' +p24010 +ssS'editable' +p24011 +(dp24012 +S'editable' +p24013 +I00 +sS'value' +p24014 +I00 +ssS'unique' +p24015 +(dp24016 +S'editable' +p24017 +I00 +sS'value' +p24018 +I00 +ssS'properties' +p24019 +(dp24020 +S'default_value' +p24021 +(dp24022 +S'editable' +p24023 +I00 +sS'value' +p24024 +NssS'summary_default' +p24025 +(dp24026 +S'editable' +p24027 +I01 +sS'value' +p24028 +S'none' +p24029 +sssS'description' +p24030 +(dp24031 +S'editable' +p24032 +I01 +sS'value' +p24033 +g47 +sssS'created_by' +p24034 +(dp24035 +S'mandatory' +p24036 +(dp24037 +S'editable' +p24038 +I00 +sS'value' +p24039 +I00 +ssS'name' +p24040 +(dp24041 +S'editable' +p24042 +I01 +sS'value' +p24043 +S'Created by' +p24044 +ssS'data_type' +p24045 +(dp24046 +S'editable' +p24047 +I00 +sS'value' +p24048 +S'entity' +p24049 +ssS'entity_type' +p24050 +(dp24051 +S'editable' +p24052 +I00 +sS'value' +p24053 +S'TankType' +p24054 +ssS'editable' +p24055 +(dp24056 +S'editable' +p24057 +I00 +sS'value' +p24058 +I00 +ssS'unique' +p24059 +(dp24060 +S'editable' +p24061 +I00 +sS'value' +p24062 +I00 +ssS'properties' +p24063 +(dp24064 +S'default_value' +p24065 +(dp24066 +S'editable' +p24067 +I00 +sS'value' +p24068 +NssS'summary_default' +p24069 +(dp24070 +S'editable' +p24071 +I01 +sS'value' +p24072 +S'none' +p24073 +ssS'valid_types' +p24074 +(dp24075 +S'editable' +p24076 +I01 +sS'value' +p24077 +(lp24078 +S'HumanUser' +p24079 +aS'ApiUser' +p24080 +asssS'description' +p24081 +(dp24082 +S'editable' +p24083 +I01 +sS'value' +p24084 +g47 +sssS'project' +p24085 +(dp24086 +S'mandatory' +p24087 +(dp24088 +S'editable' +p24089 +I00 +sS'value' +p24090 +I00 +ssS'name' +p24091 +(dp24092 +S'editable' +p24093 +I01 +sS'value' +p24094 +S'Project' +p24095 +ssS'data_type' +p24096 +(dp24097 +S'editable' +p24098 +I00 +sS'value' +p24099 +S'entity' +p24100 +ssS'entity_type' +p24101 +(dp24102 +S'editable' +p24103 +I00 +sS'value' +p24104 +S'TankType' +p24105 +ssS'editable' +p24106 +(dp24107 +S'editable' +p24108 +I00 +sS'value' +p24109 +I01 +ssS'unique' +p24110 +(dp24111 +S'editable' +p24112 +I00 +sS'value' +p24113 +I00 +ssS'properties' +p24114 +(dp24115 +S'default_value' +p24116 +(dp24117 +S'editable' +p24118 +I00 +sS'value' +p24119 +NssS'summary_default' +p24120 +(dp24121 +S'editable' +p24122 +I01 +sS'value' +p24123 +S'none' +p24124 +ssS'valid_types' +p24125 +(dp24126 +S'editable' +p24127 +I01 +sS'value' +p24128 +(lp24129 +S'Project' +p24130 +asssS'description' +p24131 +(dp24132 +S'editable' +p24133 +I01 +sS'value' +p24134 +g47 +sssS'sg_status_list' +p24135 +(dp24136 +S'mandatory' +p24137 +(dp24138 +S'editable' +p24139 +I00 +sS'value' +p24140 +I00 +ssS'name' +p24141 +(dp24142 +S'editable' +p24143 +I01 +sS'value' +p24144 +S'Status' +p24145 +ssS'data_type' +p24146 +(dp24147 +S'editable' +p24148 +I00 +sS'value' +p24149 +S'status_list' +p24150 +ssS'entity_type' +p24151 +(dp24152 +S'editable' +p24153 +I00 +sS'value' +p24154 +S'TankType' +p24155 +ssS'editable' +p24156 +(dp24157 +S'editable' +p24158 +I00 +sS'value' +p24159 +I01 +ssS'unique' +p24160 +(dp24161 +S'editable' +p24162 +I00 +sS'value' +p24163 +I00 +ssS'properties' +p24164 +(dp24165 +S'default_value' +p24166 +(dp24167 +S'editable' +p24168 +I01 +sS'value' +p24169 +S'wtg' +p24170 +ssS'valid_values' +p24171 +(dp24172 +S'editable' +p24173 +I01 +sS'value' +p24174 +(lp24175 +S'wtg' +p24176 +aS'ip' +p24177 +aS'cmpt' +p24178 +assS'summary_default' +p24179 +(dp24180 +S'editable' +p24181 +I01 +sS'value' +p24182 +S'none' +p24183 +sssS'description' +p24184 +(dp24185 +S'editable' +p24186 +I01 +sS'value' +p24187 +g47 +sssS'image' +p24188 +(dp24189 +S'mandatory' +p24190 +(dp24191 +S'editable' +p24192 +I00 +sS'value' +p24193 +I00 +ssS'name' +p24194 +(dp24195 +S'editable' +p24196 +I01 +sS'value' +p24197 +S'Thumbnail' +p24198 +ssS'data_type' +p24199 +(dp24200 +S'editable' +p24201 +I00 +sS'value' +p24202 +S'image' +p24203 +ssS'entity_type' +p24204 +(dp24205 +S'editable' +p24206 +I00 +sS'value' +p24207 +S'TankType' +p24208 +ssS'editable' +p24209 +(dp24210 +S'editable' +p24211 +I00 +sS'value' +p24212 +I01 +ssS'unique' +p24213 +(dp24214 +S'editable' +p24215 +I00 +sS'value' +p24216 +I00 +ssS'properties' +p24217 +(dp24218 +S'default_value' +p24219 +(dp24220 +S'editable' +p24221 +I00 +sS'value' +p24222 +NssS'summary_default' +p24223 +(dp24224 +S'editable' +p24225 +I01 +sS'value' +p24226 +S'none' +p24227 +sssS'description' +p24228 +(dp24229 +S'editable' +p24230 +I01 +sS'value' +p24231 +g47 +sssS'cached_display_name' +p24232 +(dp24233 +S'mandatory' +p24234 +(dp24235 +S'editable' +p24236 +I00 +sS'value' +p24237 +I00 +ssS'name' +p24238 +(dp24239 +S'editable' +p24240 +I01 +sS'value' +p24241 +S'Cached Display Name' +p24242 +ssS'data_type' +p24243 +(dp24244 +S'editable' +p24245 +I00 +sS'value' +p24246 +S'text' +p24247 +ssS'entity_type' +p24248 +(dp24249 +S'editable' +p24250 +I00 +sS'value' +p24251 +S'TankType' +p24252 +ssS'editable' +p24253 +(dp24254 +S'editable' +p24255 +I00 +sS'value' +p24256 +I01 +ssS'unique' +p24257 +(dp24258 +S'editable' +p24259 +I00 +sS'value' +p24260 +I00 +ssS'properties' +p24261 +(dp24262 +S'default_value' +p24263 +(dp24264 +S'editable' +p24265 +I00 +sS'value' +p24266 +NssS'summary_default' +p24267 +(dp24268 +S'editable' +p24269 +I00 +sS'value' +p24270 +S'none' +p24271 +sssS'description' +p24272 +(dp24273 +S'editable' +p24274 +I01 +sS'value' +p24275 +g47 +sssS'tag_list' +p24276 +(dp24277 +S'mandatory' +p24278 +(dp24279 +S'editable' +p24280 +I00 +sS'value' +p24281 +I00 +ssS'name' +p24282 +(dp24283 +S'editable' +p24284 +I01 +sS'value' +p24285 +S'Tags' +p24286 +ssS'data_type' +p24287 +(dp24288 +S'editable' +p24289 +I00 +sS'value' +p24290 +S'tag_list' +p24291 +ssS'entity_type' +p24292 +(dp24293 +S'editable' +p24294 +I00 +sS'value' +p24295 +S'TankType' +p24296 +ssS'editable' +p24297 +(dp24298 +S'editable' +p24299 +I00 +sS'value' +p24300 +I01 +ssS'unique' +p24301 +(dp24302 +S'editable' +p24303 +I00 +sS'value' +p24304 +I00 +ssS'properties' +p24305 +(dp24306 +S'default_value' +p24307 +(dp24308 +S'editable' +p24309 +I00 +sS'value' +p24310 +NssS'summary_default' +p24311 +(dp24312 +S'editable' +p24313 +I01 +sS'value' +p24314 +S'none' +p24315 +ssS'valid_types' +p24316 +(dp24317 +S'editable' +p24318 +I01 +sS'value' +p24319 +(lp24320 +S'Tag' +p24321 +asssS'description' +p24322 +(dp24323 +S'editable' +p24324 +I01 +sS'value' +p24325 +g47 +sssS'id' +p24326 +(dp24327 +S'mandatory' +p24328 +(dp24329 +S'editable' +p24330 +I00 +sS'value' +p24331 +I00 +ssS'name' +p24332 +(dp24333 +S'editable' +p24334 +I01 +sS'value' +p24335 +S'Id' +p24336 +ssS'data_type' +p24337 +(dp24338 +S'editable' +p24339 +I00 +sS'value' +p24340 +S'number' +p24341 +ssS'entity_type' +p24342 +(dp24343 +S'editable' +p24344 +I00 +sS'value' +p24345 +S'TankType' +p24346 +ssS'editable' +p24347 +(dp24348 +S'editable' +p24349 +I00 +sS'value' +p24350 +I00 +ssS'unique' +p24351 +(dp24352 +S'editable' +p24353 +I00 +sS'value' +p24354 +I00 +ssS'properties' +p24355 +(dp24356 +S'default_value' +p24357 +(dp24358 +S'editable' +p24359 +I00 +sS'value' +p24360 +NssS'summary_default' +p24361 +(dp24362 +S'editable' +p24363 +I01 +sS'value' +p24364 +S'none' +p24365 +sssS'description' +p24366 +(dp24367 +S'editable' +p24368 +I01 +sS'value' +p24369 +g47 +sssS'updated_by' +p24370 +(dp24371 +S'mandatory' +p24372 +(dp24373 +S'editable' +p24374 +I00 +sS'value' +p24375 +I00 +ssS'name' +p24376 +(dp24377 +S'editable' +p24378 +I01 +sS'value' +p24379 +S'Updated by' +p24380 +ssS'data_type' +p24381 +(dp24382 +S'editable' +p24383 +I00 +sS'value' +p24384 +S'entity' +p24385 +ssS'entity_type' +p24386 +(dp24387 +S'editable' +p24388 +I00 +sS'value' +p24389 +S'TankType' +p24390 +ssS'editable' +p24391 +(dp24392 +S'editable' +p24393 +I00 +sS'value' +p24394 +I00 +ssS'unique' +p24395 +(dp24396 +S'editable' +p24397 +I00 +sS'value' +p24398 +I00 +ssS'properties' +p24399 +(dp24400 +S'default_value' +p24401 +(dp24402 +S'editable' +p24403 +I00 +sS'value' +p24404 +NssS'summary_default' +p24405 +(dp24406 +S'editable' +p24407 +I01 +sS'value' +p24408 +S'none' +p24409 +ssS'valid_types' +p24410 +(dp24411 +S'editable' +p24412 +I01 +sS'value' +p24413 +(lp24414 +S'HumanUser' +p24415 +aS'ApiUser' +p24416 +asssS'description' +p24417 +(dp24418 +S'editable' +p24419 +I01 +sS'value' +p24420 +g47 +ssssS'Icon' +p24421 +(dp24422 +S'image_map_key' +p24423 +(dp24424 +S'mandatory' +p24425 +(dp24426 +S'editable' +p24427 +I00 +sS'value' +p24428 +I00 +ssS'name' +p24429 +(dp24430 +S'editable' +p24431 +I01 +sS'value' +p24432 +S'Image Map Key' +p24433 +ssS'data_type' +p24434 +(dp24435 +S'editable' +p24436 +I00 +sS'value' +p24437 +S'text' +p24438 +ssS'entity_type' +p24439 +(dp24440 +S'editable' +p24441 +I00 +sS'value' +p24442 +S'Icon' +p24443 +ssS'editable' +p24444 +(dp24445 +S'editable' +p24446 +I00 +sS'value' +p24447 +I00 +ssS'unique' +p24448 +(dp24449 +S'editable' +p24450 +I00 +sS'value' +p24451 +I00 +ssS'properties' +p24452 +(dp24453 +S'default_value' +p24454 +(dp24455 +S'editable' +p24456 +I00 +sS'value' +p24457 +NssS'summary_default' +p24458 +(dp24459 +S'editable' +p24460 +I01 +sS'value' +p24461 +S'none' +p24462 +sssS'description' +p24463 +(dp24464 +S'editable' +p24465 +I01 +sS'value' +p24466 +g47 +sssS'uuid' +p24467 +(dp24468 +S'mandatory' +p24469 +(dp24470 +S'editable' +p24471 +I00 +sS'value' +p24472 +I00 +ssS'name' +p24473 +(dp24474 +S'editable' +p24475 +I01 +sS'value' +p24476 +S'UUID' +p24477 +ssS'data_type' +p24478 +(dp24479 +S'editable' +p24480 +I00 +sS'value' +p24481 +S'uuid' +p24482 +ssS'entity_type' +p24483 +(dp24484 +S'editable' +p24485 +I00 +sS'value' +p24486 +S'Icon' +p24487 +ssS'editable' +p24488 +(dp24489 +S'editable' +p24490 +I00 +sS'value' +p24491 +I00 +ssS'unique' +p24492 +(dp24493 +S'editable' +p24494 +I00 +sS'value' +p24495 +I00 +ssS'properties' +p24496 +(dp24497 +S'default_value' +p24498 +(dp24499 +S'editable' +p24500 +I00 +sS'value' +p24501 +NssS'summary_default' +p24502 +(dp24503 +S'editable' +p24504 +I00 +sS'value' +p24505 +S'none' +p24506 +sssS'description' +p24507 +(dp24508 +S'editable' +p24509 +I01 +sS'value' +p24510 +g47 +sssS'icon_type' +p24511 +(dp24512 +S'mandatory' +p24513 +(dp24514 +S'editable' +p24515 +I00 +sS'value' +p24516 +I00 +ssS'name' +p24517 +(dp24518 +S'editable' +p24519 +I01 +sS'value' +p24520 +S'Icon Type' +p24521 +ssS'data_type' +p24522 +(dp24523 +S'editable' +p24524 +I00 +sS'value' +p24525 +S'list' +p24526 +ssS'entity_type' +p24527 +(dp24528 +S'editable' +p24529 +I00 +sS'value' +p24530 +S'Icon' +p24531 +ssS'editable' +p24532 +(dp24533 +S'editable' +p24534 +I00 +sS'value' +p24535 +I00 +ssS'unique' +p24536 +(dp24537 +S'editable' +p24538 +I00 +sS'value' +p24539 +I00 +ssS'properties' +p24540 +(dp24541 +S'default_value' +p24542 +(dp24543 +S'editable' +p24544 +I00 +sS'value' +p24545 +NssS'valid_values' +p24546 +(dp24547 +S'editable' +p24548 +I01 +sS'value' +p24549 +(lp24550 +S'permanent_status' +p24551 +aS'custom_status' +p24552 +assS'summary_default' +p24553 +(dp24554 +S'editable' +p24555 +I01 +sS'value' +p24556 +S'none' +p24557 +sssS'description' +p24558 +(dp24559 +S'editable' +p24560 +I01 +sS'value' +p24561 +g47 +sssS'url' +p24562 +(dp24563 +S'mandatory' +p24564 +(dp24565 +S'editable' +p24566 +I00 +sS'value' +p24567 +I00 +ssS'name' +p24568 +(dp24569 +S'editable' +p24570 +I01 +sS'value' +p24571 +S'Icon URL' +p24572 +ssS'data_type' +p24573 +(dp24574 +S'editable' +p24575 +I00 +sS'value' +p24576 +S'text' +p24577 +ssS'entity_type' +p24578 +(dp24579 +S'editable' +p24580 +I00 +sS'value' +p24581 +S'Icon' +p24582 +ssS'editable' +p24583 +(dp24584 +S'editable' +p24585 +I00 +sS'value' +p24586 +I00 +ssS'unique' +p24587 +(dp24588 +S'editable' +p24589 +I00 +sS'value' +p24590 +I00 +ssS'properties' +p24591 +(dp24592 +S'default_value' +p24593 +(dp24594 +S'editable' +p24595 +I00 +sS'value' +p24596 +NssS'summary_default' +p24597 +(dp24598 +S'editable' +p24599 +I00 +sS'value' +p24600 +S'none' +p24601 +sssS'description' +p24602 +(dp24603 +S'editable' +p24604 +I01 +sS'value' +p24605 +g47 +sssS'html' +p24606 +(dp24607 +S'mandatory' +p24608 +(dp24609 +S'editable' +p24610 +I00 +sS'value' +p24611 +I00 +ssS'name' +p24612 +(dp24613 +S'editable' +p24614 +I01 +sS'value' +p24615 +S'Icon HTML' +p24616 +ssS'data_type' +p24617 +(dp24618 +S'editable' +p24619 +I00 +sS'value' +p24620 +S'text' +p24621 +ssS'entity_type' +p24622 +(dp24623 +S'editable' +p24624 +I00 +sS'value' +p24625 +S'Icon' +p24626 +ssS'editable' +p24627 +(dp24628 +S'editable' +p24629 +I00 +sS'value' +p24630 +I00 +ssS'unique' +p24631 +(dp24632 +S'editable' +p24633 +I00 +sS'value' +p24634 +I00 +ssS'properties' +p24635 +(dp24636 +S'default_value' +p24637 +(dp24638 +S'editable' +p24639 +I00 +sS'value' +p24640 +NssS'summary_default' +p24641 +(dp24642 +S'editable' +p24643 +I01 +sS'value' +p24644 +S'none' +p24645 +sssS'description' +p24646 +(dp24647 +S'editable' +p24648 +I01 +sS'value' +p24649 +g47 +sssS'display_type' +p24650 +(dp24651 +S'mandatory' +p24652 +(dp24653 +S'editable' +p24654 +I00 +sS'value' +p24655 +I00 +ssS'name' +p24656 +(dp24657 +S'editable' +p24658 +I01 +sS'value' +p24659 +S'Display Type' +p24660 +ssS'data_type' +p24661 +(dp24662 +S'editable' +p24663 +I00 +sS'value' +p24664 +S'list' +p24665 +ssS'entity_type' +p24666 +(dp24667 +S'editable' +p24668 +I00 +sS'value' +p24669 +S'Icon' +p24670 +ssS'editable' +p24671 +(dp24672 +S'editable' +p24673 +I00 +sS'value' +p24674 +I00 +ssS'unique' +p24675 +(dp24676 +S'editable' +p24677 +I00 +sS'value' +p24678 +I00 +ssS'properties' +p24679 +(dp24680 +S'default_value' +p24681 +(dp24682 +S'editable' +p24683 +I00 +sS'value' +p24684 +NssS'valid_values' +p24685 +(dp24686 +S'editable' +p24687 +I01 +sS'value' +p24688 +(lp24689 +S'html' +p24690 +aS'image' +p24691 +aS'image_map' +p24692 +assS'summary_default' +p24693 +(dp24694 +S'editable' +p24695 +I01 +sS'value' +p24696 +S'none' +p24697 +sssS'description' +p24698 +(dp24699 +S'editable' +p24700 +I01 +sS'value' +p24701 +g47 +sssS'image_data' +p24702 +(dp24703 +S'mandatory' +p24704 +(dp24705 +S'editable' +p24706 +I00 +sS'value' +p24707 +I00 +ssS'name' +p24708 +(dp24709 +S'editable' +p24710 +I01 +sS'value' +p24711 +S'Image Data' +p24712 +ssS'data_type' +p24713 +(dp24714 +S'editable' +p24715 +I00 +sS'value' +p24716 +S'text' +p24717 +ssS'entity_type' +p24718 +(dp24719 +S'editable' +p24720 +I00 +sS'value' +p24721 +S'Icon' +p24722 +ssS'editable' +p24723 +(dp24724 +S'editable' +p24725 +I00 +sS'value' +p24726 +I00 +ssS'unique' +p24727 +(dp24728 +S'editable' +p24729 +I00 +sS'value' +p24730 +I00 +ssS'properties' +p24731 +(dp24732 +S'default_value' +p24733 +(dp24734 +S'editable' +p24735 +I00 +sS'value' +p24736 +NssS'summary_default' +p24737 +(dp24738 +S'editable' +p24739 +I01 +sS'value' +p24740 +S'none' +p24741 +sssS'description' +p24742 +(dp24743 +S'editable' +p24744 +I01 +sS'value' +p24745 +g47 +sssS'cached_display_name' +p24746 +(dp24747 +S'mandatory' +p24748 +(dp24749 +S'editable' +p24750 +I00 +sS'value' +p24751 +I00 +ssS'name' +p24752 +(dp24753 +S'editable' +p24754 +I01 +sS'value' +p24755 +S'Cached Display Name' +p24756 +ssS'data_type' +p24757 +(dp24758 +S'editable' +p24759 +I00 +sS'value' +p24760 +S'text' +p24761 +ssS'entity_type' +p24762 +(dp24763 +S'editable' +p24764 +I00 +sS'value' +p24765 +S'Icon' +p24766 +ssS'editable' +p24767 +(dp24768 +S'editable' +p24769 +I00 +sS'value' +p24770 +I00 +ssS'unique' +p24771 +(dp24772 +S'editable' +p24773 +I00 +sS'value' +p24774 +I00 +ssS'properties' +p24775 +(dp24776 +S'default_value' +p24777 +(dp24778 +S'editable' +p24779 +I00 +sS'value' +p24780 +NssS'summary_default' +p24781 +(dp24782 +S'editable' +p24783 +I00 +sS'value' +p24784 +S'none' +p24785 +sssS'description' +p24786 +(dp24787 +S'editable' +p24788 +I01 +sS'value' +p24789 +g47 +sssS'id' +p24790 +(dp24791 +S'mandatory' +p24792 +(dp24793 +S'editable' +p24794 +I00 +sS'value' +p24795 +I00 +ssS'name' +p24796 +(dp24797 +S'editable' +p24798 +I01 +sS'value' +p24799 +S'Id' +p24800 +ssS'data_type' +p24801 +(dp24802 +S'editable' +p24803 +I00 +sS'value' +p24804 +S'number' +p24805 +ssS'entity_type' +p24806 +(dp24807 +S'editable' +p24808 +I00 +sS'value' +p24809 +S'Icon' +p24810 +ssS'editable' +p24811 +(dp24812 +S'editable' +p24813 +I00 +sS'value' +p24814 +I00 +ssS'unique' +p24815 +(dp24816 +S'editable' +p24817 +I00 +sS'value' +p24818 +I00 +ssS'properties' +p24819 +(dp24820 +S'default_value' +p24821 +(dp24822 +S'editable' +p24823 +I00 +sS'value' +p24824 +NssS'summary_default' +p24825 +(dp24826 +S'editable' +p24827 +I00 +sS'value' +p24828 +S'none' +p24829 +sssS'description' +p24830 +(dp24831 +S'editable' +p24832 +I01 +sS'value' +p24833 +g47 +sssS'name' +p24834 +(dp24835 +S'mandatory' +p24836 +(dp24837 +S'editable' +p24838 +I00 +sS'value' +p24839 +I00 +ssS'name' +p24840 +(dp24841 +S'editable' +p24842 +I01 +sS'value' +p24843 +S'Status Name' +p24844 +ssS'data_type' +p24845 +(dp24846 +S'editable' +p24847 +I00 +sS'value' +p24848 +S'text' +p24849 +ssS'entity_type' +p24850 +(dp24851 +S'editable' +p24852 +I00 +sS'value' +p24853 +S'Icon' +p24854 +ssS'editable' +p24855 +(dp24856 +S'editable' +p24857 +I00 +sS'value' +p24858 +I00 +ssS'unique' +p24859 +(dp24860 +S'editable' +p24861 +I00 +sS'value' +p24862 +I00 +ssS'properties' +p24863 +(dp24864 +S'default_value' +p24865 +(dp24866 +S'editable' +p24867 +I00 +sS'value' +p24868 +NssS'summary_default' +p24869 +(dp24870 +S'editable' +p24871 +I01 +sS'value' +p24872 +S'none' +p24873 +sssS'description' +p24874 +(dp24875 +S'editable' +p24876 +I01 +sS'value' +p24877 +g47 +ssssS'LocalStorage' +p24878 +(dp24879 +S'code' +p24880 +(dp24881 +S'mandatory' +p24882 +(dp24883 +S'editable' +p24884 +I00 +sS'value' +p24885 +I01 +ssS'name' +p24886 +(dp24887 +S'editable' +p24888 +I01 +sS'value' +p24889 +S'Local Storage Name' +p24890 +ssS'data_type' +p24891 +(dp24892 +S'editable' +p24893 +I00 +sS'value' +p24894 +S'text' +p24895 +ssS'entity_type' +p24896 +(dp24897 +S'editable' +p24898 +I00 +sS'value' +p24899 +S'LocalStorage' +p24900 +ssS'editable' +p24901 +(dp24902 +S'editable' +p24903 +I00 +sS'value' +p24904 +I01 +ssS'unique' +p24905 +(dp24906 +S'editable' +p24907 +I00 +sS'value' +p24908 +I00 +ssS'properties' +p24909 +(dp24910 +S'default_value' +p24911 +(dp24912 +S'editable' +p24913 +I00 +sS'value' +p24914 +NssS'summary_default' +p24915 +(dp24916 +S'editable' +p24917 +I00 +sS'value' +p24918 +S'none' +p24919 +sssS'description' +p24920 +(dp24921 +S'editable' +p24922 +I01 +sS'value' +p24923 +g47 +sssS'uuid' +p24924 +(dp24925 +S'mandatory' +p24926 +(dp24927 +S'editable' +p24928 +I00 +sS'value' +p24929 +I00 +ssS'name' +p24930 +(dp24931 +S'editable' +p24932 +I01 +sS'value' +p24933 +S'UUID' +p24934 +ssS'data_type' +p24935 +(dp24936 +S'editable' +p24937 +I00 +sS'value' +p24938 +S'uuid' +p24939 +ssS'entity_type' +p24940 +(dp24941 +S'editable' +p24942 +I00 +sS'value' +p24943 +S'LocalStorage' +p24944 +ssS'editable' +p24945 +(dp24946 +S'editable' +p24947 +I00 +sS'value' +p24948 +I00 +ssS'unique' +p24949 +(dp24950 +S'editable' +p24951 +I00 +sS'value' +p24952 +I00 +ssS'properties' +p24953 +(dp24954 +S'default_value' +p24955 +(dp24956 +S'editable' +p24957 +I00 +sS'value' +p24958 +NssS'summary_default' +p24959 +(dp24960 +S'editable' +p24961 +I00 +sS'value' +p24962 +S'none' +p24963 +sssS'description' +p24964 +(dp24965 +S'editable' +p24966 +I01 +sS'value' +p24967 +g47 +sssS'mac_path' +p24968 +(dp24969 +S'mandatory' +p24970 +(dp24971 +S'editable' +p24972 +I00 +sS'value' +p24973 +I00 +ssS'name' +p24974 +(dp24975 +S'editable' +p24976 +I01 +sS'value' +p24977 +S'Mac Path' +p24978 +ssS'data_type' +p24979 +(dp24980 +S'editable' +p24981 +I00 +sS'value' +p24982 +S'text' +p24983 +ssS'entity_type' +p24984 +(dp24985 +S'editable' +p24986 +I00 +sS'value' +p24987 +S'LocalStorage' +p24988 +ssS'editable' +p24989 +(dp24990 +S'editable' +p24991 +I00 +sS'value' +p24992 +I01 +ssS'unique' +p24993 +(dp24994 +S'editable' +p24995 +I00 +sS'value' +p24996 +I00 +ssS'properties' +p24997 +(dp24998 +S'default_value' +p24999 +(dp25000 +S'editable' +p25001 +I00 +sS'value' +p25002 +NssS'summary_default' +p25003 +(dp25004 +S'editable' +p25005 +I00 +sS'value' +p25006 +S'none' +p25007 +sssS'description' +p25008 +(dp25009 +S'editable' +p25010 +I01 +sS'value' +p25011 +g47 +sssS'created_at' +p25012 +(dp25013 +S'mandatory' +p25014 +(dp25015 +S'editable' +p25016 +I00 +sS'value' +p25017 +I00 +ssS'name' +p25018 +(dp25019 +S'editable' +p25020 +I01 +sS'value' +p25021 +S'Date Created' +p25022 +ssS'data_type' +p25023 +(dp25024 +S'editable' +p25025 +I00 +sS'value' +p25026 +S'date_time' +p25027 +ssS'entity_type' +p25028 +(dp25029 +S'editable' +p25030 +I00 +sS'value' +p25031 +S'LocalStorage' +p25032 +ssS'editable' +p25033 +(dp25034 +S'editable' +p25035 +I00 +sS'value' +p25036 +I00 +ssS'unique' +p25037 +(dp25038 +S'editable' +p25039 +I00 +sS'value' +p25040 +I00 +ssS'properties' +p25041 +(dp25042 +S'default_value' +p25043 +(dp25044 +S'editable' +p25045 +I00 +sS'value' +p25046 +NssS'summary_default' +p25047 +(dp25048 +S'editable' +p25049 +I00 +sS'value' +p25050 +S'none' +p25051 +sssS'description' +p25052 +(dp25053 +S'editable' +p25054 +I01 +sS'value' +p25055 +g47 +sssS'updated_at' +p25056 +(dp25057 +S'mandatory' +p25058 +(dp25059 +S'editable' +p25060 +I00 +sS'value' +p25061 +I00 +ssS'name' +p25062 +(dp25063 +S'editable' +p25064 +I01 +sS'value' +p25065 +S'Date Updated' +p25066 +ssS'data_type' +p25067 +(dp25068 +S'editable' +p25069 +I00 +sS'value' +p25070 +S'date_time' +p25071 +ssS'entity_type' +p25072 +(dp25073 +S'editable' +p25074 +I00 +sS'value' +p25075 +S'LocalStorage' +p25076 +ssS'editable' +p25077 +(dp25078 +S'editable' +p25079 +I00 +sS'value' +p25080 +I00 +ssS'unique' +p25081 +(dp25082 +S'editable' +p25083 +I00 +sS'value' +p25084 +I00 +ssS'properties' +p25085 +(dp25086 +S'default_value' +p25087 +(dp25088 +S'editable' +p25089 +I00 +sS'value' +p25090 +NssS'summary_default' +p25091 +(dp25092 +S'editable' +p25093 +I00 +sS'value' +p25094 +S'none' +p25095 +sssS'description' +p25096 +(dp25097 +S'editable' +p25098 +I01 +sS'value' +p25099 +g47 +sssS'created_by' +p25100 +(dp25101 +S'mandatory' +p25102 +(dp25103 +S'editable' +p25104 +I00 +sS'value' +p25105 +I00 +ssS'name' +p25106 +(dp25107 +S'editable' +p25108 +I01 +sS'value' +p25109 +S'Created by' +p25110 +ssS'data_type' +p25111 +(dp25112 +S'editable' +p25113 +I00 +sS'value' +p25114 +S'entity' +p25115 +ssS'entity_type' +p25116 +(dp25117 +S'editable' +p25118 +I00 +sS'value' +p25119 +S'LocalStorage' +p25120 +ssS'editable' +p25121 +(dp25122 +S'editable' +p25123 +I00 +sS'value' +p25124 +I00 +ssS'unique' +p25125 +(dp25126 +S'editable' +p25127 +I00 +sS'value' +p25128 +I00 +ssS'properties' +p25129 +(dp25130 +S'default_value' +p25131 +(dp25132 +S'editable' +p25133 +I00 +sS'value' +p25134 +NssS'summary_default' +p25135 +(dp25136 +S'editable' +p25137 +I00 +sS'value' +p25138 +S'none' +p25139 +ssS'valid_types' +p25140 +(dp25141 +S'editable' +p25142 +I00 +sS'value' +p25143 +(lp25144 +S'HumanUser' +p25145 +aS'ApiUser' +p25146 +asssS'description' +p25147 +(dp25148 +S'editable' +p25149 +I01 +sS'value' +p25150 +g47 +sssS'windows_path' +p25151 +(dp25152 +S'mandatory' +p25153 +(dp25154 +S'editable' +p25155 +I00 +sS'value' +p25156 +I00 +ssS'name' +p25157 +(dp25158 +S'editable' +p25159 +I01 +sS'value' +p25160 +S'Windows Path' +p25161 +ssS'data_type' +p25162 +(dp25163 +S'editable' +p25164 +I00 +sS'value' +p25165 +S'text' +p25166 +ssS'entity_type' +p25167 +(dp25168 +S'editable' +p25169 +I00 +sS'value' +p25170 +S'LocalStorage' +p25171 +ssS'editable' +p25172 +(dp25173 +S'editable' +p25174 +I00 +sS'value' +p25175 +I01 +ssS'unique' +p25176 +(dp25177 +S'editable' +p25178 +I00 +sS'value' +p25179 +I00 +ssS'properties' +p25180 +(dp25181 +S'default_value' +p25182 +(dp25183 +S'editable' +p25184 +I00 +sS'value' +p25185 +NssS'summary_default' +p25186 +(dp25187 +S'editable' +p25188 +I00 +sS'value' +p25189 +S'none' +p25190 +sssS'description' +p25191 +(dp25192 +S'editable' +p25193 +I01 +sS'value' +p25194 +g47 +sssS'updated_by' +p25195 +(dp25196 +S'mandatory' +p25197 +(dp25198 +S'editable' +p25199 +I00 +sS'value' +p25200 +I00 +ssS'name' +p25201 +(dp25202 +S'editable' +p25203 +I01 +sS'value' +p25204 +S'Updated by' +p25205 +ssS'data_type' +p25206 +(dp25207 +S'editable' +p25208 +I00 +sS'value' +p25209 +S'entity' +p25210 +ssS'entity_type' +p25211 +(dp25212 +S'editable' +p25213 +I00 +sS'value' +p25214 +S'LocalStorage' +p25215 +ssS'editable' +p25216 +(dp25217 +S'editable' +p25218 +I00 +sS'value' +p25219 +I00 +ssS'unique' +p25220 +(dp25221 +S'editable' +p25222 +I00 +sS'value' +p25223 +I00 +ssS'properties' +p25224 +(dp25225 +S'default_value' +p25226 +(dp25227 +S'editable' +p25228 +I00 +sS'value' +p25229 +NssS'summary_default' +p25230 +(dp25231 +S'editable' +p25232 +I00 +sS'value' +p25233 +S'none' +p25234 +ssS'valid_types' +p25235 +(dp25236 +S'editable' +p25237 +I00 +sS'value' +p25238 +(lp25239 +S'HumanUser' +p25240 +aS'ApiUser' +p25241 +asssS'description' +p25242 +(dp25243 +S'editable' +p25244 +I01 +sS'value' +p25245 +g47 +sssS'cached_display_name' +p25246 +(dp25247 +S'mandatory' +p25248 +(dp25249 +S'editable' +p25250 +I00 +sS'value' +p25251 +I00 +ssS'name' +p25252 +(dp25253 +S'editable' +p25254 +I01 +sS'value' +p25255 +S'Cached Display Name' +p25256 +ssS'data_type' +p25257 +(dp25258 +S'editable' +p25259 +I00 +sS'value' +p25260 +S'text' +p25261 +ssS'entity_type' +p25262 +(dp25263 +S'editable' +p25264 +I00 +sS'value' +p25265 +S'LocalStorage' +p25266 +ssS'editable' +p25267 +(dp25268 +S'editable' +p25269 +I00 +sS'value' +p25270 +I01 +ssS'unique' +p25271 +(dp25272 +S'editable' +p25273 +I00 +sS'value' +p25274 +I00 +ssS'properties' +p25275 +(dp25276 +S'default_value' +p25277 +(dp25278 +S'editable' +p25279 +I00 +sS'value' +p25280 +NssS'summary_default' +p25281 +(dp25282 +S'editable' +p25283 +I00 +sS'value' +p25284 +S'none' +p25285 +sssS'description' +p25286 +(dp25287 +S'editable' +p25288 +I01 +sS'value' +p25289 +g47 +sssS'id' +p25290 +(dp25291 +S'mandatory' +p25292 +(dp25293 +S'editable' +p25294 +I00 +sS'value' +p25295 +I00 +ssS'name' +p25296 +(dp25297 +S'editable' +p25298 +I01 +sS'value' +p25299 +S'Id' +p25300 +ssS'data_type' +p25301 +(dp25302 +S'editable' +p25303 +I00 +sS'value' +p25304 +S'number' +p25305 +ssS'entity_type' +p25306 +(dp25307 +S'editable' +p25308 +I00 +sS'value' +p25309 +S'LocalStorage' +p25310 +ssS'editable' +p25311 +(dp25312 +S'editable' +p25313 +I00 +sS'value' +p25314 +I00 +ssS'unique' +p25315 +(dp25316 +S'editable' +p25317 +I00 +sS'value' +p25318 +I00 +ssS'properties' +p25319 +(dp25320 +S'default_value' +p25321 +(dp25322 +S'editable' +p25323 +I00 +sS'value' +p25324 +NssS'summary_default' +p25325 +(dp25326 +S'editable' +p25327 +I00 +sS'value' +p25328 +S'none' +p25329 +sssS'description' +p25330 +(dp25331 +S'editable' +p25332 +I01 +sS'value' +p25333 +g47 +sssS'linux_path' +p25334 +(dp25335 +S'mandatory' +p25336 +(dp25337 +S'editable' +p25338 +I00 +sS'value' +p25339 +I00 +ssS'name' +p25340 +(dp25341 +S'editable' +p25342 +I01 +sS'value' +p25343 +S'Linux Path' +p25344 +ssS'data_type' +p25345 +(dp25346 +S'editable' +p25347 +I00 +sS'value' +p25348 +S'text' +p25349 +ssS'entity_type' +p25350 +(dp25351 +S'editable' +p25352 +I00 +sS'value' +p25353 +S'LocalStorage' +p25354 +ssS'editable' +p25355 +(dp25356 +S'editable' +p25357 +I00 +sS'value' +p25358 +I01 +ssS'unique' +p25359 +(dp25360 +S'editable' +p25361 +I00 +sS'value' +p25362 +I00 +ssS'properties' +p25363 +(dp25364 +S'default_value' +p25365 +(dp25366 +S'editable' +p25367 +I00 +sS'value' +p25368 +NssS'summary_default' +p25369 +(dp25370 +S'editable' +p25371 +I00 +sS'value' +p25372 +S'none' +p25373 +sssS'description' +p25374 +(dp25375 +S'editable' +p25376 +I01 +sS'value' +p25377 +g47 +sssS'description' +p25378 +(dp25379 +S'mandatory' +p25380 +(dp25381 +S'editable' +p25382 +I00 +sS'value' +p25383 +I00 +ssS'name' +p25384 +(dp25385 +S'editable' +p25386 +I01 +sS'value' +p25387 +S'Description' +p25388 +ssS'data_type' +p25389 +(dp25390 +S'editable' +p25391 +I00 +sS'value' +p25392 +S'text' +p25393 +ssS'entity_type' +p25394 +(dp25395 +S'editable' +p25396 +I00 +sS'value' +p25397 +S'LocalStorage' +p25398 +ssS'editable' +p25399 +(dp25400 +S'editable' +p25401 +I00 +sS'value' +p25402 +I01 +ssS'unique' +p25403 +(dp25404 +S'editable' +p25405 +I00 +sS'value' +p25406 +I00 +ssS'properties' +p25407 +(dp25408 +S'default_value' +p25409 +(dp25410 +S'editable' +p25411 +I00 +sS'value' +p25412 +NssS'summary_default' +p25413 +(dp25414 +S'editable' +p25415 +I00 +sS'value' +p25416 +S'none' +p25417 +sssS'description' +p25418 +(dp25419 +S'editable' +p25420 +I01 +sS'value' +p25421 +g47 +ssssS'TaskTemplate' +p25422 +(dp25423 +S'open_notes_count' +p25424 +(dp25425 +S'mandatory' +p25426 +(dp25427 +S'editable' +p25428 +I00 +sS'value' +p25429 +I00 +ssS'name' +p25430 +(dp25431 +S'editable' +p25432 +I01 +sS'value' +p25433 +S'Open Notes Count' +p25434 +ssS'data_type' +p25435 +(dp25436 +S'editable' +p25437 +I00 +sS'value' +p25438 +S'text' +p25439 +ssS'entity_type' +p25440 +(dp25441 +S'editable' +p25442 +I00 +sS'value' +p25443 +S'TaskTemplate' +p25444 +ssS'editable' +p25445 +(dp25446 +S'editable' +p25447 +I00 +sS'value' +p25448 +I00 +ssS'unique' +p25449 +(dp25450 +S'editable' +p25451 +I00 +sS'value' +p25452 +I00 +ssS'properties' +p25453 +(dp25454 +S'default_value' +p25455 +(dp25456 +S'editable' +p25457 +I00 +sS'value' +p25458 +NssS'summary_default' +p25459 +(dp25460 +S'editable' +p25461 +I01 +sS'value' +p25462 +S'none' +p25463 +sssS'description' +p25464 +(dp25465 +S'editable' +p25466 +I01 +sS'value' +p25467 +g47 +sssS'code' +p25468 +(dp25469 +S'mandatory' +p25470 +(dp25471 +S'editable' +p25472 +I00 +sS'value' +p25473 +I01 +ssS'name' +p25474 +(dp25475 +S'editable' +p25476 +I01 +sS'value' +p25477 +S'Task Template Name' +p25478 +ssS'data_type' +p25479 +(dp25480 +S'editable' +p25481 +I00 +sS'value' +p25482 +S'text' +p25483 +ssS'entity_type' +p25484 +(dp25485 +S'editable' +p25486 +I00 +sS'value' +p25487 +S'TaskTemplate' +p25488 +ssS'editable' +p25489 +(dp25490 +S'editable' +p25491 +I00 +sS'value' +p25492 +I01 +ssS'unique' +p25493 +(dp25494 +S'editable' +p25495 +I00 +sS'value' +p25496 +I00 +ssS'properties' +p25497 +(dp25498 +S'default_value' +p25499 +(dp25500 +S'editable' +p25501 +I00 +sS'value' +p25502 +NssS'summary_default' +p25503 +(dp25504 +S'editable' +p25505 +I01 +sS'value' +p25506 +S'none' +p25507 +sssS'description' +p25508 +(dp25509 +S'editable' +p25510 +I01 +sS'value' +p25511 +g47 +sssS'open_notes' +p25512 +(dp25513 +S'mandatory' +p25514 +(dp25515 +S'editable' +p25516 +I00 +sS'value' +p25517 +I00 +ssS'name' +p25518 +(dp25519 +S'editable' +p25520 +I01 +sS'value' +p25521 +S'Open Notes' +p25522 +ssS'data_type' +p25523 +(dp25524 +S'editable' +p25525 +I00 +sS'value' +p25526 +S'multi_entity' +p25527 +ssS'entity_type' +p25528 +(dp25529 +S'editable' +p25530 +I00 +sS'value' +p25531 +S'TaskTemplate' +p25532 +ssS'editable' +p25533 +(dp25534 +S'editable' +p25535 +I00 +sS'value' +p25536 +I00 +ssS'unique' +p25537 +(dp25538 +S'editable' +p25539 +I00 +sS'value' +p25540 +I00 +ssS'properties' +p25541 +(dp25542 +S'default_value' +p25543 +(dp25544 +S'editable' +p25545 +I00 +sS'value' +p25546 +NssS'summary_default' +p25547 +(dp25548 +S'editable' +p25549 +I01 +sS'value' +p25550 +S'none' +p25551 +ssS'valid_types' +p25552 +(dp25553 +S'editable' +p25554 +I01 +sS'value' +p25555 +(lp25556 +S'Note' +p25557 +asssS'description' +p25558 +(dp25559 +S'editable' +p25560 +I01 +sS'value' +p25561 +g47 +sssS'description' +p25562 +(dp25563 +S'mandatory' +p25564 +(dp25565 +S'editable' +p25566 +I00 +sS'value' +p25567 +I00 +ssS'name' +p25568 +(dp25569 +S'editable' +p25570 +I01 +sS'value' +p25571 +S'Description' +p25572 +ssS'data_type' +p25573 +(dp25574 +S'editable' +p25575 +I00 +sS'value' +p25576 +S'text' +p25577 +ssS'entity_type' +p25578 +(dp25579 +S'editable' +p25580 +I00 +sS'value' +p25581 +S'TaskTemplate' +p25582 +ssS'editable' +p25583 +(dp25584 +S'editable' +p25585 +I00 +sS'value' +p25586 +I01 +ssS'unique' +p25587 +(dp25588 +S'editable' +p25589 +I00 +sS'value' +p25590 +I00 +ssS'properties' +p25591 +(dp25592 +S'default_value' +p25593 +(dp25594 +S'editable' +p25595 +I00 +sS'value' +p25596 +NssS'summary_default' +p25597 +(dp25598 +S'editable' +p25599 +I01 +sS'value' +p25600 +S'none' +p25601 +sssS'description' +p25602 +(dp25603 +S'editable' +p25604 +I01 +sS'value' +p25605 +g47 +sssS'entity_type' +p25606 +(dp25607 +S'mandatory' +p25608 +(dp25609 +S'editable' +p25610 +I00 +sS'value' +p25611 +I00 +ssS'name' +p25612 +(dp25613 +S'editable' +p25614 +I01 +sS'value' +p25615 +S'Entity Type' +p25616 +ssS'data_type' +p25617 +(dp25618 +S'editable' +p25619 +I00 +sS'value' +p25620 +S'entity_type' +p25621 +ssS'entity_type' +p25622 +(dp25623 +S'editable' +p25624 +I00 +sS'value' +p25625 +S'TaskTemplate' +p25626 +ssS'editable' +p25627 +(dp25628 +S'editable' +p25629 +I00 +sS'value' +p25630 +I00 +ssS'unique' +p25631 +(dp25632 +S'editable' +p25633 +I00 +sS'value' +p25634 +I00 +ssS'properties' +p25635 +(dp25636 +S'default_value' +p25637 +(dp25638 +S'editable' +p25639 +I00 +sS'value' +p25640 +NssS'summary_default' +p25641 +(dp25642 +S'editable' +p25643 +I01 +sS'value' +p25644 +S'none' +p25645 +sssS'description' +p25646 +(dp25647 +S'editable' +p25648 +I01 +sS'value' +p25649 +g47 +sssS'notes' +p25650 +(dp25651 +S'mandatory' +p25652 +(dp25653 +S'editable' +p25654 +I00 +sS'value' +p25655 +I00 +ssS'name' +p25656 +(dp25657 +S'editable' +p25658 +I01 +sS'value' +p25659 +S'Notes' +p25660 +ssS'data_type' +p25661 +(dp25662 +S'editable' +p25663 +I00 +sS'value' +p25664 +S'multi_entity' +p25665 +ssS'entity_type' +p25666 +(dp25667 +S'editable' +p25668 +I00 +sS'value' +p25669 +S'TaskTemplate' +p25670 +ssS'editable' +p25671 +(dp25672 +S'editable' +p25673 +I00 +sS'value' +p25674 +I01 +ssS'unique' +p25675 +(dp25676 +S'editable' +p25677 +I00 +sS'value' +p25678 +I00 +ssS'properties' +p25679 +(dp25680 +S'default_value' +p25681 +(dp25682 +S'editable' +p25683 +I00 +sS'value' +p25684 +NssS'summary_default' +p25685 +(dp25686 +S'editable' +p25687 +I01 +sS'value' +p25688 +S'none' +p25689 +ssS'valid_types' +p25690 +(dp25691 +S'editable' +p25692 +I01 +sS'value' +p25693 +(lp25694 +S'Note' +p25695 +asssS'description' +p25696 +(dp25697 +S'editable' +p25698 +I01 +sS'value' +p25699 +g47 +sssS'created_at' +p25700 +(dp25701 +S'mandatory' +p25702 +(dp25703 +S'editable' +p25704 +I00 +sS'value' +p25705 +I00 +ssS'name' +p25706 +(dp25707 +S'editable' +p25708 +I01 +sS'value' +p25709 +S'Date Created' +p25710 +ssS'data_type' +p25711 +(dp25712 +S'editable' +p25713 +I00 +sS'value' +p25714 +S'date_time' +p25715 +ssS'entity_type' +p25716 +(dp25717 +S'editable' +p25718 +I00 +sS'value' +p25719 +S'TaskTemplate' +p25720 +ssS'editable' +p25721 +(dp25722 +S'editable' +p25723 +I00 +sS'value' +p25724 +I00 +ssS'unique' +p25725 +(dp25726 +S'editable' +p25727 +I00 +sS'value' +p25728 +I00 +ssS'properties' +p25729 +(dp25730 +S'default_value' +p25731 +(dp25732 +S'editable' +p25733 +I00 +sS'value' +p25734 +NssS'summary_default' +p25735 +(dp25736 +S'editable' +p25737 +I01 +sS'value' +p25738 +S'none' +p25739 +sssS'description' +p25740 +(dp25741 +S'editable' +p25742 +I01 +sS'value' +p25743 +g47 +sssS'updated_at' +p25744 +(dp25745 +S'mandatory' +p25746 +(dp25747 +S'editable' +p25748 +I00 +sS'value' +p25749 +I00 +ssS'name' +p25750 +(dp25751 +S'editable' +p25752 +I01 +sS'value' +p25753 +S'Date Updated' +p25754 +ssS'data_type' +p25755 +(dp25756 +S'editable' +p25757 +I00 +sS'value' +p25758 +S'date_time' +p25759 +ssS'entity_type' +p25760 +(dp25761 +S'editable' +p25762 +I00 +sS'value' +p25763 +S'TaskTemplate' +p25764 +ssS'editable' +p25765 +(dp25766 +S'editable' +p25767 +I00 +sS'value' +p25768 +I00 +ssS'unique' +p25769 +(dp25770 +S'editable' +p25771 +I00 +sS'value' +p25772 +I00 +ssS'properties' +p25773 +(dp25774 +S'default_value' +p25775 +(dp25776 +S'editable' +p25777 +I00 +sS'value' +p25778 +NssS'summary_default' +p25779 +(dp25780 +S'editable' +p25781 +I01 +sS'value' +p25782 +S'none' +p25783 +sssS'description' +p25784 +(dp25785 +S'editable' +p25786 +I01 +sS'value' +p25787 +g47 +sssS'created_by' +p25788 +(dp25789 +S'mandatory' +p25790 +(dp25791 +S'editable' +p25792 +I00 +sS'value' +p25793 +I00 +ssS'name' +p25794 +(dp25795 +S'editable' +p25796 +I01 +sS'value' +p25797 +S'Created by' +p25798 +ssS'data_type' +p25799 +(dp25800 +S'editable' +p25801 +I00 +sS'value' +p25802 +S'entity' +p25803 +ssS'entity_type' +p25804 +(dp25805 +S'editable' +p25806 +I00 +sS'value' +p25807 +S'TaskTemplate' +p25808 +ssS'editable' +p25809 +(dp25810 +S'editable' +p25811 +I00 +sS'value' +p25812 +I00 +ssS'unique' +p25813 +(dp25814 +S'editable' +p25815 +I00 +sS'value' +p25816 +I00 +ssS'properties' +p25817 +(dp25818 +S'default_value' +p25819 +(dp25820 +S'editable' +p25821 +I00 +sS'value' +p25822 +NssS'summary_default' +p25823 +(dp25824 +S'editable' +p25825 +I01 +sS'value' +p25826 +S'none' +p25827 +ssS'valid_types' +p25828 +(dp25829 +S'editable' +p25830 +I01 +sS'value' +p25831 +(lp25832 +S'HumanUser' +p25833 +aS'ApiUser' +p25834 +asssS'description' +p25835 +(dp25836 +S'editable' +p25837 +I01 +sS'value' +p25838 +g47 +sssS'task_count' +p25839 +(dp25840 +S'mandatory' +p25841 +(dp25842 +S'editable' +p25843 +I00 +sS'value' +p25844 +I00 +ssS'name' +p25845 +(dp25846 +S'editable' +p25847 +I01 +sS'value' +p25848 +S'Tasks' +p25849 +ssS'data_type' +p25850 +(dp25851 +S'editable' +p25852 +I00 +sS'value' +p25853 +S'number' +p25854 +ssS'entity_type' +p25855 +(dp25856 +S'editable' +p25857 +I00 +sS'value' +p25858 +S'TaskTemplate' +p25859 +ssS'editable' +p25860 +(dp25861 +S'editable' +p25862 +I00 +sS'value' +p25863 +I00 +ssS'unique' +p25864 +(dp25865 +S'editable' +p25866 +I00 +sS'value' +p25867 +I00 +ssS'properties' +p25868 +(dp25869 +S'default_value' +p25870 +(dp25871 +S'editable' +p25872 +I00 +sS'value' +p25873 +NssS'summary_default' +p25874 +(dp25875 +S'editable' +p25876 +I01 +sS'value' +p25877 +S'none' +p25878 +sssS'description' +p25879 +(dp25880 +S'editable' +p25881 +I01 +sS'value' +p25882 +g47 +sssS'cached_display_name' +p25883 +(dp25884 +S'mandatory' +p25885 +(dp25886 +S'editable' +p25887 +I00 +sS'value' +p25888 +I00 +ssS'name' +p25889 +(dp25890 +S'editable' +p25891 +I01 +sS'value' +p25892 +S'Cached Display Name' +p25893 +ssS'data_type' +p25894 +(dp25895 +S'editable' +p25896 +I00 +sS'value' +p25897 +S'text' +p25898 +ssS'entity_type' +p25899 +(dp25900 +S'editable' +p25901 +I00 +sS'value' +p25902 +S'TaskTemplate' +p25903 +ssS'editable' +p25904 +(dp25905 +S'editable' +p25906 +I00 +sS'value' +p25907 +I01 +ssS'unique' +p25908 +(dp25909 +S'editable' +p25910 +I00 +sS'value' +p25911 +I00 +ssS'properties' +p25912 +(dp25913 +S'default_value' +p25914 +(dp25915 +S'editable' +p25916 +I00 +sS'value' +p25917 +NssS'summary_default' +p25918 +(dp25919 +S'editable' +p25920 +I00 +sS'value' +p25921 +S'none' +p25922 +sssS'description' +p25923 +(dp25924 +S'editable' +p25925 +I01 +sS'value' +p25926 +g47 +sssS'id' +p25927 +(dp25928 +S'mandatory' +p25929 +(dp25930 +S'editable' +p25931 +I00 +sS'value' +p25932 +I00 +ssS'name' +p25933 +(dp25934 +S'editable' +p25935 +I01 +sS'value' +p25936 +S'Id' +p25937 +ssS'data_type' +p25938 +(dp25939 +S'editable' +p25940 +I00 +sS'value' +p25941 +S'number' +p25942 +ssS'entity_type' +p25943 +(dp25944 +S'editable' +p25945 +I00 +sS'value' +p25946 +S'TaskTemplate' +p25947 +ssS'editable' +p25948 +(dp25949 +S'editable' +p25950 +I00 +sS'value' +p25951 +I00 +ssS'unique' +p25952 +(dp25953 +S'editable' +p25954 +I00 +sS'value' +p25955 +I00 +ssS'properties' +p25956 +(dp25957 +S'default_value' +p25958 +(dp25959 +S'editable' +p25960 +I00 +sS'value' +p25961 +NssS'summary_default' +p25962 +(dp25963 +S'editable' +p25964 +I01 +sS'value' +p25965 +S'none' +p25966 +sssS'description' +p25967 +(dp25968 +S'editable' +p25969 +I01 +sS'value' +p25970 +g47 +sssS'updated_by' +p25971 +(dp25972 +S'mandatory' +p25973 +(dp25974 +S'editable' +p25975 +I00 +sS'value' +p25976 +I00 +ssS'name' +p25977 +(dp25978 +S'editable' +p25979 +I01 +sS'value' +p25980 +S'Updated by' +p25981 +ssS'data_type' +p25982 +(dp25983 +S'editable' +p25984 +I00 +sS'value' +p25985 +S'entity' +p25986 +ssS'entity_type' +p25987 +(dp25988 +S'editable' +p25989 +I00 +sS'value' +p25990 +S'TaskTemplate' +p25991 +ssS'editable' +p25992 +(dp25993 +S'editable' +p25994 +I00 +sS'value' +p25995 +I00 +ssS'unique' +p25996 +(dp25997 +S'editable' +p25998 +I00 +sS'value' +p25999 +I00 +ssS'properties' +p26000 +(dp26001 +S'default_value' +p26002 +(dp26003 +S'editable' +p26004 +I00 +sS'value' +p26005 +NssS'summary_default' +p26006 +(dp26007 +S'editable' +p26008 +I01 +sS'value' +p26009 +S'none' +p26010 +ssS'valid_types' +p26011 +(dp26012 +S'editable' +p26013 +I01 +sS'value' +p26014 +(lp26015 +S'HumanUser' +p26016 +aS'ApiUser' +p26017 +asssS'description' +p26018 +(dp26019 +S'editable' +p26020 +I01 +sS'value' +p26021 +g47 +ssssS'RevisionTicketConnection' +p26022 +(dp26023 +S'id' +p26024 +(dp26025 +S'mandatory' +p26026 +(dp26027 +S'editable' +p26028 +I00 +sS'value' +p26029 +I01 +ssS'name' +p26030 +(dp26031 +S'editable' +p26032 +I01 +sS'value' +p26033 +S'Id' +p26034 +ssS'data_type' +p26035 +(dp26036 +S'editable' +p26037 +I00 +sS'value' +p26038 +S'number' +p26039 +ssS'entity_type' +p26040 +(dp26041 +S'editable' +p26042 +I00 +sS'value' +p26043 +S'RevisionTicketConnection' +p26044 +ssS'editable' +p26045 +(dp26046 +S'editable' +p26047 +I00 +sS'value' +p26048 +I00 +ssS'unique' +p26049 +(dp26050 +S'editable' +p26051 +I00 +sS'value' +p26052 +I00 +ssS'properties' +p26053 +(dp26054 +S'default_value' +p26055 +(dp26056 +S'editable' +p26057 +I00 +sS'value' +p26058 +NssS'summary_default' +p26059 +(dp26060 +S'editable' +p26061 +I00 +sS'value' +p26062 +S'none' +p26063 +sssS'description' +p26064 +(dp26065 +S'editable' +p26066 +I01 +sS'value' +p26067 +g47 +sssS'cached_display_name' +p26068 +(dp26069 +S'mandatory' +p26070 +(dp26071 +S'editable' +p26072 +I00 +sS'value' +p26073 +I00 +ssS'name' +p26074 +(dp26075 +S'editable' +p26076 +I01 +sS'value' +p26077 +S'Cached Display Name' +p26078 +ssS'data_type' +p26079 +(dp26080 +S'editable' +p26081 +I00 +sS'value' +p26082 +S'text' +p26083 +ssS'entity_type' +p26084 +(dp26085 +S'editable' +p26086 +I00 +sS'value' +p26087 +S'RevisionTicketConnection' +p26088 +ssS'editable' +p26089 +(dp26090 +S'editable' +p26091 +I00 +sS'value' +p26092 +I01 +ssS'unique' +p26093 +(dp26094 +S'editable' +p26095 +I00 +sS'value' +p26096 +I00 +ssS'properties' +p26097 +(dp26098 +S'default_value' +p26099 +(dp26100 +S'editable' +p26101 +I00 +sS'value' +p26102 +NssS'summary_default' +p26103 +(dp26104 +S'editable' +p26105 +I00 +sS'value' +p26106 +S'none' +p26107 +sssS'description' +p26108 +(dp26109 +S'editable' +p26110 +I01 +sS'value' +p26111 +g47 +sssS'ticket' +p26112 +(dp26113 +S'mandatory' +p26114 +(dp26115 +S'editable' +p26116 +I00 +sS'value' +p26117 +I00 +ssS'name' +p26118 +(dp26119 +S'editable' +p26120 +I01 +sS'value' +p26121 +S'Ticket' +p26122 +ssS'data_type' +p26123 +(dp26124 +S'editable' +p26125 +I00 +sS'value' +p26126 +S'entity' +p26127 +ssS'entity_type' +p26128 +(dp26129 +S'editable' +p26130 +I00 +sS'value' +p26131 +S'RevisionTicketConnection' +p26132 +ssS'editable' +p26133 +(dp26134 +S'editable' +p26135 +I00 +sS'value' +p26136 +I00 +ssS'unique' +p26137 +(dp26138 +S'editable' +p26139 +I00 +sS'value' +p26140 +I00 +ssS'properties' +p26141 +(dp26142 +S'default_value' +p26143 +(dp26144 +S'editable' +p26145 +I00 +sS'value' +p26146 +NssS'summary_default' +p26147 +(dp26148 +S'editable' +p26149 +I00 +sS'value' +p26150 +S'none' +p26151 +ssS'valid_types' +p26152 +(dp26153 +S'editable' +p26154 +I00 +sS'value' +p26155 +(lp26156 +S'Ticket' +p26157 +asssS'description' +p26158 +(dp26159 +S'editable' +p26160 +I01 +sS'value' +p26161 +g47 +sssS'revision' +p26162 +(dp26163 +S'mandatory' +p26164 +(dp26165 +S'editable' +p26166 +I00 +sS'value' +p26167 +I00 +ssS'name' +p26168 +(dp26169 +S'editable' +p26170 +I01 +sS'value' +p26171 +S'Revision' +p26172 +ssS'data_type' +p26173 +(dp26174 +S'editable' +p26175 +I00 +sS'value' +p26176 +S'entity' +p26177 +ssS'entity_type' +p26178 +(dp26179 +S'editable' +p26180 +I00 +sS'value' +p26181 +S'RevisionTicketConnection' +p26182 +ssS'editable' +p26183 +(dp26184 +S'editable' +p26185 +I00 +sS'value' +p26186 +I00 +ssS'unique' +p26187 +(dp26188 +S'editable' +p26189 +I00 +sS'value' +p26190 +I00 +ssS'properties' +p26191 +(dp26192 +S'default_value' +p26193 +(dp26194 +S'editable' +p26195 +I00 +sS'value' +p26196 +NssS'summary_default' +p26197 +(dp26198 +S'editable' +p26199 +I00 +sS'value' +p26200 +S'none' +p26201 +ssS'valid_types' +p26202 +(dp26203 +S'editable' +p26204 +I00 +sS'value' +p26205 +(lp26206 +S'Revision' +p26207 +asssS'description' +p26208 +(dp26209 +S'editable' +p26210 +I01 +sS'value' +p26211 +g47 +ssssS'PerformerShootDayConnection' +p26212 +(dp26213 +S'cached_display_name' +p26214 +(dp26215 +S'mandatory' +p26216 +(dp26217 +S'editable' +p26218 +I00 +sS'value' +p26219 +I00 +ssS'name' +p26220 +(dp26221 +S'editable' +p26222 +I01 +sS'value' +p26223 +S'Cached Display Name' +p26224 +ssS'data_type' +p26225 +(dp26226 +S'editable' +p26227 +I00 +sS'value' +p26228 +S'text' +p26229 +ssS'entity_type' +p26230 +(dp26231 +S'editable' +p26232 +I00 +sS'value' +p26233 +S'PerformerShootDayConnection' +p26234 +ssS'editable' +p26235 +(dp26236 +S'editable' +p26237 +I00 +sS'value' +p26238 +I01 +ssS'unique' +p26239 +(dp26240 +S'editable' +p26241 +I00 +sS'value' +p26242 +I00 +ssS'properties' +p26243 +(dp26244 +S'default_value' +p26245 +(dp26246 +S'editable' +p26247 +I00 +sS'value' +p26248 +NssS'summary_default' +p26249 +(dp26250 +S'editable' +p26251 +I00 +sS'value' +p26252 +S'none' +p26253 +sssS'description' +p26254 +(dp26255 +S'editable' +p26256 +I01 +sS'value' +p26257 +g47 +sssS'performer' +p26258 +(dp26259 +S'mandatory' +p26260 +(dp26261 +S'editable' +p26262 +I00 +sS'value' +p26263 +I00 +ssS'name' +p26264 +(dp26265 +S'editable' +p26266 +I01 +sS'value' +p26267 +S'Performer' +p26268 +ssS'data_type' +p26269 +(dp26270 +S'editable' +p26271 +I00 +sS'value' +p26272 +S'entity' +p26273 +ssS'entity_type' +p26274 +(dp26275 +S'editable' +p26276 +I00 +sS'value' +p26277 +S'PerformerShootDayConnection' +p26278 +ssS'editable' +p26279 +(dp26280 +S'editable' +p26281 +I00 +sS'value' +p26282 +I00 +ssS'unique' +p26283 +(dp26284 +S'editable' +p26285 +I00 +sS'value' +p26286 +I00 +ssS'properties' +p26287 +(dp26288 +S'default_value' +p26289 +(dp26290 +S'editable' +p26291 +I00 +sS'value' +p26292 +NssS'summary_default' +p26293 +(dp26294 +S'editable' +p26295 +I00 +sS'value' +p26296 +S'none' +p26297 +ssS'valid_types' +p26298 +(dp26299 +S'editable' +p26300 +I00 +sS'value' +p26301 +(lp26302 +S'Performer' +p26303 +asssS'description' +p26304 +(dp26305 +S'editable' +p26306 +I01 +sS'value' +p26307 +g47 +sssS'id' +p26308 +(dp26309 +S'mandatory' +p26310 +(dp26311 +S'editable' +p26312 +I00 +sS'value' +p26313 +I01 +ssS'name' +p26314 +(dp26315 +S'editable' +p26316 +I01 +sS'value' +p26317 +S'Id' +p26318 +ssS'data_type' +p26319 +(dp26320 +S'editable' +p26321 +I00 +sS'value' +p26322 +S'number' +p26323 +ssS'entity_type' +p26324 +(dp26325 +S'editable' +p26326 +I00 +sS'value' +p26327 +S'PerformerShootDayConnection' +p26328 +ssS'editable' +p26329 +(dp26330 +S'editable' +p26331 +I00 +sS'value' +p26332 +I00 +ssS'unique' +p26333 +(dp26334 +S'editable' +p26335 +I00 +sS'value' +p26336 +I00 +ssS'properties' +p26337 +(dp26338 +S'default_value' +p26339 +(dp26340 +S'editable' +p26341 +I00 +sS'value' +p26342 +NssS'summary_default' +p26343 +(dp26344 +S'editable' +p26345 +I00 +sS'value' +p26346 +S'none' +p26347 +sssS'description' +p26348 +(dp26349 +S'editable' +p26350 +I01 +sS'value' +p26351 +g47 +sssS'shoot_day' +p26352 +(dp26353 +S'mandatory' +p26354 +(dp26355 +S'editable' +p26356 +I00 +sS'value' +p26357 +I00 +ssS'name' +p26358 +(dp26359 +S'editable' +p26360 +I01 +sS'value' +p26361 +S'Shoot Day' +p26362 +ssS'data_type' +p26363 +(dp26364 +S'editable' +p26365 +I00 +sS'value' +p26366 +S'entity' +p26367 +ssS'entity_type' +p26368 +(dp26369 +S'editable' +p26370 +I00 +sS'value' +p26371 +S'PerformerShootDayConnection' +p26372 +ssS'editable' +p26373 +(dp26374 +S'editable' +p26375 +I00 +sS'value' +p26376 +I00 +ssS'unique' +p26377 +(dp26378 +S'editable' +p26379 +I00 +sS'value' +p26380 +I00 +ssS'properties' +p26381 +(dp26382 +S'default_value' +p26383 +(dp26384 +S'editable' +p26385 +I00 +sS'value' +p26386 +NssS'summary_default' +p26387 +(dp26388 +S'editable' +p26389 +I00 +sS'value' +p26390 +S'none' +p26391 +ssS'valid_types' +p26392 +(dp26393 +S'editable' +p26394 +I00 +sS'value' +p26395 +(lp26396 +S'ShootDay' +p26397 +asssS'description' +p26398 +(dp26399 +S'editable' +p26400 +I01 +sS'value' +p26401 +g47 +ssssS'PipelineConfiguration' +p26402 +(dp26403 +S'code' +p26404 +(dp26405 +S'mandatory' +p26406 +(dp26407 +S'editable' +p26408 +I00 +sS'value' +p26409 +I01 +ssS'name' +p26410 +(dp26411 +S'editable' +p26412 +I01 +sS'value' +p26413 +S'Config Name' +p26414 +ssS'data_type' +p26415 +(dp26416 +S'editable' +p26417 +I00 +sS'value' +p26418 +S'text' +p26419 +ssS'entity_type' +p26420 +(dp26421 +S'editable' +p26422 +I00 +sS'value' +p26423 +S'PipelineConfiguration' +p26424 +ssS'editable' +p26425 +(dp26426 +S'editable' +p26427 +I00 +sS'value' +p26428 +I01 +ssS'unique' +p26429 +(dp26430 +S'editable' +p26431 +I00 +sS'value' +p26432 +I00 +ssS'properties' +p26433 +(dp26434 +S'default_value' +p26435 +(dp26436 +S'editable' +p26437 +I00 +sS'value' +p26438 +NssS'summary_default' +p26439 +(dp26440 +S'editable' +p26441 +I00 +sS'value' +p26442 +S'none' +p26443 +sssS'description' +p26444 +(dp26445 +S'editable' +p26446 +I01 +sS'value' +p26447 +g47 +sssS'users' +p26448 +(dp26449 +S'mandatory' +p26450 +(dp26451 +S'editable' +p26452 +I00 +sS'value' +p26453 +I00 +ssS'name' +p26454 +(dp26455 +S'editable' +p26456 +I01 +sS'value' +p26457 +S'User Restrictions' +p26458 +ssS'data_type' +p26459 +(dp26460 +S'editable' +p26461 +I00 +sS'value' +p26462 +S'multi_entity' +p26463 +ssS'entity_type' +p26464 +(dp26465 +S'editable' +p26466 +I00 +sS'value' +p26467 +S'PipelineConfiguration' +p26468 +ssS'editable' +p26469 +(dp26470 +S'editable' +p26471 +I00 +sS'value' +p26472 +I01 +ssS'unique' +p26473 +(dp26474 +S'editable' +p26475 +I00 +sS'value' +p26476 +I00 +ssS'properties' +p26477 +(dp26478 +S'default_value' +p26479 +(dp26480 +S'editable' +p26481 +I00 +sS'value' +p26482 +NssS'summary_default' +p26483 +(dp26484 +S'editable' +p26485 +I00 +sS'value' +p26486 +S'none' +p26487 +ssS'valid_types' +p26488 +(dp26489 +S'editable' +p26490 +I00 +sS'value' +p26491 +(lp26492 +S'HumanUser' +p26493 +asssS'description' +p26494 +(dp26495 +S'editable' +p26496 +I01 +sS'value' +p26497 +g47 +sssS'mac_path' +p26498 +(dp26499 +S'mandatory' +p26500 +(dp26501 +S'editable' +p26502 +I00 +sS'value' +p26503 +I00 +ssS'name' +p26504 +(dp26505 +S'editable' +p26506 +I01 +sS'value' +p26507 +S'Mac Path' +p26508 +ssS'data_type' +p26509 +(dp26510 +S'editable' +p26511 +I00 +sS'value' +p26512 +S'text' +p26513 +ssS'entity_type' +p26514 +(dp26515 +S'editable' +p26516 +I00 +sS'value' +p26517 +S'PipelineConfiguration' +p26518 +ssS'editable' +p26519 +(dp26520 +S'editable' +p26521 +I00 +sS'value' +p26522 +I01 +ssS'unique' +p26523 +(dp26524 +S'editable' +p26525 +I00 +sS'value' +p26526 +I00 +ssS'properties' +p26527 +(dp26528 +S'default_value' +p26529 +(dp26530 +S'editable' +p26531 +I00 +sS'value' +p26532 +NssS'summary_default' +p26533 +(dp26534 +S'editable' +p26535 +I00 +sS'value' +p26536 +S'none' +p26537 +sssS'description' +p26538 +(dp26539 +S'editable' +p26540 +I01 +sS'value' +p26541 +g47 +sssS'created_at' +p26542 +(dp26543 +S'mandatory' +p26544 +(dp26545 +S'editable' +p26546 +I00 +sS'value' +p26547 +I00 +ssS'name' +p26548 +(dp26549 +S'editable' +p26550 +I01 +sS'value' +p26551 +S'Date Created' +p26552 +ssS'data_type' +p26553 +(dp26554 +S'editable' +p26555 +I00 +sS'value' +p26556 +S'date_time' +p26557 +ssS'entity_type' +p26558 +(dp26559 +S'editable' +p26560 +I00 +sS'value' +p26561 +S'PipelineConfiguration' +p26562 +ssS'editable' +p26563 +(dp26564 +S'editable' +p26565 +I00 +sS'value' +p26566 +I00 +ssS'unique' +p26567 +(dp26568 +S'editable' +p26569 +I00 +sS'value' +p26570 +I00 +ssS'properties' +p26571 +(dp26572 +S'default_value' +p26573 +(dp26574 +S'editable' +p26575 +I00 +sS'value' +p26576 +NssS'summary_default' +p26577 +(dp26578 +S'editable' +p26579 +I01 +sS'value' +p26580 +S'none' +p26581 +sssS'description' +p26582 +(dp26583 +S'editable' +p26584 +I01 +sS'value' +p26585 +g47 +sssS'updated_at' +p26586 +(dp26587 +S'mandatory' +p26588 +(dp26589 +S'editable' +p26590 +I00 +sS'value' +p26591 +I00 +ssS'name' +p26592 +(dp26593 +S'editable' +p26594 +I01 +sS'value' +p26595 +S'Date Updated' +p26596 +ssS'data_type' +p26597 +(dp26598 +S'editable' +p26599 +I00 +sS'value' +p26600 +S'date_time' +p26601 +ssS'entity_type' +p26602 +(dp26603 +S'editable' +p26604 +I00 +sS'value' +p26605 +S'PipelineConfiguration' +p26606 +ssS'editable' +p26607 +(dp26608 +S'editable' +p26609 +I00 +sS'value' +p26610 +I00 +ssS'unique' +p26611 +(dp26612 +S'editable' +p26613 +I00 +sS'value' +p26614 +I00 +ssS'properties' +p26615 +(dp26616 +S'default_value' +p26617 +(dp26618 +S'editable' +p26619 +I00 +sS'value' +p26620 +NssS'summary_default' +p26621 +(dp26622 +S'editable' +p26623 +I01 +sS'value' +p26624 +S'none' +p26625 +sssS'description' +p26626 +(dp26627 +S'editable' +p26628 +I01 +sS'value' +p26629 +g47 +sssS'created_by' +p26630 +(dp26631 +S'mandatory' +p26632 +(dp26633 +S'editable' +p26634 +I00 +sS'value' +p26635 +I00 +ssS'name' +p26636 +(dp26637 +S'editable' +p26638 +I01 +sS'value' +p26639 +S'Created by' +p26640 +ssS'data_type' +p26641 +(dp26642 +S'editable' +p26643 +I00 +sS'value' +p26644 +S'entity' +p26645 +ssS'entity_type' +p26646 +(dp26647 +S'editable' +p26648 +I00 +sS'value' +p26649 +S'PipelineConfiguration' +p26650 +ssS'editable' +p26651 +(dp26652 +S'editable' +p26653 +I00 +sS'value' +p26654 +I00 +ssS'unique' +p26655 +(dp26656 +S'editable' +p26657 +I00 +sS'value' +p26658 +I00 +ssS'properties' +p26659 +(dp26660 +S'default_value' +p26661 +(dp26662 +S'editable' +p26663 +I00 +sS'value' +p26664 +NssS'summary_default' +p26665 +(dp26666 +S'editable' +p26667 +I01 +sS'value' +p26668 +S'none' +p26669 +ssS'valid_types' +p26670 +(dp26671 +S'editable' +p26672 +I01 +sS'value' +p26673 +(lp26674 +S'HumanUser' +p26675 +aS'ApiUser' +p26676 +asssS'description' +p26677 +(dp26678 +S'editable' +p26679 +I01 +sS'value' +p26680 +g47 +sssS'project' +p26681 +(dp26682 +S'mandatory' +p26683 +(dp26684 +S'editable' +p26685 +I00 +sS'value' +p26686 +I00 +ssS'name' +p26687 +(dp26688 +S'editable' +p26689 +I01 +sS'value' +p26690 +S'Project' +p26691 +ssS'data_type' +p26692 +(dp26693 +S'editable' +p26694 +I00 +sS'value' +p26695 +S'entity' +p26696 +ssS'entity_type' +p26697 +(dp26698 +S'editable' +p26699 +I00 +sS'value' +p26700 +S'PipelineConfiguration' +p26701 +ssS'editable' +p26702 +(dp26703 +S'editable' +p26704 +I00 +sS'value' +p26705 +I01 +ssS'unique' +p26706 +(dp26707 +S'editable' +p26708 +I00 +sS'value' +p26709 +I00 +ssS'properties' +p26710 +(dp26711 +S'default_value' +p26712 +(dp26713 +S'editable' +p26714 +I00 +sS'value' +p26715 +NssS'summary_default' +p26716 +(dp26717 +S'editable' +p26718 +I00 +sS'value' +p26719 +S'none' +p26720 +ssS'valid_types' +p26721 +(dp26722 +S'editable' +p26723 +I00 +sS'value' +p26724 +(lp26725 +S'Project' +p26726 +asssS'description' +p26727 +(dp26728 +S'editable' +p26729 +I01 +sS'value' +p26730 +g47 +sssS'windows_path' +p26731 +(dp26732 +S'mandatory' +p26733 +(dp26734 +S'editable' +p26735 +I00 +sS'value' +p26736 +I00 +ssS'name' +p26737 +(dp26738 +S'editable' +p26739 +I01 +sS'value' +p26740 +S'Windows Path' +p26741 +ssS'data_type' +p26742 +(dp26743 +S'editable' +p26744 +I00 +sS'value' +p26745 +S'text' +p26746 +ssS'entity_type' +p26747 +(dp26748 +S'editable' +p26749 +I00 +sS'value' +p26750 +S'PipelineConfiguration' +p26751 +ssS'editable' +p26752 +(dp26753 +S'editable' +p26754 +I00 +sS'value' +p26755 +I01 +ssS'unique' +p26756 +(dp26757 +S'editable' +p26758 +I00 +sS'value' +p26759 +I00 +ssS'properties' +p26760 +(dp26761 +S'default_value' +p26762 +(dp26763 +S'editable' +p26764 +I00 +sS'value' +p26765 +NssS'summary_default' +p26766 +(dp26767 +S'editable' +p26768 +I00 +sS'value' +p26769 +S'none' +p26770 +sssS'description' +p26771 +(dp26772 +S'editable' +p26773 +I01 +sS'value' +p26774 +g47 +sssS'image' +p26775 +(dp26776 +S'mandatory' +p26777 +(dp26778 +S'editable' +p26779 +I00 +sS'value' +p26780 +I00 +ssS'name' +p26781 +(dp26782 +S'editable' +p26783 +I01 +sS'value' +p26784 +S'Thumbnail' +p26785 +ssS'data_type' +p26786 +(dp26787 +S'editable' +p26788 +I00 +sS'value' +p26789 +S'image' +p26790 +ssS'entity_type' +p26791 +(dp26792 +S'editable' +p26793 +I00 +sS'value' +p26794 +S'PipelineConfiguration' +p26795 +ssS'editable' +p26796 +(dp26797 +S'editable' +p26798 +I00 +sS'value' +p26799 +I01 +ssS'unique' +p26800 +(dp26801 +S'editable' +p26802 +I00 +sS'value' +p26803 +I00 +ssS'properties' +p26804 +(dp26805 +S'default_value' +p26806 +(dp26807 +S'editable' +p26808 +I00 +sS'value' +p26809 +NssS'summary_default' +p26810 +(dp26811 +S'editable' +p26812 +I01 +sS'value' +p26813 +S'none' +p26814 +sssS'description' +p26815 +(dp26816 +S'editable' +p26817 +I01 +sS'value' +p26818 +g47 +sssS'updated_by' +p26819 +(dp26820 +S'mandatory' +p26821 +(dp26822 +S'editable' +p26823 +I00 +sS'value' +p26824 +I00 +ssS'name' +p26825 +(dp26826 +S'editable' +p26827 +I01 +sS'value' +p26828 +S'Updated by' +p26829 +ssS'data_type' +p26830 +(dp26831 +S'editable' +p26832 +I00 +sS'value' +p26833 +S'entity' +p26834 +ssS'entity_type' +p26835 +(dp26836 +S'editable' +p26837 +I00 +sS'value' +p26838 +S'PipelineConfiguration' +p26839 +ssS'editable' +p26840 +(dp26841 +S'editable' +p26842 +I00 +sS'value' +p26843 +I00 +ssS'unique' +p26844 +(dp26845 +S'editable' +p26846 +I00 +sS'value' +p26847 +I00 +ssS'properties' +p26848 +(dp26849 +S'default_value' +p26850 +(dp26851 +S'editable' +p26852 +I00 +sS'value' +p26853 +NssS'summary_default' +p26854 +(dp26855 +S'editable' +p26856 +I01 +sS'value' +p26857 +S'none' +p26858 +ssS'valid_types' +p26859 +(dp26860 +S'editable' +p26861 +I01 +sS'value' +p26862 +(lp26863 +S'HumanUser' +p26864 +aS'ApiUser' +p26865 +asssS'description' +p26866 +(dp26867 +S'editable' +p26868 +I01 +sS'value' +p26869 +g47 +sssS'cached_display_name' +p26870 +(dp26871 +S'mandatory' +p26872 +(dp26873 +S'editable' +p26874 +I00 +sS'value' +p26875 +I00 +ssS'name' +p26876 +(dp26877 +S'editable' +p26878 +I01 +sS'value' +p26879 +S'Cached Display Name' +p26880 +ssS'data_type' +p26881 +(dp26882 +S'editable' +p26883 +I00 +sS'value' +p26884 +S'text' +p26885 +ssS'entity_type' +p26886 +(dp26887 +S'editable' +p26888 +I00 +sS'value' +p26889 +S'PipelineConfiguration' +p26890 +ssS'editable' +p26891 +(dp26892 +S'editable' +p26893 +I00 +sS'value' +p26894 +I01 +ssS'unique' +p26895 +(dp26896 +S'editable' +p26897 +I00 +sS'value' +p26898 +I00 +ssS'properties' +p26899 +(dp26900 +S'default_value' +p26901 +(dp26902 +S'editable' +p26903 +I00 +sS'value' +p26904 +NssS'summary_default' +p26905 +(dp26906 +S'editable' +p26907 +I00 +sS'value' +p26908 +S'none' +p26909 +sssS'description' +p26910 +(dp26911 +S'editable' +p26912 +I01 +sS'value' +p26913 +g47 +sssS'tag_list' +p26914 +(dp26915 +S'mandatory' +p26916 +(dp26917 +S'editable' +p26918 +I00 +sS'value' +p26919 +I00 +ssS'name' +p26920 +(dp26921 +S'editable' +p26922 +I01 +sS'value' +p26923 +S'Tags' +p26924 +ssS'data_type' +p26925 +(dp26926 +S'editable' +p26927 +I00 +sS'value' +p26928 +S'tag_list' +p26929 +ssS'entity_type' +p26930 +(dp26931 +S'editable' +p26932 +I00 +sS'value' +p26933 +S'PipelineConfiguration' +p26934 +ssS'editable' +p26935 +(dp26936 +S'editable' +p26937 +I00 +sS'value' +p26938 +I01 +ssS'unique' +p26939 +(dp26940 +S'editable' +p26941 +I00 +sS'value' +p26942 +I00 +ssS'properties' +p26943 +(dp26944 +S'default_value' +p26945 +(dp26946 +S'editable' +p26947 +I00 +sS'value' +p26948 +NssS'summary_default' +p26949 +(dp26950 +S'editable' +p26951 +I01 +sS'value' +p26952 +S'none' +p26953 +ssS'valid_types' +p26954 +(dp26955 +S'editable' +p26956 +I01 +sS'value' +p26957 +(lp26958 +S'Tag' +p26959 +asssS'description' +p26960 +(dp26961 +S'editable' +p26962 +I01 +sS'value' +p26963 +g47 +sssS'id' +p26964 +(dp26965 +S'mandatory' +p26966 +(dp26967 +S'editable' +p26968 +I00 +sS'value' +p26969 +I00 +ssS'name' +p26970 +(dp26971 +S'editable' +p26972 +I01 +sS'value' +p26973 +S'Id' +p26974 +ssS'data_type' +p26975 +(dp26976 +S'editable' +p26977 +I00 +sS'value' +p26978 +S'number' +p26979 +ssS'entity_type' +p26980 +(dp26981 +S'editable' +p26982 +I00 +sS'value' +p26983 +S'PipelineConfiguration' +p26984 +ssS'editable' +p26985 +(dp26986 +S'editable' +p26987 +I00 +sS'value' +p26988 +I00 +ssS'unique' +p26989 +(dp26990 +S'editable' +p26991 +I00 +sS'value' +p26992 +I00 +ssS'properties' +p26993 +(dp26994 +S'default_value' +p26995 +(dp26996 +S'editable' +p26997 +I00 +sS'value' +p26998 +NssS'summary_default' +p26999 +(dp27000 +S'editable' +p27001 +I01 +sS'value' +p27002 +S'none' +p27003 +sssS'description' +p27004 +(dp27005 +S'editable' +p27006 +I01 +sS'value' +p27007 +g47 +sssS'linux_path' +p27008 +(dp27009 +S'mandatory' +p27010 +(dp27011 +S'editable' +p27012 +I00 +sS'value' +p27013 +I00 +ssS'name' +p27014 +(dp27015 +S'editable' +p27016 +I01 +sS'value' +p27017 +S'Linux Path' +p27018 +ssS'data_type' +p27019 +(dp27020 +S'editable' +p27021 +I00 +sS'value' +p27022 +S'text' +p27023 +ssS'entity_type' +p27024 +(dp27025 +S'editable' +p27026 +I00 +sS'value' +p27027 +S'PipelineConfiguration' +p27028 +ssS'editable' +p27029 +(dp27030 +S'editable' +p27031 +I00 +sS'value' +p27032 +I01 +ssS'unique' +p27033 +(dp27034 +S'editable' +p27035 +I00 +sS'value' +p27036 +I00 +ssS'properties' +p27037 +(dp27038 +S'default_value' +p27039 +(dp27040 +S'editable' +p27041 +I00 +sS'value' +p27042 +NssS'summary_default' +p27043 +(dp27044 +S'editable' +p27045 +I00 +sS'value' +p27046 +S'none' +p27047 +sssS'description' +p27048 +(dp27049 +S'editable' +p27050 +I01 +sS'value' +p27051 +g47 +sssS'description' +p27052 +(dp27053 +S'mandatory' +p27054 +(dp27055 +S'editable' +p27056 +I00 +sS'value' +p27057 +I00 +ssS'name' +p27058 +(dp27059 +S'editable' +p27060 +I01 +sS'value' +p27061 +S'Description' +p27062 +ssS'data_type' +p27063 +(dp27064 +S'editable' +p27065 +I00 +sS'value' +p27066 +S'text' +p27067 +ssS'entity_type' +p27068 +(dp27069 +S'editable' +p27070 +I00 +sS'value' +p27071 +S'PipelineConfiguration' +p27072 +ssS'editable' +p27073 +(dp27074 +S'editable' +p27075 +I00 +sS'value' +p27076 +I01 +ssS'unique' +p27077 +(dp27078 +S'editable' +p27079 +I00 +sS'value' +p27080 +I00 +ssS'properties' +p27081 +(dp27082 +S'default_value' +p27083 +(dp27084 +S'editable' +p27085 +I00 +sS'value' +p27086 +NssS'summary_default' +p27087 +(dp27088 +S'editable' +p27089 +I00 +sS'value' +p27090 +S'none' +p27091 +sssS'description' +p27092 +(dp27093 +S'editable' +p27094 +I01 +sS'value' +p27095 +g47 +ssssS'LaunchSceneConnection' +p27096 +(dp27097 +S'id' +p27098 +(dp27099 +S'mandatory' +p27100 +(dp27101 +S'editable' +p27102 +I00 +sS'value' +p27103 +I01 +ssS'name' +p27104 +(dp27105 +S'editable' +p27106 +I01 +sS'value' +p27107 +S'Id' +p27108 +ssS'data_type' +p27109 +(dp27110 +S'editable' +p27111 +I00 +sS'value' +p27112 +S'number' +p27113 +ssS'entity_type' +p27114 +(dp27115 +S'editable' +p27116 +I00 +sS'value' +p27117 +S'LaunchSceneConnection' +p27118 +ssS'editable' +p27119 +(dp27120 +S'editable' +p27121 +I00 +sS'value' +p27122 +I00 +ssS'unique' +p27123 +(dp27124 +S'editable' +p27125 +I00 +sS'value' +p27126 +I00 +ssS'properties' +p27127 +(dp27128 +S'default_value' +p27129 +(dp27130 +S'editable' +p27131 +I00 +sS'value' +p27132 +NssS'summary_default' +p27133 +(dp27134 +S'editable' +p27135 +I00 +sS'value' +p27136 +S'none' +p27137 +sssS'description' +p27138 +(dp27139 +S'editable' +p27140 +I01 +sS'value' +p27141 +g47 +sssS'cached_display_name' +p27142 +(dp27143 +S'mandatory' +p27144 +(dp27145 +S'editable' +p27146 +I00 +sS'value' +p27147 +I00 +ssS'name' +p27148 +(dp27149 +S'editable' +p27150 +I01 +sS'value' +p27151 +S'Cached Display Name' +p27152 +ssS'data_type' +p27153 +(dp27154 +S'editable' +p27155 +I00 +sS'value' +p27156 +S'text' +p27157 +ssS'entity_type' +p27158 +(dp27159 +S'editable' +p27160 +I00 +sS'value' +p27161 +S'LaunchSceneConnection' +p27162 +ssS'editable' +p27163 +(dp27164 +S'editable' +p27165 +I00 +sS'value' +p27166 +I01 +ssS'unique' +p27167 +(dp27168 +S'editable' +p27169 +I00 +sS'value' +p27170 +I00 +ssS'properties' +p27171 +(dp27172 +S'default_value' +p27173 +(dp27174 +S'editable' +p27175 +I00 +sS'value' +p27176 +NssS'summary_default' +p27177 +(dp27178 +S'editable' +p27179 +I00 +sS'value' +p27180 +S'none' +p27181 +sssS'description' +p27182 +(dp27183 +S'editable' +p27184 +I01 +sS'value' +p27185 +g47 +sssS'scene' +p27186 +(dp27187 +S'mandatory' +p27188 +(dp27189 +S'editable' +p27190 +I00 +sS'value' +p27191 +I00 +ssS'name' +p27192 +(dp27193 +S'editable' +p27194 +I01 +sS'value' +p27195 +S'Scene' +p27196 +ssS'data_type' +p27197 +(dp27198 +S'editable' +p27199 +I00 +sS'value' +p27200 +S'entity' +p27201 +ssS'entity_type' +p27202 +(dp27203 +S'editable' +p27204 +I00 +sS'value' +p27205 +S'LaunchSceneConnection' +p27206 +ssS'editable' +p27207 +(dp27208 +S'editable' +p27209 +I00 +sS'value' +p27210 +I00 +ssS'unique' +p27211 +(dp27212 +S'editable' +p27213 +I00 +sS'value' +p27214 +I00 +ssS'properties' +p27215 +(dp27216 +S'default_value' +p27217 +(dp27218 +S'editable' +p27219 +I00 +sS'value' +p27220 +NssS'summary_default' +p27221 +(dp27222 +S'editable' +p27223 +I00 +sS'value' +p27224 +S'none' +p27225 +ssS'valid_types' +p27226 +(dp27227 +S'editable' +p27228 +I00 +sS'value' +p27229 +(lp27230 +S'Scene' +p27231 +asssS'description' +p27232 +(dp27233 +S'editable' +p27234 +I01 +sS'value' +p27235 +g47 +sssS'launch' +p27236 +(dp27237 +S'mandatory' +p27238 +(dp27239 +S'editable' +p27240 +I00 +sS'value' +p27241 +I00 +ssS'name' +p27242 +(dp27243 +S'editable' +p27244 +I01 +sS'value' +p27245 +S'Launch' +p27246 +ssS'data_type' +p27247 +(dp27248 +S'editable' +p27249 +I00 +sS'value' +p27250 +S'entity' +p27251 +ssS'entity_type' +p27252 +(dp27253 +S'editable' +p27254 +I00 +sS'value' +p27255 +S'LaunchSceneConnection' +p27256 +ssS'editable' +p27257 +(dp27258 +S'editable' +p27259 +I00 +sS'value' +p27260 +I00 +ssS'unique' +p27261 +(dp27262 +S'editable' +p27263 +I00 +sS'value' +p27264 +I00 +ssS'properties' +p27265 +(dp27266 +S'default_value' +p27267 +(dp27268 +S'editable' +p27269 +I00 +sS'value' +p27270 +NssS'summary_default' +p27271 +(dp27272 +S'editable' +p27273 +I00 +sS'value' +p27274 +S'none' +p27275 +ssS'valid_types' +p27276 +(dp27277 +S'editable' +p27278 +I00 +sS'value' +p27279 +(lp27280 +S'Launch' +p27281 +asssS'description' +p27282 +(dp27283 +S'editable' +p27284 +I01 +sS'value' +p27285 +g47 +ssssS'GroupUserConnection' +p27286 +(dp27287 +S'cached_display_name' +p27288 +(dp27289 +S'mandatory' +p27290 +(dp27291 +S'editable' +p27292 +I00 +sS'value' +p27293 +I00 +ssS'name' +p27294 +(dp27295 +S'editable' +p27296 +I01 +sS'value' +p27297 +S'Cached Display Name' +p27298 +ssS'data_type' +p27299 +(dp27300 +S'editable' +p27301 +I00 +sS'value' +p27302 +S'text' +p27303 +ssS'entity_type' +p27304 +(dp27305 +S'editable' +p27306 +I00 +sS'value' +p27307 +S'GroupUserConnection' +p27308 +ssS'editable' +p27309 +(dp27310 +S'editable' +p27311 +I00 +sS'value' +p27312 +I01 +ssS'unique' +p27313 +(dp27314 +S'editable' +p27315 +I00 +sS'value' +p27316 +I00 +ssS'properties' +p27317 +(dp27318 +S'default_value' +p27319 +(dp27320 +S'editable' +p27321 +I00 +sS'value' +p27322 +NssS'summary_default' +p27323 +(dp27324 +S'editable' +p27325 +I00 +sS'value' +p27326 +S'none' +p27327 +sssS'description' +p27328 +(dp27329 +S'editable' +p27330 +I01 +sS'value' +p27331 +g47 +sssS'group' +p27332 +(dp27333 +S'mandatory' +p27334 +(dp27335 +S'editable' +p27336 +I00 +sS'value' +p27337 +I00 +ssS'name' +p27338 +(dp27339 +S'editable' +p27340 +I01 +sS'value' +p27341 +S'Group' +p27342 +ssS'data_type' +p27343 +(dp27344 +S'editable' +p27345 +I00 +sS'value' +p27346 +S'entity' +p27347 +ssS'entity_type' +p27348 +(dp27349 +S'editable' +p27350 +I00 +sS'value' +p27351 +S'GroupUserConnection' +p27352 +ssS'editable' +p27353 +(dp27354 +S'editable' +p27355 +I00 +sS'value' +p27356 +I00 +ssS'unique' +p27357 +(dp27358 +S'editable' +p27359 +I00 +sS'value' +p27360 +I00 +ssS'properties' +p27361 +(dp27362 +S'default_value' +p27363 +(dp27364 +S'editable' +p27365 +I00 +sS'value' +p27366 +NssS'summary_default' +p27367 +(dp27368 +S'editable' +p27369 +I00 +sS'value' +p27370 +S'none' +p27371 +ssS'valid_types' +p27372 +(dp27373 +S'editable' +p27374 +I00 +sS'value' +p27375 +(lp27376 +S'Group' +p27377 +asssS'description' +p27378 +(dp27379 +S'editable' +p27380 +I01 +sS'value' +p27381 +g47 +sssS'id' +p27382 +(dp27383 +S'mandatory' +p27384 +(dp27385 +S'editable' +p27386 +I00 +sS'value' +p27387 +I01 +ssS'name' +p27388 +(dp27389 +S'editable' +p27390 +I01 +sS'value' +p27391 +S'Id' +p27392 +ssS'data_type' +p27393 +(dp27394 +S'editable' +p27395 +I00 +sS'value' +p27396 +S'number' +p27397 +ssS'entity_type' +p27398 +(dp27399 +S'editable' +p27400 +I00 +sS'value' +p27401 +S'GroupUserConnection' +p27402 +ssS'editable' +p27403 +(dp27404 +S'editable' +p27405 +I00 +sS'value' +p27406 +I00 +ssS'unique' +p27407 +(dp27408 +S'editable' +p27409 +I00 +sS'value' +p27410 +I00 +ssS'properties' +p27411 +(dp27412 +S'default_value' +p27413 +(dp27414 +S'editable' +p27415 +I00 +sS'value' +p27416 +NssS'summary_default' +p27417 +(dp27418 +S'editable' +p27419 +I00 +sS'value' +p27420 +S'none' +p27421 +sssS'description' +p27422 +(dp27423 +S'editable' +p27424 +I01 +sS'value' +p27425 +g47 +sssS'user' +p27426 +(dp27427 +S'mandatory' +p27428 +(dp27429 +S'editable' +p27430 +I00 +sS'value' +p27431 +I00 +ssS'name' +p27432 +(dp27433 +S'editable' +p27434 +I01 +sS'value' +p27435 +S'Person' +p27436 +ssS'data_type' +p27437 +(dp27438 +S'editable' +p27439 +I00 +sS'value' +p27440 +S'entity' +p27441 +ssS'entity_type' +p27442 +(dp27443 +S'editable' +p27444 +I00 +sS'value' +p27445 +S'GroupUserConnection' +p27446 +ssS'editable' +p27447 +(dp27448 +S'editable' +p27449 +I00 +sS'value' +p27450 +I00 +ssS'unique' +p27451 +(dp27452 +S'editable' +p27453 +I00 +sS'value' +p27454 +I00 +ssS'properties' +p27455 +(dp27456 +S'default_value' +p27457 +(dp27458 +S'editable' +p27459 +I00 +sS'value' +p27460 +NssS'summary_default' +p27461 +(dp27462 +S'editable' +p27463 +I00 +sS'value' +p27464 +S'none' +p27465 +ssS'valid_types' +p27466 +(dp27467 +S'editable' +p27468 +I00 +sS'value' +p27469 +(lp27470 +S'HumanUser' +p27471 +asssS'description' +p27472 +(dp27473 +S'editable' +p27474 +I01 +sS'value' +p27475 +g47 +ssssS'AssetSequenceConnection' +p27476 +(dp27477 +S'id' +p27478 +(dp27479 +S'mandatory' +p27480 +(dp27481 +S'editable' +p27482 +I00 +sS'value' +p27483 +I01 +ssS'name' +p27484 +(dp27485 +S'editable' +p27486 +I01 +sS'value' +p27487 +S'Id' +p27488 +ssS'data_type' +p27489 +(dp27490 +S'editable' +p27491 +I00 +sS'value' +p27492 +S'number' +p27493 +ssS'entity_type' +p27494 +(dp27495 +S'editable' +p27496 +I00 +sS'value' +p27497 +S'AssetSequenceConnection' +p27498 +ssS'editable' +p27499 +(dp27500 +S'editable' +p27501 +I00 +sS'value' +p27502 +I00 +ssS'unique' +p27503 +(dp27504 +S'editable' +p27505 +I00 +sS'value' +p27506 +I00 +ssS'properties' +p27507 +(dp27508 +S'default_value' +p27509 +(dp27510 +S'editable' +p27511 +I00 +sS'value' +p27512 +NssS'summary_default' +p27513 +(dp27514 +S'editable' +p27515 +I00 +sS'value' +p27516 +S'none' +p27517 +sssS'description' +p27518 +(dp27519 +S'editable' +p27520 +I01 +sS'value' +p27521 +g47 +sssS'cached_display_name' +p27522 +(dp27523 +S'mandatory' +p27524 +(dp27525 +S'editable' +p27526 +I00 +sS'value' +p27527 +I00 +ssS'name' +p27528 +(dp27529 +S'editable' +p27530 +I01 +sS'value' +p27531 +S'Cached Display Name' +p27532 +ssS'data_type' +p27533 +(dp27534 +S'editable' +p27535 +I00 +sS'value' +p27536 +S'text' +p27537 +ssS'entity_type' +p27538 +(dp27539 +S'editable' +p27540 +I00 +sS'value' +p27541 +S'AssetSequenceConnection' +p27542 +ssS'editable' +p27543 +(dp27544 +S'editable' +p27545 +I00 +sS'value' +p27546 +I01 +ssS'unique' +p27547 +(dp27548 +S'editable' +p27549 +I00 +sS'value' +p27550 +I00 +ssS'properties' +p27551 +(dp27552 +S'default_value' +p27553 +(dp27554 +S'editable' +p27555 +I00 +sS'value' +p27556 +NssS'summary_default' +p27557 +(dp27558 +S'editable' +p27559 +I00 +sS'value' +p27560 +S'none' +p27561 +sssS'description' +p27562 +(dp27563 +S'editable' +p27564 +I01 +sS'value' +p27565 +g47 +sssS'asset' +p27566 +(dp27567 +S'mandatory' +p27568 +(dp27569 +S'editable' +p27570 +I00 +sS'value' +p27571 +I00 +ssS'name' +p27572 +(dp27573 +S'editable' +p27574 +I01 +sS'value' +p27575 +S'Asset' +p27576 +ssS'data_type' +p27577 +(dp27578 +S'editable' +p27579 +I00 +sS'value' +p27580 +S'entity' +p27581 +ssS'entity_type' +p27582 +(dp27583 +S'editable' +p27584 +I00 +sS'value' +p27585 +S'AssetSequenceConnection' +p27586 +ssS'editable' +p27587 +(dp27588 +S'editable' +p27589 +I00 +sS'value' +p27590 +I00 +ssS'unique' +p27591 +(dp27592 +S'editable' +p27593 +I00 +sS'value' +p27594 +I00 +ssS'properties' +p27595 +(dp27596 +S'default_value' +p27597 +(dp27598 +S'editable' +p27599 +I00 +sS'value' +p27600 +NssS'summary_default' +p27601 +(dp27602 +S'editable' +p27603 +I00 +sS'value' +p27604 +S'none' +p27605 +ssS'valid_types' +p27606 +(dp27607 +S'editable' +p27608 +I00 +sS'value' +p27609 +(lp27610 +S'Asset' +p27611 +asssS'description' +p27612 +(dp27613 +S'editable' +p27614 +I01 +sS'value' +p27615 +g47 +sssS'sequence' +p27616 +(dp27617 +S'mandatory' +p27618 +(dp27619 +S'editable' +p27620 +I00 +sS'value' +p27621 +I00 +ssS'name' +p27622 +(dp27623 +S'editable' +p27624 +I01 +sS'value' +p27625 +S'Sequence' +p27626 +ssS'data_type' +p27627 +(dp27628 +S'editable' +p27629 +I00 +sS'value' +p27630 +S'entity' +p27631 +ssS'entity_type' +p27632 +(dp27633 +S'editable' +p27634 +I00 +sS'value' +p27635 +S'AssetSequenceConnection' +p27636 +ssS'editable' +p27637 +(dp27638 +S'editable' +p27639 +I00 +sS'value' +p27640 +I00 +ssS'unique' +p27641 +(dp27642 +S'editable' +p27643 +I00 +sS'value' +p27644 +I00 +ssS'properties' +p27645 +(dp27646 +S'default_value' +p27647 +(dp27648 +S'editable' +p27649 +I00 +sS'value' +p27650 +NssS'summary_default' +p27651 +(dp27652 +S'editable' +p27653 +I00 +sS'value' +p27654 +S'none' +p27655 +ssS'valid_types' +p27656 +(dp27657 +S'editable' +p27658 +I00 +sS'value' +p27659 +(lp27660 +S'Sequence' +p27661 +asssS'description' +p27662 +(dp27663 +S'editable' +p27664 +I01 +sS'value' +p27665 +g47 +ssssS'Page' +p27666 +(dp27667 +S'updated_at' +p27668 +(dp27669 +S'mandatory' +p27670 +(dp27671 +S'editable' +p27672 +I00 +sS'value' +p27673 +I00 +ssS'name' +p27674 +(dp27675 +S'editable' +p27676 +I01 +sS'value' +p27677 +S'Date Updated' +p27678 +ssS'data_type' +p27679 +(dp27680 +S'editable' +p27681 +I00 +sS'value' +p27682 +S'date_time' +p27683 +ssS'entity_type' +p27684 +(dp27685 +S'editable' +p27686 +I00 +sS'value' +p27687 +S'Page' +p27688 +ssS'editable' +p27689 +(dp27690 +S'editable' +p27691 +I00 +sS'value' +p27692 +I00 +ssS'unique' +p27693 +(dp27694 +S'editable' +p27695 +I00 +sS'value' +p27696 +I00 +ssS'properties' +p27697 +(dp27698 +S'default_value' +p27699 +(dp27700 +S'editable' +p27701 +I00 +sS'value' +p27702 +NssS'summary_default' +p27703 +(dp27704 +S'editable' +p27705 +I00 +sS'value' +p27706 +S'none' +p27707 +sssS'description' +p27708 +(dp27709 +S'editable' +p27710 +I01 +sS'value' +p27711 +g47 +sssS'cached_display_name' +p27712 +(dp27713 +S'mandatory' +p27714 +(dp27715 +S'editable' +p27716 +I00 +sS'value' +p27717 +I00 +ssS'name' +p27718 +(dp27719 +S'editable' +p27720 +I01 +sS'value' +p27721 +S'Cached Display Name' +p27722 +ssS'data_type' +p27723 +(dp27724 +S'editable' +p27725 +I00 +sS'value' +p27726 +S'text' +p27727 +ssS'entity_type' +p27728 +(dp27729 +S'editable' +p27730 +I00 +sS'value' +p27731 +S'Page' +p27732 +ssS'editable' +p27733 +(dp27734 +S'editable' +p27735 +I00 +sS'value' +p27736 +I01 +ssS'unique' +p27737 +(dp27738 +S'editable' +p27739 +I00 +sS'value' +p27740 +I00 +ssS'properties' +p27741 +(dp27742 +S'default_value' +p27743 +(dp27744 +S'editable' +p27745 +I00 +sS'value' +p27746 +NssS'summary_default' +p27747 +(dp27748 +S'editable' +p27749 +I00 +sS'value' +p27750 +S'none' +p27751 +sssS'description' +p27752 +(dp27753 +S'editable' +p27754 +I01 +sS'value' +p27755 +g47 +sssS'id' +p27756 +(dp27757 +S'mandatory' +p27758 +(dp27759 +S'editable' +p27760 +I00 +sS'value' +p27761 +I00 +ssS'name' +p27762 +(dp27763 +S'editable' +p27764 +I01 +sS'value' +p27765 +S'Id' +p27766 +ssS'data_type' +p27767 +(dp27768 +S'editable' +p27769 +I00 +sS'value' +p27770 +S'number' +p27771 +ssS'entity_type' +p27772 +(dp27773 +S'editable' +p27774 +I00 +sS'value' +p27775 +S'Page' +p27776 +ssS'editable' +p27777 +(dp27778 +S'editable' +p27779 +I00 +sS'value' +p27780 +I00 +ssS'unique' +p27781 +(dp27782 +S'editable' +p27783 +I00 +sS'value' +p27784 +I00 +ssS'properties' +p27785 +(dp27786 +S'default_value' +p27787 +(dp27788 +S'editable' +p27789 +I00 +sS'value' +p27790 +NssS'summary_default' +p27791 +(dp27792 +S'editable' +p27793 +I01 +sS'value' +p27794 +S'none' +p27795 +sssS'description' +p27796 +(dp27797 +S'editable' +p27798 +I01 +sS'value' +p27799 +g47 +sssS'accesses_by_current_user' +p27800 +(dp27801 +S'mandatory' +p27802 +(dp27803 +S'editable' +p27804 +I00 +sS'value' +p27805 +I00 +ssS'name' +p27806 +(dp27807 +S'editable' +p27808 +I01 +sS'value' +p27809 +S'Times Accessed' +p27810 +ssS'data_type' +p27811 +(dp27812 +S'editable' +p27813 +I00 +sS'value' +p27814 +S'number' +p27815 +ssS'entity_type' +p27816 +(dp27817 +S'editable' +p27818 +I00 +sS'value' +p27819 +S'Page' +p27820 +ssS'editable' +p27821 +(dp27822 +S'editable' +p27823 +I00 +sS'value' +p27824 +I00 +ssS'unique' +p27825 +(dp27826 +S'editable' +p27827 +I00 +sS'value' +p27828 +I00 +ssS'properties' +p27829 +(dp27830 +S'default_value' +p27831 +(dp27832 +S'editable' +p27833 +I00 +sS'value' +p27834 +NssS'summary_default' +p27835 +(dp27836 +S'editable' +p27837 +I01 +sS'value' +p27838 +S'none' +p27839 +sssS'description' +p27840 +(dp27841 +S'editable' +p27842 +I01 +sS'value' +p27843 +g47 +sssS'updated_by' +p27844 +(dp27845 +S'mandatory' +p27846 +(dp27847 +S'editable' +p27848 +I00 +sS'value' +p27849 +I00 +ssS'name' +p27850 +(dp27851 +S'editable' +p27852 +I01 +sS'value' +p27853 +S'Updated by' +p27854 +ssS'data_type' +p27855 +(dp27856 +S'editable' +p27857 +I00 +sS'value' +p27858 +S'entity' +p27859 +ssS'entity_type' +p27860 +(dp27861 +S'editable' +p27862 +I00 +sS'value' +p27863 +S'Page' +p27864 +ssS'editable' +p27865 +(dp27866 +S'editable' +p27867 +I00 +sS'value' +p27868 +I00 +ssS'unique' +p27869 +(dp27870 +S'editable' +p27871 +I00 +sS'value' +p27872 +I00 +ssS'properties' +p27873 +(dp27874 +S'default_value' +p27875 +(dp27876 +S'editable' +p27877 +I00 +sS'value' +p27878 +NssS'summary_default' +p27879 +(dp27880 +S'editable' +p27881 +I00 +sS'value' +p27882 +S'none' +p27883 +ssS'valid_types' +p27884 +(dp27885 +S'editable' +p27886 +I00 +sS'value' +p27887 +(lp27888 +S'HumanUser' +p27889 +aS'ApiUser' +p27890 +asssS'description' +p27891 +(dp27892 +S'editable' +p27893 +I01 +sS'value' +p27894 +g47 +sssS'entity_type' +p27895 +(dp27896 +S'mandatory' +p27897 +(dp27898 +S'editable' +p27899 +I00 +sS'value' +p27900 +I00 +ssS'name' +p27901 +(dp27902 +S'editable' +p27903 +I01 +sS'value' +p27904 +S'Entity Type' +p27905 +ssS'data_type' +p27906 +(dp27907 +S'editable' +p27908 +I00 +sS'value' +p27909 +S'entity_type' +p27910 +ssS'entity_type' +p27911 +(dp27912 +S'editable' +p27913 +I00 +sS'value' +p27914 +S'Page' +p27915 +ssS'editable' +p27916 +(dp27917 +S'editable' +p27918 +I00 +sS'value' +p27919 +I00 +ssS'unique' +p27920 +(dp27921 +S'editable' +p27922 +I00 +sS'value' +p27923 +I00 +ssS'properties' +p27924 +(dp27925 +S'default_value' +p27926 +(dp27927 +S'editable' +p27928 +I00 +sS'value' +p27929 +NssS'summary_default' +p27930 +(dp27931 +S'editable' +p27932 +I01 +sS'value' +p27933 +S'none' +p27934 +sssS'description' +p27935 +(dp27936 +S'editable' +p27937 +I01 +sS'value' +p27938 +g47 +sssS'created_by' +p27939 +(dp27940 +S'mandatory' +p27941 +(dp27942 +S'editable' +p27943 +I00 +sS'value' +p27944 +I00 +ssS'name' +p27945 +(dp27946 +S'editable' +p27947 +I01 +sS'value' +p27948 +S'Created by' +p27949 +ssS'data_type' +p27950 +(dp27951 +S'editable' +p27952 +I00 +sS'value' +p27953 +S'entity' +p27954 +ssS'entity_type' +p27955 +(dp27956 +S'editable' +p27957 +I00 +sS'value' +p27958 +S'Page' +p27959 +ssS'editable' +p27960 +(dp27961 +S'editable' +p27962 +I00 +sS'value' +p27963 +I00 +ssS'unique' +p27964 +(dp27965 +S'editable' +p27966 +I00 +sS'value' +p27967 +I00 +ssS'properties' +p27968 +(dp27969 +S'default_value' +p27970 +(dp27971 +S'editable' +p27972 +I00 +sS'value' +p27973 +NssS'summary_default' +p27974 +(dp27975 +S'editable' +p27976 +I00 +sS'value' +p27977 +S'none' +p27978 +ssS'valid_types' +p27979 +(dp27980 +S'editable' +p27981 +I00 +sS'value' +p27982 +(lp27983 +S'HumanUser' +p27984 +aS'ApiUser' +p27985 +asssS'description' +p27986 +(dp27987 +S'editable' +p27988 +I01 +sS'value' +p27989 +g47 +sssS'page_type' +p27990 +(dp27991 +S'mandatory' +p27992 +(dp27993 +S'editable' +p27994 +I00 +sS'value' +p27995 +I00 +ssS'name' +p27996 +(dp27997 +S'editable' +p27998 +I01 +sS'value' +p27999 +S'Page Type' +p28000 +ssS'data_type' +p28001 +(dp28002 +S'editable' +p28003 +I00 +sS'value' +p28004 +S'text' +p28005 +ssS'entity_type' +p28006 +(dp28007 +S'editable' +p28008 +I00 +sS'value' +p28009 +S'Page' +p28010 +ssS'editable' +p28011 +(dp28012 +S'editable' +p28013 +I00 +sS'value' +p28014 +I00 +ssS'unique' +p28015 +(dp28016 +S'editable' +p28017 +I00 +sS'value' +p28018 +I00 +ssS'properties' +p28019 +(dp28020 +S'default_value' +p28021 +(dp28022 +S'editable' +p28023 +I00 +sS'value' +p28024 +NssS'summary_default' +p28025 +(dp28026 +S'editable' +p28027 +I01 +sS'value' +p28028 +S'none' +p28029 +sssS'description' +p28030 +(dp28031 +S'editable' +p28032 +I01 +sS'value' +p28033 +g47 +sssS'current_user_favorite' +p28034 +(dp28035 +S'mandatory' +p28036 +(dp28037 +S'editable' +p28038 +I00 +sS'value' +p28039 +I00 +ssS'name' +p28040 +(dp28041 +S'editable' +p28042 +I01 +sS'value' +p28043 +S'Favorite' +p28044 +ssS'data_type' +p28045 +(dp28046 +S'editable' +p28047 +I00 +sS'value' +p28048 +S'checkbox' +p28049 +ssS'entity_type' +p28050 +(dp28051 +S'editable' +p28052 +I00 +sS'value' +p28053 +S'Page' +p28054 +ssS'editable' +p28055 +(dp28056 +S'editable' +p28057 +I00 +sS'value' +p28058 +I01 +ssS'unique' +p28059 +(dp28060 +S'editable' +p28061 +I00 +sS'value' +p28062 +I00 +ssS'properties' +p28063 +(dp28064 +S'default_value' +p28065 +(dp28066 +S'editable' +p28067 +I00 +sS'value' +p28068 +NssS'summary_default' +p28069 +(dp28070 +S'editable' +p28071 +I01 +sS'value' +p28072 +S'none' +p28073 +sssS'description' +p28074 +(dp28075 +S'editable' +p28076 +I01 +sS'value' +p28077 +g47 +sssS'shared' +p28078 +(dp28079 +S'mandatory' +p28080 +(dp28081 +S'editable' +p28082 +I00 +sS'value' +p28083 +I00 +ssS'name' +p28084 +(dp28085 +S'editable' +p28086 +I01 +sS'value' +p28087 +S'Shared' +p28088 +ssS'data_type' +p28089 +(dp28090 +S'editable' +p28091 +I00 +sS'value' +p28092 +S'checkbox' +p28093 +ssS'entity_type' +p28094 +(dp28095 +S'editable' +p28096 +I00 +sS'value' +p28097 +S'Page' +p28098 +ssS'editable' +p28099 +(dp28100 +S'editable' +p28101 +I00 +sS'value' +p28102 +I01 +ssS'unique' +p28103 +(dp28104 +S'editable' +p28105 +I00 +sS'value' +p28106 +I00 +ssS'properties' +p28107 +(dp28108 +S'default_value' +p28109 +(dp28110 +S'editable' +p28111 +I00 +sS'value' +p28112 +I00 +ssS'summary_default' +p28113 +(dp28114 +S'editable' +p28115 +I01 +sS'value' +p28116 +S'none' +p28117 +sssS'description' +p28118 +(dp28119 +S'editable' +p28120 +I01 +sS'value' +p28121 +g47 +sssS'folder' +p28122 +(dp28123 +S'mandatory' +p28124 +(dp28125 +S'editable' +p28126 +I00 +sS'value' +p28127 +I00 +ssS'name' +p28128 +(dp28129 +S'editable' +p28130 +I01 +sS'value' +p28131 +S'Folder' +p28132 +ssS'data_type' +p28133 +(dp28134 +S'editable' +p28135 +I00 +sS'value' +p28136 +S'text' +p28137 +ssS'entity_type' +p28138 +(dp28139 +S'editable' +p28140 +I00 +sS'value' +p28141 +S'Page' +p28142 +ssS'editable' +p28143 +(dp28144 +S'editable' +p28145 +I00 +sS'value' +p28146 +I01 +ssS'unique' +p28147 +(dp28148 +S'editable' +p28149 +I00 +sS'value' +p28150 +I00 +ssS'properties' +p28151 +(dp28152 +S'default_value' +p28153 +(dp28154 +S'editable' +p28155 +I00 +sS'value' +p28156 +NssS'summary_default' +p28157 +(dp28158 +S'editable' +p28159 +I01 +sS'value' +p28160 +S'none' +p28161 +sssS'description' +p28162 +(dp28163 +S'editable' +p28164 +I01 +sS'value' +p28165 +g47 +sssS'last_accessed_by_current_user' +p28166 +(dp28167 +S'mandatory' +p28168 +(dp28169 +S'editable' +p28170 +I00 +sS'value' +p28171 +I00 +ssS'name' +p28172 +(dp28173 +S'editable' +p28174 +I01 +sS'value' +p28175 +S'Last Accessed by Me' +p28176 +ssS'data_type' +p28177 +(dp28178 +S'editable' +p28179 +I00 +sS'value' +p28180 +S'date_time' +p28181 +ssS'entity_type' +p28182 +(dp28183 +S'editable' +p28184 +I00 +sS'value' +p28185 +S'Page' +p28186 +ssS'editable' +p28187 +(dp28188 +S'editable' +p28189 +I00 +sS'value' +p28190 +I00 +ssS'unique' +p28191 +(dp28192 +S'editable' +p28193 +I00 +sS'value' +p28194 +I00 +ssS'properties' +p28195 +(dp28196 +S'default_value' +p28197 +(dp28198 +S'editable' +p28199 +I00 +sS'value' +p28200 +NssS'summary_default' +p28201 +(dp28202 +S'editable' +p28203 +I01 +sS'value' +p28204 +S'none' +p28205 +sssS'description' +p28206 +(dp28207 +S'editable' +p28208 +I01 +sS'value' +p28209 +g47 +sssS'description' +p28210 +(dp28211 +S'mandatory' +p28212 +(dp28213 +S'editable' +p28214 +I00 +sS'value' +p28215 +I00 +ssS'name' +p28216 +(dp28217 +S'editable' +p28218 +I01 +sS'value' +p28219 +S'Description' +p28220 +ssS'data_type' +p28221 +(dp28222 +S'editable' +p28223 +I00 +sS'value' +p28224 +S'text' +p28225 +ssS'entity_type' +p28226 +(dp28227 +S'editable' +p28228 +I00 +sS'value' +p28229 +S'Page' +p28230 +ssS'editable' +p28231 +(dp28232 +S'editable' +p28233 +I00 +sS'value' +p28234 +I01 +ssS'unique' +p28235 +(dp28236 +S'editable' +p28237 +I00 +sS'value' +p28238 +I00 +ssS'properties' +p28239 +(dp28240 +S'default_value' +p28241 +(dp28242 +S'editable' +p28243 +I00 +sS'value' +p28244 +NssS'summary_default' +p28245 +(dp28246 +S'editable' +p28247 +I00 +sS'value' +p28248 +S'none' +p28249 +sssS'description' +p28250 +(dp28251 +S'editable' +p28252 +I01 +sS'value' +p28253 +g47 +sssS'last_accessed' +p28254 +(dp28255 +S'mandatory' +p28256 +(dp28257 +S'editable' +p28258 +I00 +sS'value' +p28259 +I00 +ssS'name' +p28260 +(dp28261 +S'editable' +p28262 +I01 +sS'value' +p28263 +S'Last Accessed' +p28264 +ssS'data_type' +p28265 +(dp28266 +S'editable' +p28267 +I00 +sS'value' +p28268 +S'date_time' +p28269 +ssS'entity_type' +p28270 +(dp28271 +S'editable' +p28272 +I00 +sS'value' +p28273 +S'Page' +p28274 +ssS'editable' +p28275 +(dp28276 +S'editable' +p28277 +I00 +sS'value' +p28278 +I00 +ssS'unique' +p28279 +(dp28280 +S'editable' +p28281 +I00 +sS'value' +p28282 +I00 +ssS'properties' +p28283 +(dp28284 +S'default_value' +p28285 +(dp28286 +S'editable' +p28287 +I00 +sS'value' +p28288 +NssS'summary_default' +p28289 +(dp28290 +S'editable' +p28291 +I01 +sS'value' +p28292 +S'none' +p28293 +sssS'description' +p28294 +(dp28295 +S'editable' +p28296 +I01 +sS'value' +p28297 +g47 +sssS'default_type' +p28298 +(dp28299 +S'mandatory' +p28300 +(dp28301 +S'editable' +p28302 +I00 +sS'value' +p28303 +I00 +ssS'name' +p28304 +(dp28305 +S'editable' +p28306 +I01 +sS'value' +p28307 +S'Default Type' +p28308 +ssS'data_type' +p28309 +(dp28310 +S'editable' +p28311 +I00 +sS'value' +p28312 +S'text' +p28313 +ssS'entity_type' +p28314 +(dp28315 +S'editable' +p28316 +I00 +sS'value' +p28317 +S'Page' +p28318 +ssS'editable' +p28319 +(dp28320 +S'editable' +p28321 +I00 +sS'value' +p28322 +I00 +ssS'unique' +p28323 +(dp28324 +S'editable' +p28325 +I00 +sS'value' +p28326 +I00 +ssS'properties' +p28327 +(dp28328 +S'default_value' +p28329 +(dp28330 +S'editable' +p28331 +I00 +sS'value' +p28332 +NssS'summary_default' +p28333 +(dp28334 +S'editable' +p28335 +I01 +sS'value' +p28336 +S'none' +p28337 +sssS'description' +p28338 +(dp28339 +S'editable' +p28340 +I01 +sS'value' +p28341 +g47 +sssS'current_user_can_see' +p28342 +(dp28343 +S'mandatory' +p28344 +(dp28345 +S'editable' +p28346 +I00 +sS'value' +p28347 +I00 +ssS'name' +p28348 +(dp28349 +S'editable' +p28350 +I01 +sS'value' +p28351 +S'Current User Can See' +p28352 +ssS'data_type' +p28353 +(dp28354 +S'editable' +p28355 +I00 +sS'value' +p28356 +S'checkbox' +p28357 +ssS'entity_type' +p28358 +(dp28359 +S'editable' +p28360 +I00 +sS'value' +p28361 +S'Page' +p28362 +ssS'editable' +p28363 +(dp28364 +S'editable' +p28365 +I00 +sS'value' +p28366 +I00 +ssS'unique' +p28367 +(dp28368 +S'editable' +p28369 +I00 +sS'value' +p28370 +I00 +ssS'properties' +p28371 +(dp28372 +S'default_value' +p28373 +(dp28374 +S'editable' +p28375 +I00 +sS'value' +p28376 +NssS'summary_default' +p28377 +(dp28378 +S'editable' +p28379 +I00 +sS'value' +p28380 +S'none' +p28381 +sssS'description' +p28382 +(dp28383 +S'editable' +p28384 +I01 +sS'value' +p28385 +g47 +sssS'name' +p28386 +(dp28387 +S'mandatory' +p28388 +(dp28389 +S'editable' +p28390 +I00 +sS'value' +p28391 +I01 +ssS'name' +p28392 +(dp28393 +S'editable' +p28394 +I01 +sS'value' +p28395 +S'Name' +p28396 +ssS'data_type' +p28397 +(dp28398 +S'editable' +p28399 +I00 +sS'value' +p28400 +S'text' +p28401 +ssS'entity_type' +p28402 +(dp28403 +S'editable' +p28404 +I00 +sS'value' +p28405 +S'Page' +p28406 +ssS'editable' +p28407 +(dp28408 +S'editable' +p28409 +I00 +sS'value' +p28410 +I01 +ssS'unique' +p28411 +(dp28412 +S'editable' +p28413 +I00 +sS'value' +p28414 +I00 +ssS'properties' +p28415 +(dp28416 +S'default_value' +p28417 +(dp28418 +S'editable' +p28419 +I00 +sS'value' +p28420 +NssS'summary_default' +p28421 +(dp28422 +S'editable' +p28423 +I01 +sS'value' +p28424 +S'none' +p28425 +sssS'description' +p28426 +(dp28427 +S'editable' +p28428 +I01 +sS'value' +p28429 +g47 +sssS'admin' +p28430 +(dp28431 +S'mandatory' +p28432 +(dp28433 +S'editable' +p28434 +I00 +sS'value' +p28435 +I00 +ssS'name' +p28436 +(dp28437 +S'editable' +p28438 +I01 +sS'value' +p28439 +S'Admin Only' +p28440 +ssS'data_type' +p28441 +(dp28442 +S'editable' +p28443 +I00 +sS'value' +p28444 +S'checkbox' +p28445 +ssS'entity_type' +p28446 +(dp28447 +S'editable' +p28448 +I00 +sS'value' +p28449 +S'Page' +p28450 +ssS'editable' +p28451 +(dp28452 +S'editable' +p28453 +I00 +sS'value' +p28454 +I00 +ssS'unique' +p28455 +(dp28456 +S'editable' +p28457 +I00 +sS'value' +p28458 +I00 +ssS'properties' +p28459 +(dp28460 +S'default_value' +p28461 +(dp28462 +S'editable' +p28463 +I00 +sS'value' +p28464 +I00 +ssS'summary_default' +p28465 +(dp28466 +S'editable' +p28467 +I01 +sS'value' +p28468 +S'none' +p28469 +sssS'description' +p28470 +(dp28471 +S'editable' +p28472 +I01 +sS'value' +p28473 +g47 +sssS'created_at' +p28474 +(dp28475 +S'mandatory' +p28476 +(dp28477 +S'editable' +p28478 +I00 +sS'value' +p28479 +I00 +ssS'name' +p28480 +(dp28481 +S'editable' +p28482 +I01 +sS'value' +p28483 +S'Date Created' +p28484 +ssS'data_type' +p28485 +(dp28486 +S'editable' +p28487 +I00 +sS'value' +p28488 +S'date_time' +p28489 +ssS'entity_type' +p28490 +(dp28491 +S'editable' +p28492 +I00 +sS'value' +p28493 +S'Page' +p28494 +ssS'editable' +p28495 +(dp28496 +S'editable' +p28497 +I00 +sS'value' +p28498 +I00 +ssS'unique' +p28499 +(dp28500 +S'editable' +p28501 +I00 +sS'value' +p28502 +I00 +ssS'properties' +p28503 +(dp28504 +S'default_value' +p28505 +(dp28506 +S'editable' +p28507 +I00 +sS'value' +p28508 +NssS'summary_default' +p28509 +(dp28510 +S'editable' +p28511 +I00 +sS'value' +p28512 +S'none' +p28513 +sssS'description' +p28514 +(dp28515 +S'editable' +p28516 +I01 +sS'value' +p28517 +g47 +sssS'project' +p28518 +(dp28519 +S'mandatory' +p28520 +(dp28521 +S'editable' +p28522 +I00 +sS'value' +p28523 +I00 +ssS'name' +p28524 +(dp28525 +S'editable' +p28526 +I01 +sS'value' +p28527 +S'Project' +p28528 +ssS'data_type' +p28529 +(dp28530 +S'editable' +p28531 +I00 +sS'value' +p28532 +S'entity' +p28533 +ssS'entity_type' +p28534 +(dp28535 +S'editable' +p28536 +I00 +sS'value' +p28537 +S'Page' +p28538 +ssS'editable' +p28539 +(dp28540 +S'editable' +p28541 +I00 +sS'value' +p28542 +I01 +ssS'unique' +p28543 +(dp28544 +S'editable' +p28545 +I00 +sS'value' +p28546 +I00 +ssS'properties' +p28547 +(dp28548 +S'default_value' +p28549 +(dp28550 +S'editable' +p28551 +I00 +sS'value' +p28552 +NssS'summary_default' +p28553 +(dp28554 +S'editable' +p28555 +I01 +sS'value' +p28556 +S'none' +p28557 +ssS'valid_types' +p28558 +(dp28559 +S'editable' +p28560 +I01 +sS'value' +p28561 +(lp28562 +S'Project' +p28563 +asssS'description' +p28564 +(dp28565 +S'editable' +p28566 +I01 +sS'value' +p28567 +g47 +sssS'ui_category' +p28568 +(dp28569 +S'mandatory' +p28570 +(dp28571 +S'editable' +p28572 +I00 +sS'value' +p28573 +I00 +ssS'name' +p28574 +(dp28575 +S'editable' +p28576 +I01 +sS'value' +p28577 +S'UI Category' +p28578 +ssS'data_type' +p28579 +(dp28580 +S'editable' +p28581 +I00 +sS'value' +p28582 +S'text' +p28583 +ssS'entity_type' +p28584 +(dp28585 +S'editable' +p28586 +I00 +sS'value' +p28587 +S'Page' +p28588 +ssS'editable' +p28589 +(dp28590 +S'editable' +p28591 +I00 +sS'value' +p28592 +I00 +ssS'unique' +p28593 +(dp28594 +S'editable' +p28595 +I00 +sS'value' +p28596 +I00 +ssS'properties' +p28597 +(dp28598 +S'default_value' +p28599 +(dp28600 +S'editable' +p28601 +I00 +sS'value' +p28602 +NssS'summary_default' +p28603 +(dp28604 +S'editable' +p28605 +I01 +sS'value' +p28606 +S'none' +p28607 +sssS'description' +p28608 +(dp28609 +S'editable' +p28610 +I01 +sS'value' +p28611 +g47 +sssS'tag_list' +p28612 +(dp28613 +S'mandatory' +p28614 +(dp28615 +S'editable' +p28616 +I00 +sS'value' +p28617 +I00 +ssS'name' +p28618 +(dp28619 +S'editable' +p28620 +I01 +sS'value' +p28621 +S'Tags' +p28622 +ssS'data_type' +p28623 +(dp28624 +S'editable' +p28625 +I00 +sS'value' +p28626 +S'tag_list' +p28627 +ssS'entity_type' +p28628 +(dp28629 +S'editable' +p28630 +I00 +sS'value' +p28631 +S'Page' +p28632 +ssS'editable' +p28633 +(dp28634 +S'editable' +p28635 +I00 +sS'value' +p28636 +I01 +ssS'unique' +p28637 +(dp28638 +S'editable' +p28639 +I00 +sS'value' +p28640 +I00 +ssS'properties' +p28641 +(dp28642 +S'default_value' +p28643 +(dp28644 +S'editable' +p28645 +I00 +sS'value' +p28646 +NssS'summary_default' +p28647 +(dp28648 +S'editable' +p28649 +I01 +sS'value' +p28650 +S'none' +p28651 +ssS'valid_types' +p28652 +(dp28653 +S'editable' +p28654 +I01 +sS'value' +p28655 +(lp28656 +S'Tag' +p28657 +asssS'description' +p28658 +(dp28659 +S'editable' +p28660 +I01 +sS'value' +p28661 +g47 +sssS'hits_last_month' +p28662 +(dp28663 +S'mandatory' +p28664 +(dp28665 +S'editable' +p28666 +I00 +sS'value' +p28667 +I00 +ssS'name' +p28668 +(dp28669 +S'editable' +p28670 +I01 +sS'value' +p28671 +S'Page Hits Last Month' +p28672 +ssS'data_type' +p28673 +(dp28674 +S'editable' +p28675 +I00 +sS'value' +p28676 +S'number' +p28677 +ssS'entity_type' +p28678 +(dp28679 +S'editable' +p28680 +I00 +sS'value' +p28681 +S'Page' +p28682 +ssS'editable' +p28683 +(dp28684 +S'editable' +p28685 +I00 +sS'value' +p28686 +I00 +ssS'unique' +p28687 +(dp28688 +S'editable' +p28689 +I00 +sS'value' +p28690 +I00 +ssS'properties' +p28691 +(dp28692 +S'default_value' +p28693 +(dp28694 +S'editable' +p28695 +I00 +sS'value' +p28696 +NssS'summary_default' +p28697 +(dp28698 +S'editable' +p28699 +I01 +sS'value' +p28700 +S'none' +p28701 +sssS'description' +p28702 +(dp28703 +S'editable' +p28704 +I01 +sS'value' +p28705 +g47 +ssssS'CustomEntity02' +p28706 +(dp28707 +S'open_notes_count' +p28708 +(dp28709 +S'mandatory' +p28710 +(dp28711 +S'editable' +p28712 +I00 +sS'value' +p28713 +I00 +ssS'name' +p28714 +(dp28715 +S'editable' +p28716 +I01 +sS'value' +p28717 +S'Open Notes Count' +p28718 +ssS'data_type' +p28719 +(dp28720 +S'editable' +p28721 +I00 +sS'value' +p28722 +S'text' +p28723 +ssS'entity_type' +p28724 +(dp28725 +S'editable' +p28726 +I00 +sS'value' +p28727 +S'CustomEntity02' +p28728 +ssS'editable' +p28729 +(dp28730 +S'editable' +p28731 +I00 +sS'value' +p28732 +I00 +ssS'unique' +p28733 +(dp28734 +S'editable' +p28735 +I00 +sS'value' +p28736 +I00 +ssS'properties' +p28737 +(dp28738 +S'default_value' +p28739 +(dp28740 +S'editable' +p28741 +I00 +sS'value' +p28742 +NssS'summary_default' +p28743 +(dp28744 +S'editable' +p28745 +I01 +sS'value' +p28746 +S'none' +p28747 +sssS'description' +p28748 +(dp28749 +S'editable' +p28750 +I01 +sS'value' +p28751 +g47 +sssS'code' +p28752 +(dp28753 +S'mandatory' +p28754 +(dp28755 +S'editable' +p28756 +I00 +sS'value' +p28757 +I01 +ssS'name' +p28758 +(dp28759 +S'editable' +p28760 +I01 +sS'value' +p28761 +S'Custom Entity02 Name' +p28762 +ssS'data_type' +p28763 +(dp28764 +S'editable' +p28765 +I00 +sS'value' +p28766 +S'text' +p28767 +ssS'entity_type' +p28768 +(dp28769 +S'editable' +p28770 +I00 +sS'value' +p28771 +S'CustomEntity02' +p28772 +ssS'editable' +p28773 +(dp28774 +S'editable' +p28775 +I00 +sS'value' +p28776 +I01 +ssS'unique' +p28777 +(dp28778 +S'editable' +p28779 +I00 +sS'value' +p28780 +I00 +ssS'properties' +p28781 +(dp28782 +S'default_value' +p28783 +(dp28784 +S'editable' +p28785 +I00 +sS'value' +p28786 +NssS'summary_default' +p28787 +(dp28788 +S'editable' +p28789 +I01 +sS'value' +p28790 +S'none' +p28791 +sssS'description' +p28792 +(dp28793 +S'editable' +p28794 +I01 +sS'value' +p28795 +g47 +sssS'open_notes' +p28796 +(dp28797 +S'mandatory' +p28798 +(dp28799 +S'editable' +p28800 +I00 +sS'value' +p28801 +I00 +ssS'name' +p28802 +(dp28803 +S'editable' +p28804 +I01 +sS'value' +p28805 +S'Open Notes' +p28806 +ssS'data_type' +p28807 +(dp28808 +S'editable' +p28809 +I00 +sS'value' +p28810 +S'multi_entity' +p28811 +ssS'entity_type' +p28812 +(dp28813 +S'editable' +p28814 +I00 +sS'value' +p28815 +S'CustomEntity02' +p28816 +ssS'editable' +p28817 +(dp28818 +S'editable' +p28819 +I00 +sS'value' +p28820 +I00 +ssS'unique' +p28821 +(dp28822 +S'editable' +p28823 +I00 +sS'value' +p28824 +I00 +ssS'properties' +p28825 +(dp28826 +S'default_value' +p28827 +(dp28828 +S'editable' +p28829 +I00 +sS'value' +p28830 +NssS'summary_default' +p28831 +(dp28832 +S'editable' +p28833 +I01 +sS'value' +p28834 +S'none' +p28835 +ssS'valid_types' +p28836 +(dp28837 +S'editable' +p28838 +I01 +sS'value' +p28839 +(lp28840 +S'Note' +p28841 +asssS'description' +p28842 +(dp28843 +S'editable' +p28844 +I01 +sS'value' +p28845 +g47 +sssS'description' +p28846 +(dp28847 +S'mandatory' +p28848 +(dp28849 +S'editable' +p28850 +I00 +sS'value' +p28851 +I00 +ssS'name' +p28852 +(dp28853 +S'editable' +p28854 +I01 +sS'value' +p28855 +S'Description' +p28856 +ssS'data_type' +p28857 +(dp28858 +S'editable' +p28859 +I00 +sS'value' +p28860 +S'text' +p28861 +ssS'entity_type' +p28862 +(dp28863 +S'editable' +p28864 +I00 +sS'value' +p28865 +S'CustomEntity02' +p28866 +ssS'editable' +p28867 +(dp28868 +S'editable' +p28869 +I00 +sS'value' +p28870 +I01 +ssS'unique' +p28871 +(dp28872 +S'editable' +p28873 +I00 +sS'value' +p28874 +I00 +ssS'properties' +p28875 +(dp28876 +S'default_value' +p28877 +(dp28878 +S'editable' +p28879 +I00 +sS'value' +p28880 +NssS'summary_default' +p28881 +(dp28882 +S'editable' +p28883 +I01 +sS'value' +p28884 +S'none' +p28885 +sssS'description' +p28886 +(dp28887 +S'editable' +p28888 +I01 +sS'value' +p28889 +g47 +sssS'created_at' +p28890 +(dp28891 +S'mandatory' +p28892 +(dp28893 +S'editable' +p28894 +I00 +sS'value' +p28895 +I00 +ssS'name' +p28896 +(dp28897 +S'editable' +p28898 +I01 +sS'value' +p28899 +S'Date Created' +p28900 +ssS'data_type' +p28901 +(dp28902 +S'editable' +p28903 +I00 +sS'value' +p28904 +S'date_time' +p28905 +ssS'entity_type' +p28906 +(dp28907 +S'editable' +p28908 +I00 +sS'value' +p28909 +S'CustomEntity02' +p28910 +ssS'editable' +p28911 +(dp28912 +S'editable' +p28913 +I00 +sS'value' +p28914 +I00 +ssS'unique' +p28915 +(dp28916 +S'editable' +p28917 +I00 +sS'value' +p28918 +I00 +ssS'properties' +p28919 +(dp28920 +S'default_value' +p28921 +(dp28922 +S'editable' +p28923 +I00 +sS'value' +p28924 +NssS'summary_default' +p28925 +(dp28926 +S'editable' +p28927 +I01 +sS'value' +p28928 +S'none' +p28929 +sssS'description' +p28930 +(dp28931 +S'editable' +p28932 +I01 +sS'value' +p28933 +g47 +sssS'updated_at' +p28934 +(dp28935 +S'mandatory' +p28936 +(dp28937 +S'editable' +p28938 +I00 +sS'value' +p28939 +I00 +ssS'name' +p28940 +(dp28941 +S'editable' +p28942 +I01 +sS'value' +p28943 +S'Date Updated' +p28944 +ssS'data_type' +p28945 +(dp28946 +S'editable' +p28947 +I00 +sS'value' +p28948 +S'date_time' +p28949 +ssS'entity_type' +p28950 +(dp28951 +S'editable' +p28952 +I00 +sS'value' +p28953 +S'CustomEntity02' +p28954 +ssS'editable' +p28955 +(dp28956 +S'editable' +p28957 +I00 +sS'value' +p28958 +I00 +ssS'unique' +p28959 +(dp28960 +S'editable' +p28961 +I00 +sS'value' +p28962 +I00 +ssS'properties' +p28963 +(dp28964 +S'default_value' +p28965 +(dp28966 +S'editable' +p28967 +I00 +sS'value' +p28968 +NssS'summary_default' +p28969 +(dp28970 +S'editable' +p28971 +I01 +sS'value' +p28972 +S'none' +p28973 +sssS'description' +p28974 +(dp28975 +S'editable' +p28976 +I01 +sS'value' +p28977 +g47 +sssS'created_by' +p28978 +(dp28979 +S'mandatory' +p28980 +(dp28981 +S'editable' +p28982 +I00 +sS'value' +p28983 +I00 +ssS'name' +p28984 +(dp28985 +S'editable' +p28986 +I01 +sS'value' +p28987 +S'Created by' +p28988 +ssS'data_type' +p28989 +(dp28990 +S'editable' +p28991 +I00 +sS'value' +p28992 +S'entity' +p28993 +ssS'entity_type' +p28994 +(dp28995 +S'editable' +p28996 +I00 +sS'value' +p28997 +S'CustomEntity02' +p28998 +ssS'editable' +p28999 +(dp29000 +S'editable' +p29001 +I00 +sS'value' +p29002 +I00 +ssS'unique' +p29003 +(dp29004 +S'editable' +p29005 +I00 +sS'value' +p29006 +I00 +ssS'properties' +p29007 +(dp29008 +S'default_value' +p29009 +(dp29010 +S'editable' +p29011 +I00 +sS'value' +p29012 +NssS'summary_default' +p29013 +(dp29014 +S'editable' +p29015 +I01 +sS'value' +p29016 +S'none' +p29017 +ssS'valid_types' +p29018 +(dp29019 +S'editable' +p29020 +I01 +sS'value' +p29021 +(lp29022 +S'HumanUser' +p29023 +aS'ApiUser' +p29024 +asssS'description' +p29025 +(dp29026 +S'editable' +p29027 +I01 +sS'value' +p29028 +g47 +sssS'id' +p29029 +(dp29030 +S'mandatory' +p29031 +(dp29032 +S'editable' +p29033 +I00 +sS'value' +p29034 +I00 +ssS'name' +p29035 +(dp29036 +S'editable' +p29037 +I01 +sS'value' +p29038 +S'Id' +p29039 +ssS'data_type' +p29040 +(dp29041 +S'editable' +p29042 +I00 +sS'value' +p29043 +S'number' +p29044 +ssS'entity_type' +p29045 +(dp29046 +S'editable' +p29047 +I00 +sS'value' +p29048 +S'CustomEntity02' +p29049 +ssS'editable' +p29050 +(dp29051 +S'editable' +p29052 +I00 +sS'value' +p29053 +I00 +ssS'unique' +p29054 +(dp29055 +S'editable' +p29056 +I00 +sS'value' +p29057 +I00 +ssS'properties' +p29058 +(dp29059 +S'default_value' +p29060 +(dp29061 +S'editable' +p29062 +I00 +sS'value' +p29063 +NssS'summary_default' +p29064 +(dp29065 +S'editable' +p29066 +I01 +sS'value' +p29067 +S'none' +p29068 +sssS'description' +p29069 +(dp29070 +S'editable' +p29071 +I01 +sS'value' +p29072 +g47 +sssS'project' +p29073 +(dp29074 +S'mandatory' +p29075 +(dp29076 +S'editable' +p29077 +I00 +sS'value' +p29078 +I00 +ssS'name' +p29079 +(dp29080 +S'editable' +p29081 +I01 +sS'value' +p29082 +S'Project' +p29083 +ssS'data_type' +p29084 +(dp29085 +S'editable' +p29086 +I00 +sS'value' +p29087 +S'entity' +p29088 +ssS'entity_type' +p29089 +(dp29090 +S'editable' +p29091 +I00 +sS'value' +p29092 +S'CustomEntity02' +p29093 +ssS'editable' +p29094 +(dp29095 +S'editable' +p29096 +I00 +sS'value' +p29097 +I01 +ssS'unique' +p29098 +(dp29099 +S'editable' +p29100 +I00 +sS'value' +p29101 +I00 +ssS'properties' +p29102 +(dp29103 +S'default_value' +p29104 +(dp29105 +S'editable' +p29106 +I00 +sS'value' +p29107 +NssS'summary_default' +p29108 +(dp29109 +S'editable' +p29110 +I01 +sS'value' +p29111 +S'none' +p29112 +ssS'valid_types' +p29113 +(dp29114 +S'editable' +p29115 +I01 +sS'value' +p29116 +(lp29117 +S'Project' +p29118 +asssS'description' +p29119 +(dp29120 +S'editable' +p29121 +I01 +sS'value' +p29122 +g47 +sssS'filmstrip_image' +p29123 +(dp29124 +S'mandatory' +p29125 +(dp29126 +S'editable' +p29127 +I00 +sS'value' +p29128 +I00 +ssS'name' +p29129 +(dp29130 +S'editable' +p29131 +I01 +sS'value' +p29132 +S'Filmstrip Thumbnail' +p29133 +ssS'data_type' +p29134 +(dp29135 +S'editable' +p29136 +I00 +sS'value' +p29137 +S'image' +p29138 +ssS'entity_type' +p29139 +(dp29140 +S'editable' +p29141 +I00 +sS'value' +p29142 +S'CustomEntity02' +p29143 +ssS'editable' +p29144 +(dp29145 +S'editable' +p29146 +I00 +sS'value' +p29147 +I01 +ssS'unique' +p29148 +(dp29149 +S'editable' +p29150 +I00 +sS'value' +p29151 +I00 +ssS'properties' +p29152 +(dp29153 +S'default_value' +p29154 +(dp29155 +S'editable' +p29156 +I00 +sS'value' +p29157 +NssS'summary_default' +p29158 +(dp29159 +S'editable' +p29160 +I01 +sS'value' +p29161 +S'none' +p29162 +sssS'description' +p29163 +(dp29164 +S'editable' +p29165 +I01 +sS'value' +p29166 +g47 +sssS'sg_status_list' +p29167 +(dp29168 +S'mandatory' +p29169 +(dp29170 +S'editable' +p29171 +I00 +sS'value' +p29172 +I00 +ssS'name' +p29173 +(dp29174 +S'editable' +p29175 +I01 +sS'value' +p29176 +S'Status' +p29177 +ssS'data_type' +p29178 +(dp29179 +S'editable' +p29180 +I00 +sS'value' +p29181 +S'status_list' +p29182 +ssS'entity_type' +p29183 +(dp29184 +S'editable' +p29185 +I00 +sS'value' +p29186 +S'CustomEntity02' +p29187 +ssS'editable' +p29188 +(dp29189 +S'editable' +p29190 +I00 +sS'value' +p29191 +I01 +ssS'unique' +p29192 +(dp29193 +S'editable' +p29194 +I00 +sS'value' +p29195 +I00 +ssS'properties' +p29196 +(dp29197 +S'default_value' +p29198 +(dp29199 +S'editable' +p29200 +I01 +sS'value' +p29201 +S'wtg' +p29202 +ssS'valid_values' +p29203 +(dp29204 +S'editable' +p29205 +I01 +sS'value' +p29206 +(lp29207 +S'cmpt' +p29208 +aS'ip' +p29209 +aS'wtg' +p29210 +assS'summary_default' +p29211 +(dp29212 +S'editable' +p29213 +I01 +sS'value' +p29214 +S'none' +p29215 +sssS'description' +p29216 +(dp29217 +S'editable' +p29218 +I01 +sS'value' +p29219 +g47 +sssS'image' +p29220 +(dp29221 +S'mandatory' +p29222 +(dp29223 +S'editable' +p29224 +I00 +sS'value' +p29225 +I00 +ssS'name' +p29226 +(dp29227 +S'editable' +p29228 +I01 +sS'value' +p29229 +S'Thumbnail' +p29230 +ssS'data_type' +p29231 +(dp29232 +S'editable' +p29233 +I00 +sS'value' +p29234 +S'image' +p29235 +ssS'entity_type' +p29236 +(dp29237 +S'editable' +p29238 +I00 +sS'value' +p29239 +S'CustomEntity02' +p29240 +ssS'editable' +p29241 +(dp29242 +S'editable' +p29243 +I00 +sS'value' +p29244 +I01 +ssS'unique' +p29245 +(dp29246 +S'editable' +p29247 +I00 +sS'value' +p29248 +I00 +ssS'properties' +p29249 +(dp29250 +S'default_value' +p29251 +(dp29252 +S'editable' +p29253 +I00 +sS'value' +p29254 +NssS'summary_default' +p29255 +(dp29256 +S'editable' +p29257 +I01 +sS'value' +p29258 +S'none' +p29259 +sssS'description' +p29260 +(dp29261 +S'editable' +p29262 +I01 +sS'value' +p29263 +g47 +sssS'cached_display_name' +p29264 +(dp29265 +S'mandatory' +p29266 +(dp29267 +S'editable' +p29268 +I00 +sS'value' +p29269 +I00 +ssS'name' +p29270 +(dp29271 +S'editable' +p29272 +I01 +sS'value' +p29273 +S'Cached Display Name' +p29274 +ssS'data_type' +p29275 +(dp29276 +S'editable' +p29277 +I00 +sS'value' +p29278 +S'text' +p29279 +ssS'entity_type' +p29280 +(dp29281 +S'editable' +p29282 +I00 +sS'value' +p29283 +S'CustomEntity02' +p29284 +ssS'editable' +p29285 +(dp29286 +S'editable' +p29287 +I00 +sS'value' +p29288 +I01 +ssS'unique' +p29289 +(dp29290 +S'editable' +p29291 +I00 +sS'value' +p29292 +I00 +ssS'properties' +p29293 +(dp29294 +S'default_value' +p29295 +(dp29296 +S'editable' +p29297 +I00 +sS'value' +p29298 +NssS'summary_default' +p29299 +(dp29300 +S'editable' +p29301 +I00 +sS'value' +p29302 +S'none' +p29303 +sssS'description' +p29304 +(dp29305 +S'editable' +p29306 +I01 +sS'value' +p29307 +g47 +sssS'tag_list' +p29308 +(dp29309 +S'mandatory' +p29310 +(dp29311 +S'editable' +p29312 +I00 +sS'value' +p29313 +I00 +ssS'name' +p29314 +(dp29315 +S'editable' +p29316 +I01 +sS'value' +p29317 +S'Tags' +p29318 +ssS'data_type' +p29319 +(dp29320 +S'editable' +p29321 +I00 +sS'value' +p29322 +S'tag_list' +p29323 +ssS'entity_type' +p29324 +(dp29325 +S'editable' +p29326 +I00 +sS'value' +p29327 +S'CustomEntity02' +p29328 +ssS'editable' +p29329 +(dp29330 +S'editable' +p29331 +I00 +sS'value' +p29332 +I01 +ssS'unique' +p29333 +(dp29334 +S'editable' +p29335 +I00 +sS'value' +p29336 +I00 +ssS'properties' +p29337 +(dp29338 +S'default_value' +p29339 +(dp29340 +S'editable' +p29341 +I00 +sS'value' +p29342 +NssS'summary_default' +p29343 +(dp29344 +S'editable' +p29345 +I01 +sS'value' +p29346 +S'none' +p29347 +ssS'valid_types' +p29348 +(dp29349 +S'editable' +p29350 +I01 +sS'value' +p29351 +(lp29352 +S'Tag' +p29353 +asssS'description' +p29354 +(dp29355 +S'editable' +p29356 +I01 +sS'value' +p29357 +g47 +sssS'notes' +p29358 +(dp29359 +S'mandatory' +p29360 +(dp29361 +S'editable' +p29362 +I00 +sS'value' +p29363 +I00 +ssS'name' +p29364 +(dp29365 +S'editable' +p29366 +I01 +sS'value' +p29367 +S'Notes' +p29368 +ssS'data_type' +p29369 +(dp29370 +S'editable' +p29371 +I00 +sS'value' +p29372 +S'multi_entity' +p29373 +ssS'entity_type' +p29374 +(dp29375 +S'editable' +p29376 +I00 +sS'value' +p29377 +S'CustomEntity02' +p29378 +ssS'editable' +p29379 +(dp29380 +S'editable' +p29381 +I00 +sS'value' +p29382 +I01 +ssS'unique' +p29383 +(dp29384 +S'editable' +p29385 +I00 +sS'value' +p29386 +I00 +ssS'properties' +p29387 +(dp29388 +S'default_value' +p29389 +(dp29390 +S'editable' +p29391 +I00 +sS'value' +p29392 +NssS'summary_default' +p29393 +(dp29394 +S'editable' +p29395 +I01 +sS'value' +p29396 +S'none' +p29397 +ssS'valid_types' +p29398 +(dp29399 +S'editable' +p29400 +I01 +sS'value' +p29401 +(lp29402 +S'Note' +p29403 +asssS'description' +p29404 +(dp29405 +S'editable' +p29406 +I01 +sS'value' +p29407 +g47 +sssS'updated_by' +p29408 +(dp29409 +S'mandatory' +p29410 +(dp29411 +S'editable' +p29412 +I00 +sS'value' +p29413 +I00 +ssS'name' +p29414 +(dp29415 +S'editable' +p29416 +I01 +sS'value' +p29417 +S'Updated by' +p29418 +ssS'data_type' +p29419 +(dp29420 +S'editable' +p29421 +I00 +sS'value' +p29422 +S'entity' +p29423 +ssS'entity_type' +p29424 +(dp29425 +S'editable' +p29426 +I00 +sS'value' +p29427 +S'CustomEntity02' +p29428 +ssS'editable' +p29429 +(dp29430 +S'editable' +p29431 +I00 +sS'value' +p29432 +I00 +ssS'unique' +p29433 +(dp29434 +S'editable' +p29435 +I00 +sS'value' +p29436 +I00 +ssS'properties' +p29437 +(dp29438 +S'default_value' +p29439 +(dp29440 +S'editable' +p29441 +I00 +sS'value' +p29442 +NssS'summary_default' +p29443 +(dp29444 +S'editable' +p29445 +I01 +sS'value' +p29446 +S'none' +p29447 +ssS'valid_types' +p29448 +(dp29449 +S'editable' +p29450 +I01 +sS'value' +p29451 +(lp29452 +S'HumanUser' +p29453 +aS'ApiUser' +p29454 +asssS'description' +p29455 +(dp29456 +S'editable' +p29457 +I01 +sS'value' +p29458 +g47 +ssssS'CustomEntity03' +p29459 +(dp29460 +S'open_notes_count' +p29461 +(dp29462 +S'mandatory' +p29463 +(dp29464 +S'editable' +p29465 +I00 +sS'value' +p29466 +I00 +ssS'name' +p29467 +(dp29468 +S'editable' +p29469 +I01 +sS'value' +p29470 +S'Open Notes Count' +p29471 +ssS'data_type' +p29472 +(dp29473 +S'editable' +p29474 +I00 +sS'value' +p29475 +S'text' +p29476 +ssS'entity_type' +p29477 +(dp29478 +S'editable' +p29479 +I00 +sS'value' +p29480 +S'CustomEntity03' +p29481 +ssS'editable' +p29482 +(dp29483 +S'editable' +p29484 +I00 +sS'value' +p29485 +I00 +ssS'unique' +p29486 +(dp29487 +S'editable' +p29488 +I00 +sS'value' +p29489 +I00 +ssS'properties' +p29490 +(dp29491 +S'default_value' +p29492 +(dp29493 +S'editable' +p29494 +I00 +sS'value' +p29495 +NssS'summary_default' +p29496 +(dp29497 +S'editable' +p29498 +I01 +sS'value' +p29499 +S'none' +p29500 +sssS'description' +p29501 +(dp29502 +S'editable' +p29503 +I01 +sS'value' +p29504 +g47 +sssS'code' +p29505 +(dp29506 +S'mandatory' +p29507 +(dp29508 +S'editable' +p29509 +I00 +sS'value' +p29510 +I01 +ssS'name' +p29511 +(dp29512 +S'editable' +p29513 +I01 +sS'value' +p29514 +S'Custom Entity03 Name' +p29515 +ssS'data_type' +p29516 +(dp29517 +S'editable' +p29518 +I00 +sS'value' +p29519 +S'text' +p29520 +ssS'entity_type' +p29521 +(dp29522 +S'editable' +p29523 +I00 +sS'value' +p29524 +S'CustomEntity03' +p29525 +ssS'editable' +p29526 +(dp29527 +S'editable' +p29528 +I00 +sS'value' +p29529 +I01 +ssS'unique' +p29530 +(dp29531 +S'editable' +p29532 +I00 +sS'value' +p29533 +I00 +ssS'properties' +p29534 +(dp29535 +S'default_value' +p29536 +(dp29537 +S'editable' +p29538 +I00 +sS'value' +p29539 +NssS'summary_default' +p29540 +(dp29541 +S'editable' +p29542 +I01 +sS'value' +p29543 +S'none' +p29544 +sssS'description' +p29545 +(dp29546 +S'editable' +p29547 +I01 +sS'value' +p29548 +g47 +sssS'open_notes' +p29549 +(dp29550 +S'mandatory' +p29551 +(dp29552 +S'editable' +p29553 +I00 +sS'value' +p29554 +I00 +ssS'name' +p29555 +(dp29556 +S'editable' +p29557 +I01 +sS'value' +p29558 +S'Open Notes' +p29559 +ssS'data_type' +p29560 +(dp29561 +S'editable' +p29562 +I00 +sS'value' +p29563 +S'multi_entity' +p29564 +ssS'entity_type' +p29565 +(dp29566 +S'editable' +p29567 +I00 +sS'value' +p29568 +S'CustomEntity03' +p29569 +ssS'editable' +p29570 +(dp29571 +S'editable' +p29572 +I00 +sS'value' +p29573 +I00 +ssS'unique' +p29574 +(dp29575 +S'editable' +p29576 +I00 +sS'value' +p29577 +I00 +ssS'properties' +p29578 +(dp29579 +S'default_value' +p29580 +(dp29581 +S'editable' +p29582 +I00 +sS'value' +p29583 +NssS'summary_default' +p29584 +(dp29585 +S'editable' +p29586 +I01 +sS'value' +p29587 +S'none' +p29588 +ssS'valid_types' +p29589 +(dp29590 +S'editable' +p29591 +I01 +sS'value' +p29592 +(lp29593 +S'Note' +p29594 +asssS'description' +p29595 +(dp29596 +S'editable' +p29597 +I01 +sS'value' +p29598 +g47 +sssS'description' +p29599 +(dp29600 +S'mandatory' +p29601 +(dp29602 +S'editable' +p29603 +I00 +sS'value' +p29604 +I00 +ssS'name' +p29605 +(dp29606 +S'editable' +p29607 +I01 +sS'value' +p29608 +S'Description' +p29609 +ssS'data_type' +p29610 +(dp29611 +S'editable' +p29612 +I00 +sS'value' +p29613 +S'text' +p29614 +ssS'entity_type' +p29615 +(dp29616 +S'editable' +p29617 +I00 +sS'value' +p29618 +S'CustomEntity03' +p29619 +ssS'editable' +p29620 +(dp29621 +S'editable' +p29622 +I00 +sS'value' +p29623 +I01 +ssS'unique' +p29624 +(dp29625 +S'editable' +p29626 +I00 +sS'value' +p29627 +I00 +ssS'properties' +p29628 +(dp29629 +S'default_value' +p29630 +(dp29631 +S'editable' +p29632 +I00 +sS'value' +p29633 +NssS'summary_default' +p29634 +(dp29635 +S'editable' +p29636 +I01 +sS'value' +p29637 +S'none' +p29638 +sssS'description' +p29639 +(dp29640 +S'editable' +p29641 +I01 +sS'value' +p29642 +g47 +sssS'created_at' +p29643 +(dp29644 +S'mandatory' +p29645 +(dp29646 +S'editable' +p29647 +I00 +sS'value' +p29648 +I00 +ssS'name' +p29649 +(dp29650 +S'editable' +p29651 +I01 +sS'value' +p29652 +S'Date Created' +p29653 +ssS'data_type' +p29654 +(dp29655 +S'editable' +p29656 +I00 +sS'value' +p29657 +S'date_time' +p29658 +ssS'entity_type' +p29659 +(dp29660 +S'editable' +p29661 +I00 +sS'value' +p29662 +S'CustomEntity03' +p29663 +ssS'editable' +p29664 +(dp29665 +S'editable' +p29666 +I00 +sS'value' +p29667 +I00 +ssS'unique' +p29668 +(dp29669 +S'editable' +p29670 +I00 +sS'value' +p29671 +I00 +ssS'properties' +p29672 +(dp29673 +S'default_value' +p29674 +(dp29675 +S'editable' +p29676 +I00 +sS'value' +p29677 +NssS'summary_default' +p29678 +(dp29679 +S'editable' +p29680 +I01 +sS'value' +p29681 +S'none' +p29682 +sssS'description' +p29683 +(dp29684 +S'editable' +p29685 +I01 +sS'value' +p29686 +g47 +sssS'updated_at' +p29687 +(dp29688 +S'mandatory' +p29689 +(dp29690 +S'editable' +p29691 +I00 +sS'value' +p29692 +I00 +ssS'name' +p29693 +(dp29694 +S'editable' +p29695 +I01 +sS'value' +p29696 +S'Date Updated' +p29697 +ssS'data_type' +p29698 +(dp29699 +S'editable' +p29700 +I00 +sS'value' +p29701 +S'date_time' +p29702 +ssS'entity_type' +p29703 +(dp29704 +S'editable' +p29705 +I00 +sS'value' +p29706 +S'CustomEntity03' +p29707 +ssS'editable' +p29708 +(dp29709 +S'editable' +p29710 +I00 +sS'value' +p29711 +I00 +ssS'unique' +p29712 +(dp29713 +S'editable' +p29714 +I00 +sS'value' +p29715 +I00 +ssS'properties' +p29716 +(dp29717 +S'default_value' +p29718 +(dp29719 +S'editable' +p29720 +I00 +sS'value' +p29721 +NssS'summary_default' +p29722 +(dp29723 +S'editable' +p29724 +I01 +sS'value' +p29725 +S'none' +p29726 +sssS'description' +p29727 +(dp29728 +S'editable' +p29729 +I01 +sS'value' +p29730 +g47 +sssS'created_by' +p29731 +(dp29732 +S'mandatory' +p29733 +(dp29734 +S'editable' +p29735 +I00 +sS'value' +p29736 +I00 +ssS'name' +p29737 +(dp29738 +S'editable' +p29739 +I01 +sS'value' +p29740 +S'Created by' +p29741 +ssS'data_type' +p29742 +(dp29743 +S'editable' +p29744 +I00 +sS'value' +p29745 +S'entity' +p29746 +ssS'entity_type' +p29747 +(dp29748 +S'editable' +p29749 +I00 +sS'value' +p29750 +S'CustomEntity03' +p29751 +ssS'editable' +p29752 +(dp29753 +S'editable' +p29754 +I00 +sS'value' +p29755 +I00 +ssS'unique' +p29756 +(dp29757 +S'editable' +p29758 +I00 +sS'value' +p29759 +I00 +ssS'properties' +p29760 +(dp29761 +S'default_value' +p29762 +(dp29763 +S'editable' +p29764 +I00 +sS'value' +p29765 +NssS'summary_default' +p29766 +(dp29767 +S'editable' +p29768 +I01 +sS'value' +p29769 +S'none' +p29770 +ssS'valid_types' +p29771 +(dp29772 +S'editable' +p29773 +I01 +sS'value' +p29774 +(lp29775 +S'HumanUser' +p29776 +aS'ApiUser' +p29777 +asssS'description' +p29778 +(dp29779 +S'editable' +p29780 +I01 +sS'value' +p29781 +g47 +sssS'project' +p29782 +(dp29783 +S'mandatory' +p29784 +(dp29785 +S'editable' +p29786 +I00 +sS'value' +p29787 +I00 +ssS'name' +p29788 +(dp29789 +S'editable' +p29790 +I01 +sS'value' +p29791 +S'Project' +p29792 +ssS'data_type' +p29793 +(dp29794 +S'editable' +p29795 +I00 +sS'value' +p29796 +S'entity' +p29797 +ssS'entity_type' +p29798 +(dp29799 +S'editable' +p29800 +I00 +sS'value' +p29801 +S'CustomEntity03' +p29802 +ssS'editable' +p29803 +(dp29804 +S'editable' +p29805 +I00 +sS'value' +p29806 +I01 +ssS'unique' +p29807 +(dp29808 +S'editable' +p29809 +I00 +sS'value' +p29810 +I00 +ssS'properties' +p29811 +(dp29812 +S'default_value' +p29813 +(dp29814 +S'editable' +p29815 +I00 +sS'value' +p29816 +NssS'summary_default' +p29817 +(dp29818 +S'editable' +p29819 +I01 +sS'value' +p29820 +S'none' +p29821 +ssS'valid_types' +p29822 +(dp29823 +S'editable' +p29824 +I01 +sS'value' +p29825 +(lp29826 +S'Project' +p29827 +asssS'description' +p29828 +(dp29829 +S'editable' +p29830 +I01 +sS'value' +p29831 +g47 +sssS'filmstrip_image' +p29832 +(dp29833 +S'mandatory' +p29834 +(dp29835 +S'editable' +p29836 +I00 +sS'value' +p29837 +I00 +ssS'name' +p29838 +(dp29839 +S'editable' +p29840 +I01 +sS'value' +p29841 +S'Filmstrip Thumbnail' +p29842 +ssS'data_type' +p29843 +(dp29844 +S'editable' +p29845 +I00 +sS'value' +p29846 +S'image' +p29847 +ssS'entity_type' +p29848 +(dp29849 +S'editable' +p29850 +I00 +sS'value' +p29851 +S'CustomEntity03' +p29852 +ssS'editable' +p29853 +(dp29854 +S'editable' +p29855 +I00 +sS'value' +p29856 +I01 +ssS'unique' +p29857 +(dp29858 +S'editable' +p29859 +I00 +sS'value' +p29860 +I00 +ssS'properties' +p29861 +(dp29862 +S'default_value' +p29863 +(dp29864 +S'editable' +p29865 +I00 +sS'value' +p29866 +NssS'summary_default' +p29867 +(dp29868 +S'editable' +p29869 +I01 +sS'value' +p29870 +S'none' +p29871 +sssS'description' +p29872 +(dp29873 +S'editable' +p29874 +I01 +sS'value' +p29875 +g47 +sssS'sg_status_list' +p29876 +(dp29877 +S'mandatory' +p29878 +(dp29879 +S'editable' +p29880 +I00 +sS'value' +p29881 +I00 +ssS'name' +p29882 +(dp29883 +S'editable' +p29884 +I01 +sS'value' +p29885 +S'Status' +p29886 +ssS'data_type' +p29887 +(dp29888 +S'editable' +p29889 +I00 +sS'value' +p29890 +S'status_list' +p29891 +ssS'entity_type' +p29892 +(dp29893 +S'editable' +p29894 +I00 +sS'value' +p29895 +S'CustomEntity03' +p29896 +ssS'editable' +p29897 +(dp29898 +S'editable' +p29899 +I00 +sS'value' +p29900 +I01 +ssS'unique' +p29901 +(dp29902 +S'editable' +p29903 +I00 +sS'value' +p29904 +I00 +ssS'properties' +p29905 +(dp29906 +S'default_value' +p29907 +(dp29908 +S'editable' +p29909 +I01 +sS'value' +p29910 +S'wtg' +p29911 +ssS'valid_values' +p29912 +(dp29913 +S'editable' +p29914 +I01 +sS'value' +p29915 +(lp29916 +S'cmpt' +p29917 +aS'ip' +p29918 +aS'wtg' +p29919 +assS'summary_default' +p29920 +(dp29921 +S'editable' +p29922 +I01 +sS'value' +p29923 +S'none' +p29924 +sssS'description' +p29925 +(dp29926 +S'editable' +p29927 +I01 +sS'value' +p29928 +g47 +sssS'notes' +p29929 +(dp29930 +S'mandatory' +p29931 +(dp29932 +S'editable' +p29933 +I00 +sS'value' +p29934 +I00 +ssS'name' +p29935 +(dp29936 +S'editable' +p29937 +I01 +sS'value' +p29938 +S'Notes' +p29939 +ssS'data_type' +p29940 +(dp29941 +S'editable' +p29942 +I00 +sS'value' +p29943 +S'multi_entity' +p29944 +ssS'entity_type' +p29945 +(dp29946 +S'editable' +p29947 +I00 +sS'value' +p29948 +S'CustomEntity03' +p29949 +ssS'editable' +p29950 +(dp29951 +S'editable' +p29952 +I00 +sS'value' +p29953 +I01 +ssS'unique' +p29954 +(dp29955 +S'editable' +p29956 +I00 +sS'value' +p29957 +I00 +ssS'properties' +p29958 +(dp29959 +S'default_value' +p29960 +(dp29961 +S'editable' +p29962 +I00 +sS'value' +p29963 +NssS'summary_default' +p29964 +(dp29965 +S'editable' +p29966 +I01 +sS'value' +p29967 +S'none' +p29968 +ssS'valid_types' +p29969 +(dp29970 +S'editable' +p29971 +I01 +sS'value' +p29972 +(lp29973 +S'Note' +p29974 +asssS'description' +p29975 +(dp29976 +S'editable' +p29977 +I01 +sS'value' +p29978 +g47 +sssS'image' +p29979 +(dp29980 +S'mandatory' +p29981 +(dp29982 +S'editable' +p29983 +I00 +sS'value' +p29984 +I00 +ssS'name' +p29985 +(dp29986 +S'editable' +p29987 +I01 +sS'value' +p29988 +S'Thumbnail' +p29989 +ssS'data_type' +p29990 +(dp29991 +S'editable' +p29992 +I00 +sS'value' +p29993 +S'image' +p29994 +ssS'entity_type' +p29995 +(dp29996 +S'editable' +p29997 +I00 +sS'value' +p29998 +S'CustomEntity03' +p29999 +ssS'editable' +p30000 +(dp30001 +S'editable' +p30002 +I00 +sS'value' +p30003 +I01 +ssS'unique' +p30004 +(dp30005 +S'editable' +p30006 +I00 +sS'value' +p30007 +I00 +ssS'properties' +p30008 +(dp30009 +S'default_value' +p30010 +(dp30011 +S'editable' +p30012 +I00 +sS'value' +p30013 +NssS'summary_default' +p30014 +(dp30015 +S'editable' +p30016 +I01 +sS'value' +p30017 +S'none' +p30018 +sssS'description' +p30019 +(dp30020 +S'editable' +p30021 +I01 +sS'value' +p30022 +g47 +sssS'cached_display_name' +p30023 +(dp30024 +S'mandatory' +p30025 +(dp30026 +S'editable' +p30027 +I00 +sS'value' +p30028 +I00 +ssS'name' +p30029 +(dp30030 +S'editable' +p30031 +I01 +sS'value' +p30032 +S'Cached Display Name' +p30033 +ssS'data_type' +p30034 +(dp30035 +S'editable' +p30036 +I00 +sS'value' +p30037 +S'text' +p30038 +ssS'entity_type' +p30039 +(dp30040 +S'editable' +p30041 +I00 +sS'value' +p30042 +S'CustomEntity03' +p30043 +ssS'editable' +p30044 +(dp30045 +S'editable' +p30046 +I00 +sS'value' +p30047 +I01 +ssS'unique' +p30048 +(dp30049 +S'editable' +p30050 +I00 +sS'value' +p30051 +I00 +ssS'properties' +p30052 +(dp30053 +S'default_value' +p30054 +(dp30055 +S'editable' +p30056 +I00 +sS'value' +p30057 +NssS'summary_default' +p30058 +(dp30059 +S'editable' +p30060 +I00 +sS'value' +p30061 +S'none' +p30062 +sssS'description' +p30063 +(dp30064 +S'editable' +p30065 +I01 +sS'value' +p30066 +g47 +sssS'tag_list' +p30067 +(dp30068 +S'mandatory' +p30069 +(dp30070 +S'editable' +p30071 +I00 +sS'value' +p30072 +I00 +ssS'name' +p30073 +(dp30074 +S'editable' +p30075 +I01 +sS'value' +p30076 +S'Tags' +p30077 +ssS'data_type' +p30078 +(dp30079 +S'editable' +p30080 +I00 +sS'value' +p30081 +S'tag_list' +p30082 +ssS'entity_type' +p30083 +(dp30084 +S'editable' +p30085 +I00 +sS'value' +p30086 +S'CustomEntity03' +p30087 +ssS'editable' +p30088 +(dp30089 +S'editable' +p30090 +I00 +sS'value' +p30091 +I01 +ssS'unique' +p30092 +(dp30093 +S'editable' +p30094 +I00 +sS'value' +p30095 +I00 +ssS'properties' +p30096 +(dp30097 +S'default_value' +p30098 +(dp30099 +S'editable' +p30100 +I00 +sS'value' +p30101 +NssS'summary_default' +p30102 +(dp30103 +S'editable' +p30104 +I01 +sS'value' +p30105 +S'none' +p30106 +ssS'valid_types' +p30107 +(dp30108 +S'editable' +p30109 +I01 +sS'value' +p30110 +(lp30111 +S'Tag' +p30112 +asssS'description' +p30113 +(dp30114 +S'editable' +p30115 +I01 +sS'value' +p30116 +g47 +sssS'id' +p30117 +(dp30118 +S'mandatory' +p30119 +(dp30120 +S'editable' +p30121 +I00 +sS'value' +p30122 +I00 +ssS'name' +p30123 +(dp30124 +S'editable' +p30125 +I01 +sS'value' +p30126 +S'Id' +p30127 +ssS'data_type' +p30128 +(dp30129 +S'editable' +p30130 +I00 +sS'value' +p30131 +S'number' +p30132 +ssS'entity_type' +p30133 +(dp30134 +S'editable' +p30135 +I00 +sS'value' +p30136 +S'CustomEntity03' +p30137 +ssS'editable' +p30138 +(dp30139 +S'editable' +p30140 +I00 +sS'value' +p30141 +I00 +ssS'unique' +p30142 +(dp30143 +S'editable' +p30144 +I00 +sS'value' +p30145 +I00 +ssS'properties' +p30146 +(dp30147 +S'default_value' +p30148 +(dp30149 +S'editable' +p30150 +I00 +sS'value' +p30151 +NssS'summary_default' +p30152 +(dp30153 +S'editable' +p30154 +I01 +sS'value' +p30155 +S'none' +p30156 +sssS'description' +p30157 +(dp30158 +S'editable' +p30159 +I01 +sS'value' +p30160 +g47 +sssS'updated_by' +p30161 +(dp30162 +S'mandatory' +p30163 +(dp30164 +S'editable' +p30165 +I00 +sS'value' +p30166 +I00 +ssS'name' +p30167 +(dp30168 +S'editable' +p30169 +I01 +sS'value' +p30170 +S'Updated by' +p30171 +ssS'data_type' +p30172 +(dp30173 +S'editable' +p30174 +I00 +sS'value' +p30175 +S'entity' +p30176 +ssS'entity_type' +p30177 +(dp30178 +S'editable' +p30179 +I00 +sS'value' +p30180 +S'CustomEntity03' +p30181 +ssS'editable' +p30182 +(dp30183 +S'editable' +p30184 +I00 +sS'value' +p30185 +I00 +ssS'unique' +p30186 +(dp30187 +S'editable' +p30188 +I00 +sS'value' +p30189 +I00 +ssS'properties' +p30190 +(dp30191 +S'default_value' +p30192 +(dp30193 +S'editable' +p30194 +I00 +sS'value' +p30195 +NssS'summary_default' +p30196 +(dp30197 +S'editable' +p30198 +I01 +sS'value' +p30199 +S'none' +p30200 +ssS'valid_types' +p30201 +(dp30202 +S'editable' +p30203 +I01 +sS'value' +p30204 +(lp30205 +S'HumanUser' +p30206 +aS'ApiUser' +p30207 +asssS'description' +p30208 +(dp30209 +S'editable' +p30210 +I01 +sS'value' +p30211 +g47 +ssssS'FilesystemLocation' +p30212 +(dp30213 +S'code' +p30214 +(dp30215 +S'mandatory' +p30216 +(dp30217 +S'editable' +p30218 +I00 +sS'value' +p30219 +I01 +ssS'name' +p30220 +(dp30221 +S'editable' +p30222 +I01 +sS'value' +p30223 +S'FilesystemLocation Name' +p30224 +ssS'data_type' +p30225 +(dp30226 +S'editable' +p30227 +I00 +sS'value' +p30228 +S'text' +p30229 +ssS'entity_type' +p30230 +(dp30231 +S'editable' +p30232 +I00 +sS'value' +p30233 +S'FilesystemLocation' +p30234 +ssS'editable' +p30235 +(dp30236 +S'editable' +p30237 +I00 +sS'value' +p30238 +I01 +ssS'unique' +p30239 +(dp30240 +S'editable' +p30241 +I00 +sS'value' +p30242 +I00 +ssS'properties' +p30243 +(dp30244 +S'default_value' +p30245 +(dp30246 +S'editable' +p30247 +I00 +sS'value' +p30248 +NssS'summary_default' +p30249 +(dp30250 +S'editable' +p30251 +I00 +sS'value' +p30252 +S'none' +p30253 +sssS'description' +p30254 +(dp30255 +S'editable' +p30256 +I01 +sS'value' +p30257 +g47 +sssS'linked_entity_type' +p30258 +(dp30259 +S'mandatory' +p30260 +(dp30261 +S'editable' +p30262 +I00 +sS'value' +p30263 +I00 +ssS'name' +p30264 +(dp30265 +S'editable' +p30266 +I01 +sS'value' +p30267 +S'Linked Entity Type' +p30268 +ssS'data_type' +p30269 +(dp30270 +S'editable' +p30271 +I00 +sS'value' +p30272 +S'text' +p30273 +ssS'entity_type' +p30274 +(dp30275 +S'editable' +p30276 +I00 +sS'value' +p30277 +S'FilesystemLocation' +p30278 +ssS'editable' +p30279 +(dp30280 +S'editable' +p30281 +I00 +sS'value' +p30282 +I01 +ssS'unique' +p30283 +(dp30284 +S'editable' +p30285 +I00 +sS'value' +p30286 +I00 +ssS'properties' +p30287 +(dp30288 +S'default_value' +p30289 +(dp30290 +S'editable' +p30291 +I00 +sS'value' +p30292 +NssS'summary_default' +p30293 +(dp30294 +S'editable' +p30295 +I01 +sS'value' +p30296 +S'none' +p30297 +sssS'description' +p30298 +(dp30299 +S'editable' +p30300 +I01 +sS'value' +p30301 +g47 +sssS'linked_entity_id' +p30302 +(dp30303 +S'mandatory' +p30304 +(dp30305 +S'editable' +p30306 +I00 +sS'value' +p30307 +I00 +ssS'name' +p30308 +(dp30309 +S'editable' +p30310 +I01 +sS'value' +p30311 +S'Linked Entity Id' +p30312 +ssS'data_type' +p30313 +(dp30314 +S'editable' +p30315 +I00 +sS'value' +p30316 +S'number' +p30317 +ssS'entity_type' +p30318 +(dp30319 +S'editable' +p30320 +I00 +sS'value' +p30321 +S'FilesystemLocation' +p30322 +ssS'editable' +p30323 +(dp30324 +S'editable' +p30325 +I00 +sS'value' +p30326 +I01 +ssS'unique' +p30327 +(dp30328 +S'editable' +p30329 +I00 +sS'value' +p30330 +I00 +ssS'properties' +p30331 +(dp30332 +S'default_value' +p30333 +(dp30334 +S'editable' +p30335 +I00 +sS'value' +p30336 +NssS'summary_default' +p30337 +(dp30338 +S'editable' +p30339 +I01 +sS'value' +p30340 +S'none' +p30341 +sssS'description' +p30342 +(dp30343 +S'editable' +p30344 +I01 +sS'value' +p30345 +g47 +sssS'is_primary' +p30346 +(dp30347 +S'mandatory' +p30348 +(dp30349 +S'editable' +p30350 +I00 +sS'value' +p30351 +I00 +ssS'name' +p30352 +(dp30353 +S'editable' +p30354 +I01 +sS'value' +p30355 +S'Primary' +p30356 +ssS'data_type' +p30357 +(dp30358 +S'editable' +p30359 +I00 +sS'value' +p30360 +S'checkbox' +p30361 +ssS'entity_type' +p30362 +(dp30363 +S'editable' +p30364 +I00 +sS'value' +p30365 +S'FilesystemLocation' +p30366 +ssS'editable' +p30367 +(dp30368 +S'editable' +p30369 +I00 +sS'value' +p30370 +I01 +ssS'unique' +p30371 +(dp30372 +S'editable' +p30373 +I00 +sS'value' +p30374 +I00 +ssS'properties' +p30375 +(dp30376 +S'default_value' +p30377 +(dp30378 +S'editable' +p30379 +I00 +sS'value' +p30380 +NssS'summary_default' +p30381 +(dp30382 +S'editable' +p30383 +I01 +sS'value' +p30384 +S'none' +p30385 +sssS'description' +p30386 +(dp30387 +S'editable' +p30388 +I01 +sS'value' +p30389 +g47 +sssS'created_at' +p30390 +(dp30391 +S'mandatory' +p30392 +(dp30393 +S'editable' +p30394 +I00 +sS'value' +p30395 +I00 +ssS'name' +p30396 +(dp30397 +S'editable' +p30398 +I01 +sS'value' +p30399 +S'Date Created' +p30400 +ssS'data_type' +p30401 +(dp30402 +S'editable' +p30403 +I00 +sS'value' +p30404 +S'date_time' +p30405 +ssS'entity_type' +p30406 +(dp30407 +S'editable' +p30408 +I00 +sS'value' +p30409 +S'FilesystemLocation' +p30410 +ssS'editable' +p30411 +(dp30412 +S'editable' +p30413 +I00 +sS'value' +p30414 +I00 +ssS'unique' +p30415 +(dp30416 +S'editable' +p30417 +I00 +sS'value' +p30418 +I00 +ssS'properties' +p30419 +(dp30420 +S'default_value' +p30421 +(dp30422 +S'editable' +p30423 +I00 +sS'value' +p30424 +NssS'summary_default' +p30425 +(dp30426 +S'editable' +p30427 +I01 +sS'value' +p30428 +S'none' +p30429 +sssS'description' +p30430 +(dp30431 +S'editable' +p30432 +I01 +sS'value' +p30433 +g47 +sssS'updated_at' +p30434 +(dp30435 +S'mandatory' +p30436 +(dp30437 +S'editable' +p30438 +I00 +sS'value' +p30439 +I00 +ssS'name' +p30440 +(dp30441 +S'editable' +p30442 +I01 +sS'value' +p30443 +S'Date Updated' +p30444 +ssS'data_type' +p30445 +(dp30446 +S'editable' +p30447 +I00 +sS'value' +p30448 +S'date_time' +p30449 +ssS'entity_type' +p30450 +(dp30451 +S'editable' +p30452 +I00 +sS'value' +p30453 +S'FilesystemLocation' +p30454 +ssS'editable' +p30455 +(dp30456 +S'editable' +p30457 +I00 +sS'value' +p30458 +I00 +ssS'unique' +p30459 +(dp30460 +S'editable' +p30461 +I00 +sS'value' +p30462 +I00 +ssS'properties' +p30463 +(dp30464 +S'default_value' +p30465 +(dp30466 +S'editable' +p30467 +I00 +sS'value' +p30468 +NssS'summary_default' +p30469 +(dp30470 +S'editable' +p30471 +I01 +sS'value' +p30472 +S'none' +p30473 +sssS'description' +p30474 +(dp30475 +S'editable' +p30476 +I01 +sS'value' +p30477 +g47 +sssS'created_by' +p30478 +(dp30479 +S'mandatory' +p30480 +(dp30481 +S'editable' +p30482 +I00 +sS'value' +p30483 +I00 +ssS'name' +p30484 +(dp30485 +S'editable' +p30486 +I01 +sS'value' +p30487 +S'Created by' +p30488 +ssS'data_type' +p30489 +(dp30490 +S'editable' +p30491 +I00 +sS'value' +p30492 +S'entity' +p30493 +ssS'entity_type' +p30494 +(dp30495 +S'editable' +p30496 +I00 +sS'value' +p30497 +S'FilesystemLocation' +p30498 +ssS'editable' +p30499 +(dp30500 +S'editable' +p30501 +I00 +sS'value' +p30502 +I00 +ssS'unique' +p30503 +(dp30504 +S'editable' +p30505 +I00 +sS'value' +p30506 +I00 +ssS'properties' +p30507 +(dp30508 +S'default_value' +p30509 +(dp30510 +S'editable' +p30511 +I00 +sS'value' +p30512 +NssS'summary_default' +p30513 +(dp30514 +S'editable' +p30515 +I01 +sS'value' +p30516 +S'none' +p30517 +ssS'valid_types' +p30518 +(dp30519 +S'editable' +p30520 +I01 +sS'value' +p30521 +(lp30522 +S'HumanUser' +p30523 +aS'ApiUser' +p30524 +asssS'description' +p30525 +(dp30526 +S'editable' +p30527 +I01 +sS'value' +p30528 +g47 +sssS'entity' +p30529 +(dp30530 +S'mandatory' +p30531 +(dp30532 +S'editable' +p30533 +I00 +sS'value' +p30534 +I00 +ssS'name' +p30535 +(dp30536 +S'editable' +p30537 +I01 +sS'value' +p30538 +S'Link' +p30539 +ssS'data_type' +p30540 +(dp30541 +S'editable' +p30542 +I00 +sS'value' +p30543 +S'entity' +p30544 +ssS'entity_type' +p30545 +(dp30546 +S'editable' +p30547 +I00 +sS'value' +p30548 +S'FilesystemLocation' +p30549 +ssS'editable' +p30550 +(dp30551 +S'editable' +p30552 +I00 +sS'value' +p30553 +I01 +ssS'unique' +p30554 +(dp30555 +S'editable' +p30556 +I00 +sS'value' +p30557 +I00 +ssS'properties' +p30558 +(dp30559 +S'default_value' +p30560 +(dp30561 +S'editable' +p30562 +I00 +sS'value' +p30563 +NssS'summary_default' +p30564 +(dp30565 +S'editable' +p30566 +I01 +sS'value' +p30567 +S'none' +p30568 +ssS'valid_types' +p30569 +(dp30570 +S'editable' +p30571 +I01 +sS'value' +p30572 +(lp30573 +S'Asset' +p30574 +aS'Shot' +p30575 +aS'Sequence' +p30576 +asssS'description' +p30577 +(dp30578 +S'editable' +p30579 +I01 +sS'value' +p30580 +g47 +sssS'project' +p30581 +(dp30582 +S'mandatory' +p30583 +(dp30584 +S'editable' +p30585 +I00 +sS'value' +p30586 +I00 +ssS'name' +p30587 +(dp30588 +S'editable' +p30589 +I01 +sS'value' +p30590 +S'Project' +p30591 +ssS'data_type' +p30592 +(dp30593 +S'editable' +p30594 +I00 +sS'value' +p30595 +S'entity' +p30596 +ssS'entity_type' +p30597 +(dp30598 +S'editable' +p30599 +I00 +sS'value' +p30600 +S'FilesystemLocation' +p30601 +ssS'editable' +p30602 +(dp30603 +S'editable' +p30604 +I00 +sS'value' +p30605 +I01 +ssS'unique' +p30606 +(dp30607 +S'editable' +p30608 +I00 +sS'value' +p30609 +I00 +ssS'properties' +p30610 +(dp30611 +S'default_value' +p30612 +(dp30613 +S'editable' +p30614 +I00 +sS'value' +p30615 +NssS'summary_default' +p30616 +(dp30617 +S'editable' +p30618 +I01 +sS'value' +p30619 +S'none' +p30620 +ssS'valid_types' +p30621 +(dp30622 +S'editable' +p30623 +I01 +sS'value' +p30624 +(lp30625 +S'Project' +p30626 +asssS'description' +p30627 +(dp30628 +S'editable' +p30629 +I01 +sS'value' +p30630 +g47 +sssS'updated_by' +p30631 +(dp30632 +S'mandatory' +p30633 +(dp30634 +S'editable' +p30635 +I00 +sS'value' +p30636 +I00 +ssS'name' +p30637 +(dp30638 +S'editable' +p30639 +I01 +sS'value' +p30640 +S'Updated by' +p30641 +ssS'data_type' +p30642 +(dp30643 +S'editable' +p30644 +I00 +sS'value' +p30645 +S'entity' +p30646 +ssS'entity_type' +p30647 +(dp30648 +S'editable' +p30649 +I00 +sS'value' +p30650 +S'FilesystemLocation' +p30651 +ssS'editable' +p30652 +(dp30653 +S'editable' +p30654 +I00 +sS'value' +p30655 +I00 +ssS'unique' +p30656 +(dp30657 +S'editable' +p30658 +I00 +sS'value' +p30659 +I00 +ssS'properties' +p30660 +(dp30661 +S'default_value' +p30662 +(dp30663 +S'editable' +p30664 +I00 +sS'value' +p30665 +NssS'summary_default' +p30666 +(dp30667 +S'editable' +p30668 +I01 +sS'value' +p30669 +S'none' +p30670 +ssS'valid_types' +p30671 +(dp30672 +S'editable' +p30673 +I01 +sS'value' +p30674 +(lp30675 +S'HumanUser' +p30676 +aS'ApiUser' +p30677 +asssS'description' +p30678 +(dp30679 +S'editable' +p30680 +I01 +sS'value' +p30681 +g47 +sssS'configuration_metadata' +p30682 +(dp30683 +S'mandatory' +p30684 +(dp30685 +S'editable' +p30686 +I00 +sS'value' +p30687 +I00 +ssS'name' +p30688 +(dp30689 +S'editable' +p30690 +I01 +sS'value' +p30691 +S'Configuration Metadata' +p30692 +ssS'data_type' +p30693 +(dp30694 +S'editable' +p30695 +I00 +sS'value' +p30696 +S'text' +p30697 +ssS'entity_type' +p30698 +(dp30699 +S'editable' +p30700 +I00 +sS'value' +p30701 +S'FilesystemLocation' +p30702 +ssS'editable' +p30703 +(dp30704 +S'editable' +p30705 +I00 +sS'value' +p30706 +I01 +ssS'unique' +p30707 +(dp30708 +S'editable' +p30709 +I00 +sS'value' +p30710 +I00 +ssS'properties' +p30711 +(dp30712 +S'default_value' +p30713 +(dp30714 +S'editable' +p30715 +I00 +sS'value' +p30716 +NssS'summary_default' +p30717 +(dp30718 +S'editable' +p30719 +I01 +sS'value' +p30720 +S'none' +p30721 +sssS'description' +p30722 +(dp30723 +S'editable' +p30724 +I01 +sS'value' +p30725 +g47 +sssS'path' +p30726 +(dp30727 +S'mandatory' +p30728 +(dp30729 +S'editable' +p30730 +I00 +sS'value' +p30731 +I00 +ssS'name' +p30732 +(dp30733 +S'editable' +p30734 +I01 +sS'value' +p30735 +S'Path' +p30736 +ssS'data_type' +p30737 +(dp30738 +S'editable' +p30739 +I00 +sS'value' +p30740 +S'url' +p30741 +ssS'entity_type' +p30742 +(dp30743 +S'editable' +p30744 +I00 +sS'value' +p30745 +S'FilesystemLocation' +p30746 +ssS'editable' +p30747 +(dp30748 +S'editable' +p30749 +I00 +sS'value' +p30750 +I01 +ssS'unique' +p30751 +(dp30752 +S'editable' +p30753 +I00 +sS'value' +p30754 +I00 +ssS'properties' +p30755 +(dp30756 +S'default_value' +p30757 +(dp30758 +S'editable' +p30759 +I00 +sS'value' +p30760 +NssS'open_in_new_window' +p30761 +(dp30762 +S'editable' +p30763 +I01 +sS'value' +p30764 +I01 +ssS'summary_default' +p30765 +(dp30766 +S'editable' +p30767 +I01 +sS'value' +p30768 +S'none' +p30769 +sssS'description' +p30770 +(dp30771 +S'editable' +p30772 +I01 +sS'value' +p30773 +g47 +sssS'id' +p30774 +(dp30775 +S'mandatory' +p30776 +(dp30777 +S'editable' +p30778 +I00 +sS'value' +p30779 +I00 +ssS'name' +p30780 +(dp30781 +S'editable' +p30782 +I01 +sS'value' +p30783 +S'Id' +p30784 +ssS'data_type' +p30785 +(dp30786 +S'editable' +p30787 +I00 +sS'value' +p30788 +S'number' +p30789 +ssS'entity_type' +p30790 +(dp30791 +S'editable' +p30792 +I00 +sS'value' +p30793 +S'FilesystemLocation' +p30794 +ssS'editable' +p30795 +(dp30796 +S'editable' +p30797 +I00 +sS'value' +p30798 +I00 +ssS'unique' +p30799 +(dp30800 +S'editable' +p30801 +I00 +sS'value' +p30802 +I00 +ssS'properties' +p30803 +(dp30804 +S'default_value' +p30805 +(dp30806 +S'editable' +p30807 +I00 +sS'value' +p30808 +NssS'summary_default' +p30809 +(dp30810 +S'editable' +p30811 +I00 +sS'value' +p30812 +S'none' +p30813 +sssS'description' +p30814 +(dp30815 +S'editable' +p30816 +I01 +sS'value' +p30817 +g47 +sssS'pipeline_configuration' +p30818 +(dp30819 +S'mandatory' +p30820 +(dp30821 +S'editable' +p30822 +I00 +sS'value' +p30823 +I00 +ssS'name' +p30824 +(dp30825 +S'editable' +p30826 +I01 +sS'value' +p30827 +S'Pipeline Configuration' +p30828 +ssS'data_type' +p30829 +(dp30830 +S'editable' +p30831 +I00 +sS'value' +p30832 +S'entity' +p30833 +ssS'entity_type' +p30834 +(dp30835 +S'editable' +p30836 +I00 +sS'value' +p30837 +S'FilesystemLocation' +p30838 +ssS'editable' +p30839 +(dp30840 +S'editable' +p30841 +I00 +sS'value' +p30842 +I01 +ssS'unique' +p30843 +(dp30844 +S'editable' +p30845 +I00 +sS'value' +p30846 +I00 +ssS'properties' +p30847 +(dp30848 +S'default_value' +p30849 +(dp30850 +S'editable' +p30851 +I00 +sS'value' +p30852 +NssS'summary_default' +p30853 +(dp30854 +S'editable' +p30855 +I01 +sS'value' +p30856 +S'none' +p30857 +ssS'valid_types' +p30858 +(dp30859 +S'editable' +p30860 +I01 +sS'value' +p30861 +(lp30862 +S'PipelineConfiguration' +p30863 +asssS'description' +p30864 +(dp30865 +S'editable' +p30866 +I01 +sS'value' +p30867 +g47 +ssssS'CustomEntity01' +p30868 +(dp30869 +S'open_notes_count' +p30870 +(dp30871 +S'mandatory' +p30872 +(dp30873 +S'editable' +p30874 +I00 +sS'value' +p30875 +I00 +ssS'name' +p30876 +(dp30877 +S'editable' +p30878 +I01 +sS'value' +p30879 +S'Open Notes Count' +p30880 +ssS'data_type' +p30881 +(dp30882 +S'editable' +p30883 +I00 +sS'value' +p30884 +S'text' +p30885 +ssS'entity_type' +p30886 +(dp30887 +S'editable' +p30888 +I00 +sS'value' +p30889 +S'CustomEntity01' +p30890 +ssS'editable' +p30891 +(dp30892 +S'editable' +p30893 +I00 +sS'value' +p30894 +I00 +ssS'unique' +p30895 +(dp30896 +S'editable' +p30897 +I00 +sS'value' +p30898 +I00 +ssS'properties' +p30899 +(dp30900 +S'default_value' +p30901 +(dp30902 +S'editable' +p30903 +I00 +sS'value' +p30904 +NssS'summary_default' +p30905 +(dp30906 +S'editable' +p30907 +I01 +sS'value' +p30908 +S'none' +p30909 +sssS'description' +p30910 +(dp30911 +S'editable' +p30912 +I01 +sS'value' +p30913 +g47 +sssS'code' +p30914 +(dp30915 +S'mandatory' +p30916 +(dp30917 +S'editable' +p30918 +I00 +sS'value' +p30919 +I01 +ssS'name' +p30920 +(dp30921 +S'editable' +p30922 +I01 +sS'value' +p30923 +S'Disk Location Name' +p30924 +ssS'data_type' +p30925 +(dp30926 +S'editable' +p30927 +I00 +sS'value' +p30928 +S'text' +p30929 +ssS'entity_type' +p30930 +(dp30931 +S'editable' +p30932 +I00 +sS'value' +p30933 +S'CustomEntity01' +p30934 +ssS'editable' +p30935 +(dp30936 +S'editable' +p30937 +I00 +sS'value' +p30938 +I01 +ssS'unique' +p30939 +(dp30940 +S'editable' +p30941 +I00 +sS'value' +p30942 +I00 +ssS'properties' +p30943 +(dp30944 +S'default_value' +p30945 +(dp30946 +S'editable' +p30947 +I00 +sS'value' +p30948 +NssS'summary_default' +p30949 +(dp30950 +S'editable' +p30951 +I01 +sS'value' +p30952 +S'none' +p30953 +sssS'description' +p30954 +(dp30955 +S'editable' +p30956 +I01 +sS'value' +p30957 +g47 +sssS'image' +p30958 +(dp30959 +S'mandatory' +p30960 +(dp30961 +S'editable' +p30962 +I00 +sS'value' +p30963 +I00 +ssS'name' +p30964 +(dp30965 +S'editable' +p30966 +I01 +sS'value' +p30967 +S'Thumbnail' +p30968 +ssS'data_type' +p30969 +(dp30970 +S'editable' +p30971 +I00 +sS'value' +p30972 +S'image' +p30973 +ssS'entity_type' +p30974 +(dp30975 +S'editable' +p30976 +I00 +sS'value' +p30977 +S'CustomEntity01' +p30978 +ssS'editable' +p30979 +(dp30980 +S'editable' +p30981 +I00 +sS'value' +p30982 +I01 +ssS'unique' +p30983 +(dp30984 +S'editable' +p30985 +I00 +sS'value' +p30986 +I00 +ssS'properties' +p30987 +(dp30988 +S'default_value' +p30989 +(dp30990 +S'editable' +p30991 +I00 +sS'value' +p30992 +NssS'summary_default' +p30993 +(dp30994 +S'editable' +p30995 +I01 +sS'value' +p30996 +S'none' +p30997 +sssS'description' +p30998 +(dp30999 +S'editable' +p31000 +I01 +sS'value' +p31001 +g47 +sssS'updated_at' +p31002 +(dp31003 +S'mandatory' +p31004 +(dp31005 +S'editable' +p31006 +I00 +sS'value' +p31007 +I00 +ssS'name' +p31008 +(dp31009 +S'editable' +p31010 +I01 +sS'value' +p31011 +S'Date Updated' +p31012 +ssS'data_type' +p31013 +(dp31014 +S'editable' +p31015 +I00 +sS'value' +p31016 +S'date_time' +p31017 +ssS'entity_type' +p31018 +(dp31019 +S'editable' +p31020 +I00 +sS'value' +p31021 +S'CustomEntity01' +p31022 +ssS'editable' +p31023 +(dp31024 +S'editable' +p31025 +I00 +sS'value' +p31026 +I00 +ssS'unique' +p31027 +(dp31028 +S'editable' +p31029 +I00 +sS'value' +p31030 +I00 +ssS'properties' +p31031 +(dp31032 +S'default_value' +p31033 +(dp31034 +S'editable' +p31035 +I00 +sS'value' +p31036 +NssS'summary_default' +p31037 +(dp31038 +S'editable' +p31039 +I01 +sS'value' +p31040 +S'none' +p31041 +sssS'description' +p31042 +(dp31043 +S'editable' +p31044 +I01 +sS'value' +p31045 +g47 +sssS'cached_display_name' +p31046 +(dp31047 +S'mandatory' +p31048 +(dp31049 +S'editable' +p31050 +I00 +sS'value' +p31051 +I00 +ssS'name' +p31052 +(dp31053 +S'editable' +p31054 +I01 +sS'value' +p31055 +S'Cached Display Name' +p31056 +ssS'data_type' +p31057 +(dp31058 +S'editable' +p31059 +I00 +sS'value' +p31060 +S'text' +p31061 +ssS'entity_type' +p31062 +(dp31063 +S'editable' +p31064 +I00 +sS'value' +p31065 +S'CustomEntity01' +p31066 +ssS'editable' +p31067 +(dp31068 +S'editable' +p31069 +I00 +sS'value' +p31070 +I01 +ssS'unique' +p31071 +(dp31072 +S'editable' +p31073 +I00 +sS'value' +p31074 +I00 +ssS'properties' +p31075 +(dp31076 +S'default_value' +p31077 +(dp31078 +S'editable' +p31079 +I00 +sS'value' +p31080 +NssS'summary_default' +p31081 +(dp31082 +S'editable' +p31083 +I00 +sS'value' +p31084 +S'none' +p31085 +sssS'description' +p31086 +(dp31087 +S'editable' +p31088 +I01 +sS'value' +p31089 +g47 +sssS'id' +p31090 +(dp31091 +S'mandatory' +p31092 +(dp31093 +S'editable' +p31094 +I00 +sS'value' +p31095 +I00 +ssS'name' +p31096 +(dp31097 +S'editable' +p31098 +I01 +sS'value' +p31099 +S'Id' +p31100 +ssS'data_type' +p31101 +(dp31102 +S'editable' +p31103 +I00 +sS'value' +p31104 +S'number' +p31105 +ssS'entity_type' +p31106 +(dp31107 +S'editable' +p31108 +I00 +sS'value' +p31109 +S'CustomEntity01' +p31110 +ssS'editable' +p31111 +(dp31112 +S'editable' +p31113 +I00 +sS'value' +p31114 +I00 +ssS'unique' +p31115 +(dp31116 +S'editable' +p31117 +I00 +sS'value' +p31118 +I00 +ssS'properties' +p31119 +(dp31120 +S'default_value' +p31121 +(dp31122 +S'editable' +p31123 +I00 +sS'value' +p31124 +NssS'summary_default' +p31125 +(dp31126 +S'editable' +p31127 +I01 +sS'value' +p31128 +S'none' +p31129 +sssS'description' +p31130 +(dp31131 +S'editable' +p31132 +I01 +sS'value' +p31133 +g47 +sssS'updated_by' +p31134 +(dp31135 +S'mandatory' +p31136 +(dp31137 +S'editable' +p31138 +I00 +sS'value' +p31139 +I00 +ssS'name' +p31140 +(dp31141 +S'editable' +p31142 +I01 +sS'value' +p31143 +S'Updated by' +p31144 +ssS'data_type' +p31145 +(dp31146 +S'editable' +p31147 +I00 +sS'value' +p31148 +S'entity' +p31149 +ssS'entity_type' +p31150 +(dp31151 +S'editable' +p31152 +I00 +sS'value' +p31153 +S'CustomEntity01' +p31154 +ssS'editable' +p31155 +(dp31156 +S'editable' +p31157 +I00 +sS'value' +p31158 +I00 +ssS'unique' +p31159 +(dp31160 +S'editable' +p31161 +I00 +sS'value' +p31162 +I00 +ssS'properties' +p31163 +(dp31164 +S'default_value' +p31165 +(dp31166 +S'editable' +p31167 +I00 +sS'value' +p31168 +NssS'summary_default' +p31169 +(dp31170 +S'editable' +p31171 +I01 +sS'value' +p31172 +S'none' +p31173 +ssS'valid_types' +p31174 +(dp31175 +S'editable' +p31176 +I01 +sS'value' +p31177 +(lp31178 +S'HumanUser' +p31179 +aS'ApiUser' +p31180 +asssS'description' +p31181 +(dp31182 +S'editable' +p31183 +I01 +sS'value' +p31184 +g47 +sssS'open_notes' +p31185 +(dp31186 +S'mandatory' +p31187 +(dp31188 +S'editable' +p31189 +I00 +sS'value' +p31190 +I00 +ssS'name' +p31191 +(dp31192 +S'editable' +p31193 +I01 +sS'value' +p31194 +S'Open Notes' +p31195 +ssS'data_type' +p31196 +(dp31197 +S'editable' +p31198 +I00 +sS'value' +p31199 +S'multi_entity' +p31200 +ssS'entity_type' +p31201 +(dp31202 +S'editable' +p31203 +I00 +sS'value' +p31204 +S'CustomEntity01' +p31205 +ssS'editable' +p31206 +(dp31207 +S'editable' +p31208 +I00 +sS'value' +p31209 +I00 +ssS'unique' +p31210 +(dp31211 +S'editable' +p31212 +I00 +sS'value' +p31213 +I00 +ssS'properties' +p31214 +(dp31215 +S'default_value' +p31216 +(dp31217 +S'editable' +p31218 +I00 +sS'value' +p31219 +NssS'summary_default' +p31220 +(dp31221 +S'editable' +p31222 +I01 +sS'value' +p31223 +S'none' +p31224 +ssS'valid_types' +p31225 +(dp31226 +S'editable' +p31227 +I01 +sS'value' +p31228 +(lp31229 +S'Note' +p31230 +asssS'description' +p31231 +(dp31232 +S'editable' +p31233 +I01 +sS'value' +p31234 +g47 +sssS'sg_metadata' +p31235 +(dp31236 +S'mandatory' +p31237 +(dp31238 +S'editable' +p31239 +I00 +sS'value' +p31240 +I00 +ssS'name' +p31241 +(dp31242 +S'editable' +p31243 +I01 +sS'value' +p31244 +S'metadata' +p31245 +ssS'data_type' +p31246 +(dp31247 +S'editable' +p31248 +I00 +sS'value' +p31249 +S'text' +p31250 +ssS'entity_type' +p31251 +(dp31252 +S'editable' +p31253 +I00 +sS'value' +p31254 +S'CustomEntity01' +p31255 +ssS'editable' +p31256 +(dp31257 +S'editable' +p31258 +I00 +sS'value' +p31259 +I01 +ssS'unique' +p31260 +(dp31261 +S'editable' +p31262 +I00 +sS'value' +p31263 +I00 +ssS'properties' +p31264 +(dp31265 +S'default_value' +p31266 +(dp31267 +S'editable' +p31268 +I00 +sS'value' +p31269 +NssS'summary_default' +p31270 +(dp31271 +S'editable' +p31272 +I01 +sS'value' +p31273 +S'none' +p31274 +sssS'description' +p31275 +(dp31276 +S'editable' +p31277 +I01 +sS'value' +p31278 +g47 +sssS'created_by' +p31279 +(dp31280 +S'mandatory' +p31281 +(dp31282 +S'editable' +p31283 +I00 +sS'value' +p31284 +I00 +ssS'name' +p31285 +(dp31286 +S'editable' +p31287 +I01 +sS'value' +p31288 +S'Created by' +p31289 +ssS'data_type' +p31290 +(dp31291 +S'editable' +p31292 +I00 +sS'value' +p31293 +S'entity' +p31294 +ssS'entity_type' +p31295 +(dp31296 +S'editable' +p31297 +I00 +sS'value' +p31298 +S'CustomEntity01' +p31299 +ssS'editable' +p31300 +(dp31301 +S'editable' +p31302 +I00 +sS'value' +p31303 +I00 +ssS'unique' +p31304 +(dp31305 +S'editable' +p31306 +I00 +sS'value' +p31307 +I00 +ssS'properties' +p31308 +(dp31309 +S'default_value' +p31310 +(dp31311 +S'editable' +p31312 +I00 +sS'value' +p31313 +NssS'summary_default' +p31314 +(dp31315 +S'editable' +p31316 +I01 +sS'value' +p31317 +S'none' +p31318 +ssS'valid_types' +p31319 +(dp31320 +S'editable' +p31321 +I01 +sS'value' +p31322 +(lp31323 +S'HumanUser' +p31324 +aS'ApiUser' +p31325 +asssS'description' +p31326 +(dp31327 +S'editable' +p31328 +I01 +sS'value' +p31329 +g47 +sssS'sg_path' +p31330 +(dp31331 +S'mandatory' +p31332 +(dp31333 +S'editable' +p31334 +I00 +sS'value' +p31335 +I00 +ssS'name' +p31336 +(dp31337 +S'editable' +p31338 +I01 +sS'value' +p31339 +S'Path' +p31340 +ssS'data_type' +p31341 +(dp31342 +S'editable' +p31343 +I00 +sS'value' +p31344 +S'url' +p31345 +ssS'entity_type' +p31346 +(dp31347 +S'editable' +p31348 +I00 +sS'value' +p31349 +S'CustomEntity01' +p31350 +ssS'editable' +p31351 +(dp31352 +S'editable' +p31353 +I00 +sS'value' +p31354 +I01 +ssS'unique' +p31355 +(dp31356 +S'editable' +p31357 +I00 +sS'value' +p31358 +I00 +ssS'properties' +p31359 +(dp31360 +S'default_value' +p31361 +(dp31362 +S'editable' +p31363 +I00 +sS'value' +p31364 +NssS'open_in_new_window' +p31365 +(dp31366 +S'editable' +p31367 +I01 +sS'value' +p31368 +I01 +ssS'summary_default' +p31369 +(dp31370 +S'editable' +p31371 +I01 +sS'value' +p31372 +S'none' +p31373 +sssS'description' +p31374 +(dp31375 +S'editable' +p31376 +I01 +sS'value' +p31377 +g47 +sssS'sg_status_list' +p31378 +(dp31379 +S'mandatory' +p31380 +(dp31381 +S'editable' +p31382 +I00 +sS'value' +p31383 +I00 +ssS'name' +p31384 +(dp31385 +S'editable' +p31386 +I01 +sS'value' +p31387 +S'Status' +p31388 +ssS'data_type' +p31389 +(dp31390 +S'editable' +p31391 +I00 +sS'value' +p31392 +S'status_list' +p31393 +ssS'entity_type' +p31394 +(dp31395 +S'editable' +p31396 +I00 +sS'value' +p31397 +S'CustomEntity01' +p31398 +ssS'editable' +p31399 +(dp31400 +S'editable' +p31401 +I00 +sS'value' +p31402 +I01 +ssS'unique' +p31403 +(dp31404 +S'editable' +p31405 +I00 +sS'value' +p31406 +I00 +ssS'properties' +p31407 +(dp31408 +S'default_value' +p31409 +(dp31410 +S'editable' +p31411 +I01 +sS'value' +p31412 +S'wtg' +p31413 +ssS'valid_values' +p31414 +(dp31415 +S'editable' +p31416 +I01 +sS'value' +p31417 +(lp31418 +S'cmpt' +p31419 +aS'ip' +p31420 +aS'wtg' +p31421 +assS'summary_default' +p31422 +(dp31423 +S'editable' +p31424 +I01 +sS'value' +p31425 +S'none' +p31426 +sssS'description' +p31427 +(dp31428 +S'editable' +p31429 +I01 +sS'value' +p31430 +g47 +sssS'sg_entity_name' +p31431 +(dp31432 +S'mandatory' +p31433 +(dp31434 +S'editable' +p31435 +I00 +sS'value' +p31436 +I00 +ssS'name' +p31437 +(dp31438 +S'editable' +p31439 +I01 +sS'value' +p31440 +S'Entity Name' +p31441 +ssS'data_type' +p31442 +(dp31443 +S'editable' +p31444 +I00 +sS'value' +p31445 +S'text' +p31446 +ssS'entity_type' +p31447 +(dp31448 +S'editable' +p31449 +I00 +sS'value' +p31450 +S'CustomEntity01' +p31451 +ssS'editable' +p31452 +(dp31453 +S'editable' +p31454 +I00 +sS'value' +p31455 +I01 +ssS'unique' +p31456 +(dp31457 +S'editable' +p31458 +I00 +sS'value' +p31459 +I00 +ssS'properties' +p31460 +(dp31461 +S'default_value' +p31462 +(dp31463 +S'editable' +p31464 +I00 +sS'value' +p31465 +NssS'summary_default' +p31466 +(dp31467 +S'editable' +p31468 +I01 +sS'value' +p31469 +S'none' +p31470 +sssS'description' +p31471 +(dp31472 +S'editable' +p31473 +I01 +sS'value' +p31474 +g47 +sssS'sg_secondary_entities' +p31475 +(dp31476 +S'mandatory' +p31477 +(dp31478 +S'editable' +p31479 +I00 +sS'value' +p31480 +I00 +ssS'name' +p31481 +(dp31482 +S'editable' +p31483 +I01 +sS'value' +p31484 +S'Secondary Entities' +p31485 +ssS'data_type' +p31486 +(dp31487 +S'editable' +p31488 +I00 +sS'value' +p31489 +S'text' +p31490 +ssS'entity_type' +p31491 +(dp31492 +S'editable' +p31493 +I00 +sS'value' +p31494 +S'CustomEntity01' +p31495 +ssS'editable' +p31496 +(dp31497 +S'editable' +p31498 +I00 +sS'value' +p31499 +I01 +ssS'unique' +p31500 +(dp31501 +S'editable' +p31502 +I00 +sS'value' +p31503 +I00 +ssS'properties' +p31504 +(dp31505 +S'default_value' +p31506 +(dp31507 +S'editable' +p31508 +I00 +sS'value' +p31509 +NssS'summary_default' +p31510 +(dp31511 +S'editable' +p31512 +I01 +sS'value' +p31513 +S'none' +p31514 +sssS'description' +p31515 +(dp31516 +S'editable' +p31517 +I01 +sS'value' +p31518 +g47 +sssS'sg_entity' +p31519 +(dp31520 +S'mandatory' +p31521 +(dp31522 +S'editable' +p31523 +I00 +sS'value' +p31524 +I00 +ssS'name' +p31525 +(dp31526 +S'editable' +p31527 +I01 +sS'value' +p31528 +S'Entity' +p31529 +ssS'data_type' +p31530 +(dp31531 +S'editable' +p31532 +I00 +sS'value' +p31533 +S'entity' +p31534 +ssS'entity_type' +p31535 +(dp31536 +S'editable' +p31537 +I00 +sS'value' +p31538 +S'CustomEntity01' +p31539 +ssS'editable' +p31540 +(dp31541 +S'editable' +p31542 +I00 +sS'value' +p31543 +I01 +ssS'unique' +p31544 +(dp31545 +S'editable' +p31546 +I00 +sS'value' +p31547 +I00 +ssS'properties' +p31548 +(dp31549 +S'default_value' +p31550 +(dp31551 +S'editable' +p31552 +I00 +sS'value' +p31553 +NssS'summary_default' +p31554 +(dp31555 +S'editable' +p31556 +I01 +sS'value' +p31557 +S'none' +p31558 +ssS'valid_types' +p31559 +(dp31560 +S'editable' +p31561 +I01 +sS'value' +p31562 +(lp31563 +S'Asset' +p31564 +aS'Booking' +p31565 +aS'Department' +p31566 +aS'CustomEntity01' +p31567 +aS'Attachment' +p31568 +aS'Group' +p31569 +aS'Note' +p31570 +aS'Page' +p31571 +aS'HumanUser' +p31572 +aS'Phase' +p31573 +aS'Playlist' +p31574 +aS'PipelineConfiguration' +p31575 +aS'Project' +p31576 +aS'PublishedFileDependency' +p31577 +aS'PublishedFile' +p31578 +aS'PublishedFileType' +p31579 +aS'ApiUser' +p31580 +aS'Sequence' +p31581 +aS'Shot' +p31582 +aS'Step' +p31583 +aS'TankDependency' +p31584 +aS'TankPublishedFile' +p31585 +aS'TankType' +p31586 +aS'Task' +p31587 +aS'TimeLog' +p31588 +aS'Version' +p31589 +aS'TaskTemplate' +p31590 +asssS'description' +p31591 +(dp31592 +S'editable' +p31593 +I01 +sS'value' +p31594 +g47 +sssS'description' +p31595 +(dp31596 +S'mandatory' +p31597 +(dp31598 +S'editable' +p31599 +I00 +sS'value' +p31600 +I00 +ssS'name' +p31601 +(dp31602 +S'editable' +p31603 +I01 +sS'value' +p31604 +S'Description' +p31605 +ssS'data_type' +p31606 +(dp31607 +S'editable' +p31608 +I00 +sS'value' +p31609 +S'text' +p31610 +ssS'entity_type' +p31611 +(dp31612 +S'editable' +p31613 +I00 +sS'value' +p31614 +S'CustomEntity01' +p31615 +ssS'editable' +p31616 +(dp31617 +S'editable' +p31618 +I00 +sS'value' +p31619 +I01 +ssS'unique' +p31620 +(dp31621 +S'editable' +p31622 +I00 +sS'value' +p31623 +I00 +ssS'properties' +p31624 +(dp31625 +S'default_value' +p31626 +(dp31627 +S'editable' +p31628 +I00 +sS'value' +p31629 +NssS'summary_default' +p31630 +(dp31631 +S'editable' +p31632 +I01 +sS'value' +p31633 +S'none' +p31634 +sssS'description' +p31635 +(dp31636 +S'editable' +p31637 +I01 +sS'value' +p31638 +g47 +sssS'sg_pipeline_configuration' +p31639 +(dp31640 +S'mandatory' +p31641 +(dp31642 +S'editable' +p31643 +I00 +sS'value' +p31644 +I00 +ssS'name' +p31645 +(dp31646 +S'editable' +p31647 +I01 +sS'value' +p31648 +S'Pipeline Configuration' +p31649 +ssS'data_type' +p31650 +(dp31651 +S'editable' +p31652 +I00 +sS'value' +p31653 +S'entity' +p31654 +ssS'entity_type' +p31655 +(dp31656 +S'editable' +p31657 +I00 +sS'value' +p31658 +S'CustomEntity01' +p31659 +ssS'editable' +p31660 +(dp31661 +S'editable' +p31662 +I00 +sS'value' +p31663 +I01 +ssS'unique' +p31664 +(dp31665 +S'editable' +p31666 +I00 +sS'value' +p31667 +I00 +ssS'properties' +p31668 +(dp31669 +S'default_value' +p31670 +(dp31671 +S'editable' +p31672 +I00 +sS'value' +p31673 +NssS'summary_default' +p31674 +(dp31675 +S'editable' +p31676 +I01 +sS'value' +p31677 +S'none' +p31678 +ssS'valid_types' +p31679 +(dp31680 +S'editable' +p31681 +I01 +sS'value' +p31682 +(lp31683 +S'PipelineConfiguration' +p31684 +asssS'description' +p31685 +(dp31686 +S'editable' +p31687 +I01 +sS'value' +p31688 +g47 +sssS'sg_primary' +p31689 +(dp31690 +S'mandatory' +p31691 +(dp31692 +S'editable' +p31693 +I00 +sS'value' +p31694 +I00 +ssS'name' +p31695 +(dp31696 +S'editable' +p31697 +I01 +sS'value' +p31698 +S'Primary' +p31699 +ssS'data_type' +p31700 +(dp31701 +S'editable' +p31702 +I00 +sS'value' +p31703 +S'checkbox' +p31704 +ssS'entity_type' +p31705 +(dp31706 +S'editable' +p31707 +I00 +sS'value' +p31708 +S'CustomEntity01' +p31709 +ssS'editable' +p31710 +(dp31711 +S'editable' +p31712 +I00 +sS'value' +p31713 +I01 +ssS'unique' +p31714 +(dp31715 +S'editable' +p31716 +I00 +sS'value' +p31717 +I00 +ssS'properties' +p31718 +(dp31719 +S'default_value' +p31720 +(dp31721 +S'editable' +p31722 +I00 +sS'value' +p31723 +I00 +ssS'summary_default' +p31724 +(dp31725 +S'editable' +p31726 +I01 +sS'value' +p31727 +S'none' +p31728 +sssS'description' +p31729 +(dp31730 +S'editable' +p31731 +I01 +sS'value' +p31732 +g47 +sssS'sg_id_at_creation' +p31733 +(dp31734 +S'mandatory' +p31735 +(dp31736 +S'editable' +p31737 +I00 +sS'value' +p31738 +I00 +ssS'name' +p31739 +(dp31740 +S'editable' +p31741 +I01 +sS'value' +p31742 +S'Id At Creation' +p31743 +ssS'data_type' +p31744 +(dp31745 +S'editable' +p31746 +I00 +sS'value' +p31747 +S'number' +p31748 +ssS'entity_type' +p31749 +(dp31750 +S'editable' +p31751 +I00 +sS'value' +p31752 +S'CustomEntity01' +p31753 +ssS'editable' +p31754 +(dp31755 +S'editable' +p31756 +I00 +sS'value' +p31757 +I01 +ssS'unique' +p31758 +(dp31759 +S'editable' +p31760 +I00 +sS'value' +p31761 +I00 +ssS'properties' +p31762 +(dp31763 +S'default_value' +p31764 +(dp31765 +S'editable' +p31766 +I00 +sS'value' +p31767 +NssS'summary_default' +p31768 +(dp31769 +S'editable' +p31770 +I01 +sS'value' +p31771 +S'none' +p31772 +sssS'description' +p31773 +(dp31774 +S'editable' +p31775 +I01 +sS'value' +p31776 +g47 +sssS'sg_name_at_creation' +p31777 +(dp31778 +S'mandatory' +p31779 +(dp31780 +S'editable' +p31781 +I00 +sS'value' +p31782 +I00 +ssS'name' +p31783 +(dp31784 +S'editable' +p31785 +I01 +sS'value' +p31786 +S'Name At Creation' +p31787 +ssS'data_type' +p31788 +(dp31789 +S'editable' +p31790 +I00 +sS'value' +p31791 +S'text' +p31792 +ssS'entity_type' +p31793 +(dp31794 +S'editable' +p31795 +I00 +sS'value' +p31796 +S'CustomEntity01' +p31797 +ssS'editable' +p31798 +(dp31799 +S'editable' +p31800 +I00 +sS'value' +p31801 +I01 +ssS'unique' +p31802 +(dp31803 +S'editable' +p31804 +I00 +sS'value' +p31805 +I00 +ssS'properties' +p31806 +(dp31807 +S'default_value' +p31808 +(dp31809 +S'editable' +p31810 +I00 +sS'value' +p31811 +NssS'summary_default' +p31812 +(dp31813 +S'editable' +p31814 +I01 +sS'value' +p31815 +S'none' +p31816 +sssS'description' +p31817 +(dp31818 +S'editable' +p31819 +I01 +sS'value' +p31820 +g47 +sssS'sg_root' +p31821 +(dp31822 +S'mandatory' +p31823 +(dp31824 +S'editable' +p31825 +I00 +sS'value' +p31826 +I00 +ssS'name' +p31827 +(dp31828 +S'editable' +p31829 +I01 +sS'value' +p31830 +S'Root' +p31831 +ssS'data_type' +p31832 +(dp31833 +S'editable' +p31834 +I00 +sS'value' +p31835 +S'text' +p31836 +ssS'entity_type' +p31837 +(dp31838 +S'editable' +p31839 +I00 +sS'value' +p31840 +S'CustomEntity01' +p31841 +ssS'editable' +p31842 +(dp31843 +S'editable' +p31844 +I00 +sS'value' +p31845 +I01 +ssS'unique' +p31846 +(dp31847 +S'editable' +p31848 +I00 +sS'value' +p31849 +I00 +ssS'properties' +p31850 +(dp31851 +S'default_value' +p31852 +(dp31853 +S'editable' +p31854 +I00 +sS'value' +p31855 +NssS'summary_default' +p31856 +(dp31857 +S'editable' +p31858 +I01 +sS'value' +p31859 +S'none' +p31860 +sssS'description' +p31861 +(dp31862 +S'editable' +p31863 +I01 +sS'value' +p31864 +g47 +sssS'sg_entity_type_1' +p31865 +(dp31866 +S'mandatory' +p31867 +(dp31868 +S'editable' +p31869 +I00 +sS'value' +p31870 +I00 +ssS'name' +p31871 +(dp31872 +S'editable' +p31873 +I01 +sS'value' +p31874 +S'Entity Type' +p31875 +ssS'data_type' +p31876 +(dp31877 +S'editable' +p31878 +I00 +sS'value' +p31879 +S'text' +p31880 +ssS'entity_type' +p31881 +(dp31882 +S'editable' +p31883 +I00 +sS'value' +p31884 +S'CustomEntity01' +p31885 +ssS'editable' +p31886 +(dp31887 +S'editable' +p31888 +I00 +sS'value' +p31889 +I01 +ssS'unique' +p31890 +(dp31891 +S'editable' +p31892 +I00 +sS'value' +p31893 +I00 +ssS'properties' +p31894 +(dp31895 +S'default_value' +p31896 +(dp31897 +S'editable' +p31898 +I00 +sS'value' +p31899 +NssS'summary_default' +p31900 +(dp31901 +S'editable' +p31902 +I01 +sS'value' +p31903 +S'none' +p31904 +sssS'description' +p31905 +(dp31906 +S'editable' +p31907 +I01 +sS'value' +p31908 +g47 +sssS'notes' +p31909 +(dp31910 +S'mandatory' +p31911 +(dp31912 +S'editable' +p31913 +I00 +sS'value' +p31914 +I00 +ssS'name' +p31915 +(dp31916 +S'editable' +p31917 +I01 +sS'value' +p31918 +S'Notes' +p31919 +ssS'data_type' +p31920 +(dp31921 +S'editable' +p31922 +I00 +sS'value' +p31923 +S'multi_entity' +p31924 +ssS'entity_type' +p31925 +(dp31926 +S'editable' +p31927 +I00 +sS'value' +p31928 +S'CustomEntity01' +p31929 +ssS'editable' +p31930 +(dp31931 +S'editable' +p31932 +I00 +sS'value' +p31933 +I01 +ssS'unique' +p31934 +(dp31935 +S'editable' +p31936 +I00 +sS'value' +p31937 +I00 +ssS'properties' +p31938 +(dp31939 +S'default_value' +p31940 +(dp31941 +S'editable' +p31942 +I00 +sS'value' +p31943 +NssS'summary_default' +p31944 +(dp31945 +S'editable' +p31946 +I01 +sS'value' +p31947 +S'none' +p31948 +ssS'valid_types' +p31949 +(dp31950 +S'editable' +p31951 +I01 +sS'value' +p31952 +(lp31953 +S'Note' +p31954 +asssS'description' +p31955 +(dp31956 +S'editable' +p31957 +I01 +sS'value' +p31958 +g47 +sssS'sg_relative_path' +p31959 +(dp31960 +S'mandatory' +p31961 +(dp31962 +S'editable' +p31963 +I00 +sS'value' +p31964 +I00 +ssS'name' +p31965 +(dp31966 +S'editable' +p31967 +I01 +sS'value' +p31968 +S'Relative Path' +p31969 +ssS'data_type' +p31970 +(dp31971 +S'editable' +p31972 +I00 +sS'value' +p31973 +S'text' +p31974 +ssS'entity_type' +p31975 +(dp31976 +S'editable' +p31977 +I00 +sS'value' +p31978 +S'CustomEntity01' +p31979 +ssS'editable' +p31980 +(dp31981 +S'editable' +p31982 +I00 +sS'value' +p31983 +I01 +ssS'unique' +p31984 +(dp31985 +S'editable' +p31986 +I00 +sS'value' +p31987 +I00 +ssS'properties' +p31988 +(dp31989 +S'default_value' +p31990 +(dp31991 +S'editable' +p31992 +I00 +sS'value' +p31993 +NssS'summary_default' +p31994 +(dp31995 +S'editable' +p31996 +I01 +sS'value' +p31997 +S'none' +p31998 +sssS'description' +p31999 +(dp32000 +S'editable' +p32001 +I01 +sS'value' +p32002 +g47 +sssS'project' +p32003 +(dp32004 +S'mandatory' +p32005 +(dp32006 +S'editable' +p32007 +I00 +sS'value' +p32008 +I00 +ssS'name' +p32009 +(dp32010 +S'editable' +p32011 +I01 +sS'value' +p32012 +S'Project' +p32013 +ssS'data_type' +p32014 +(dp32015 +S'editable' +p32016 +I00 +sS'value' +p32017 +S'entity' +p32018 +ssS'entity_type' +p32019 +(dp32020 +S'editable' +p32021 +I00 +sS'value' +p32022 +S'CustomEntity01' +p32023 +ssS'editable' +p32024 +(dp32025 +S'editable' +p32026 +I00 +sS'value' +p32027 +I01 +ssS'unique' +p32028 +(dp32029 +S'editable' +p32030 +I00 +sS'value' +p32031 +I00 +ssS'properties' +p32032 +(dp32033 +S'default_value' +p32034 +(dp32035 +S'editable' +p32036 +I00 +sS'value' +p32037 +NssS'summary_default' +p32038 +(dp32039 +S'editable' +p32040 +I01 +sS'value' +p32041 +S'none' +p32042 +ssS'valid_types' +p32043 +(dp32044 +S'editable' +p32045 +I01 +sS'value' +p32046 +(lp32047 +S'Project' +p32048 +asssS'description' +p32049 +(dp32050 +S'editable' +p32051 +I01 +sS'value' +p32052 +g47 +sssS'filmstrip_image' +p32053 +(dp32054 +S'mandatory' +p32055 +(dp32056 +S'editable' +p32057 +I00 +sS'value' +p32058 +I00 +ssS'name' +p32059 +(dp32060 +S'editable' +p32061 +I01 +sS'value' +p32062 +S'Filmstrip Thumbnail' +p32063 +ssS'data_type' +p32064 +(dp32065 +S'editable' +p32066 +I00 +sS'value' +p32067 +S'image' +p32068 +ssS'entity_type' +p32069 +(dp32070 +S'editable' +p32071 +I00 +sS'value' +p32072 +S'CustomEntity01' +p32073 +ssS'editable' +p32074 +(dp32075 +S'editable' +p32076 +I00 +sS'value' +p32077 +I01 +ssS'unique' +p32078 +(dp32079 +S'editable' +p32080 +I00 +sS'value' +p32081 +I00 +ssS'properties' +p32082 +(dp32083 +S'default_value' +p32084 +(dp32085 +S'editable' +p32086 +I00 +sS'value' +p32087 +NssS'summary_default' +p32088 +(dp32089 +S'editable' +p32090 +I01 +sS'value' +p32091 +S'none' +p32092 +sssS'description' +p32093 +(dp32094 +S'editable' +p32095 +I01 +sS'value' +p32096 +g47 +sssS'sg_type_at_creation' +p32097 +(dp32098 +S'mandatory' +p32099 +(dp32100 +S'editable' +p32101 +I00 +sS'value' +p32102 +I00 +ssS'name' +p32103 +(dp32104 +S'editable' +p32105 +I01 +sS'value' +p32106 +S'Type At Creation' +p32107 +ssS'data_type' +p32108 +(dp32109 +S'editable' +p32110 +I00 +sS'value' +p32111 +S'text' +p32112 +ssS'entity_type' +p32113 +(dp32114 +S'editable' +p32115 +I00 +sS'value' +p32116 +S'CustomEntity01' +p32117 +ssS'editable' +p32118 +(dp32119 +S'editable' +p32120 +I00 +sS'value' +p32121 +I01 +ssS'unique' +p32122 +(dp32123 +S'editable' +p32124 +I00 +sS'value' +p32125 +I00 +ssS'properties' +p32126 +(dp32127 +S'default_value' +p32128 +(dp32129 +S'editable' +p32130 +I00 +sS'value' +p32131 +NssS'summary_default' +p32132 +(dp32133 +S'editable' +p32134 +I01 +sS'value' +p32135 +S'none' +p32136 +sssS'description' +p32137 +(dp32138 +S'editable' +p32139 +I01 +sS'value' +p32140 +g47 +sssS'tag_list' +p32141 +(dp32142 +S'mandatory' +p32143 +(dp32144 +S'editable' +p32145 +I00 +sS'value' +p32146 +I00 +ssS'name' +p32147 +(dp32148 +S'editable' +p32149 +I01 +sS'value' +p32150 +S'Tags' +p32151 +ssS'data_type' +p32152 +(dp32153 +S'editable' +p32154 +I00 +sS'value' +p32155 +S'tag_list' +p32156 +ssS'entity_type' +p32157 +(dp32158 +S'editable' +p32159 +I00 +sS'value' +p32160 +S'CustomEntity01' +p32161 +ssS'editable' +p32162 +(dp32163 +S'editable' +p32164 +I00 +sS'value' +p32165 +I01 +ssS'unique' +p32166 +(dp32167 +S'editable' +p32168 +I00 +sS'value' +p32169 +I00 +ssS'properties' +p32170 +(dp32171 +S'default_value' +p32172 +(dp32173 +S'editable' +p32174 +I00 +sS'value' +p32175 +NssS'summary_default' +p32176 +(dp32177 +S'editable' +p32178 +I01 +sS'value' +p32179 +S'none' +p32180 +ssS'valid_types' +p32181 +(dp32182 +S'editable' +p32183 +I01 +sS'value' +p32184 +(lp32185 +S'Tag' +p32186 +asssS'description' +p32187 +(dp32188 +S'editable' +p32189 +I01 +sS'value' +p32190 +g47 +sssS'created_at' +p32191 +(dp32192 +S'mandatory' +p32193 +(dp32194 +S'editable' +p32195 +I00 +sS'value' +p32196 +I00 +ssS'name' +p32197 +(dp32198 +S'editable' +p32199 +I01 +sS'value' +p32200 +S'Date Created' +p32201 +ssS'data_type' +p32202 +(dp32203 +S'editable' +p32204 +I00 +sS'value' +p32205 +S'date_time' +p32206 +ssS'entity_type' +p32207 +(dp32208 +S'editable' +p32209 +I00 +sS'value' +p32210 +S'CustomEntity01' +p32211 +ssS'editable' +p32212 +(dp32213 +S'editable' +p32214 +I00 +sS'value' +p32215 +I00 +ssS'unique' +p32216 +(dp32217 +S'editable' +p32218 +I00 +sS'value' +p32219 +I00 +ssS'properties' +p32220 +(dp32221 +S'default_value' +p32222 +(dp32223 +S'editable' +p32224 +I00 +sS'value' +p32225 +NssS'summary_default' +p32226 +(dp32227 +S'editable' +p32228 +I01 +sS'value' +p32229 +S'none' +p32230 +sssS'description' +p32231 +(dp32232 +S'editable' +p32233 +I01 +sS'value' +p32234 +g47 +sssS'sg_configuration_metadata' +p32235 +(dp32236 +S'mandatory' +p32237 +(dp32238 +S'editable' +p32239 +I00 +sS'value' +p32240 +I00 +ssS'name' +p32241 +(dp32242 +S'editable' +p32243 +I01 +sS'value' +p32244 +S'Configuration Metadata' +p32245 +ssS'data_type' +p32246 +(dp32247 +S'editable' +p32248 +I00 +sS'value' +p32249 +S'text' +p32250 +ssS'entity_type' +p32251 +(dp32252 +S'editable' +p32253 +I00 +sS'value' +p32254 +S'CustomEntity01' +p32255 +ssS'editable' +p32256 +(dp32257 +S'editable' +p32258 +I00 +sS'value' +p32259 +I01 +ssS'unique' +p32260 +(dp32261 +S'editable' +p32262 +I00 +sS'value' +p32263 +I00 +ssS'properties' +p32264 +(dp32265 +S'default_value' +p32266 +(dp32267 +S'editable' +p32268 +I00 +sS'value' +p32269 +NssS'summary_default' +p32270 +(dp32271 +S'editable' +p32272 +I01 +sS'value' +p32273 +S'none' +p32274 +sssS'description' +p32275 +(dp32276 +S'editable' +p32277 +I01 +sS'value' +p32278 +g47 +ssssS'Shot' +p32279 +(dp32280 +S'open_notes_count' +p32281 +(dp32282 +S'mandatory' +p32283 +(dp32284 +S'editable' +p32285 +I00 +sS'value' +p32286 +I00 +ssS'name' +p32287 +(dp32288 +S'editable' +p32289 +I01 +sS'value' +p32290 +S'Open Notes Count' +p32291 +ssS'data_type' +p32292 +(dp32293 +S'editable' +p32294 +I00 +sS'value' +p32295 +S'text' +p32296 +ssS'entity_type' +p32297 +(dp32298 +S'editable' +p32299 +I00 +sS'value' +p32300 +S'Shot' +p32301 +ssS'editable' +p32302 +(dp32303 +S'editable' +p32304 +I00 +sS'value' +p32305 +I00 +ssS'unique' +p32306 +(dp32307 +S'editable' +p32308 +I00 +sS'value' +p32309 +I00 +ssS'properties' +p32310 +(dp32311 +S'default_value' +p32312 +(dp32313 +S'editable' +p32314 +I00 +sS'value' +p32315 +NssS'summary_default' +p32316 +(dp32317 +S'editable' +p32318 +I01 +sS'value' +p32319 +S'none' +p32320 +sssS'description' +p32321 +(dp32322 +S'editable' +p32323 +I01 +sS'value' +p32324 +g47 +sssS'code' +p32325 +(dp32326 +S'mandatory' +p32327 +(dp32328 +S'editable' +p32329 +I00 +sS'value' +p32330 +I01 +ssS'name' +p32331 +(dp32332 +S'editable' +p32333 +I01 +sS'value' +p32334 +S'Shot Code' +p32335 +ssS'data_type' +p32336 +(dp32337 +S'editable' +p32338 +I00 +sS'value' +p32339 +S'text' +p32340 +ssS'entity_type' +p32341 +(dp32342 +S'editable' +p32343 +I00 +sS'value' +p32344 +S'Shot' +p32345 +ssS'editable' +p32346 +(dp32347 +S'editable' +p32348 +I00 +sS'value' +p32349 +I01 +ssS'unique' +p32350 +(dp32351 +S'editable' +p32352 +I00 +sS'value' +p32353 +I00 +ssS'properties' +p32354 +(dp32355 +S'default_value' +p32356 +(dp32357 +S'editable' +p32358 +I00 +sS'value' +p32359 +NssS'summary_default' +p32360 +(dp32361 +S'editable' +p32362 +I01 +sS'value' +p32363 +S'none' +p32364 +sssS'description' +p32365 +(dp32366 +S'editable' +p32367 +I01 +sS'value' +p32368 +g47 +sssS'step_13' +p32369 +(dp32370 +S'mandatory' +p32371 +(dp32372 +S'editable' +p32373 +I00 +sS'value' +p32374 +I00 +ssS'name' +p32375 +(dp32376 +S'editable' +p32377 +I01 +sS'value' +p32378 +S'Layout' +p32379 +ssS'data_type' +p32380 +(dp32381 +S'editable' +p32382 +I00 +sS'value' +p32383 +S'pivot_column' +p32384 +ssS'entity_type' +p32385 +(dp32386 +S'editable' +p32387 +I00 +sS'value' +p32388 +S'Shot' +p32389 +ssS'editable' +p32390 +(dp32391 +S'editable' +p32392 +I00 +sS'value' +p32393 +I00 +ssS'unique' +p32394 +(dp32395 +S'editable' +p32396 +I00 +sS'value' +p32397 +I00 +ssS'properties' +p32398 +(dp32399 +S'default_value' +p32400 +(dp32401 +S'editable' +p32402 +I00 +sS'value' +p32403 +NssS'summary_default' +p32404 +(dp32405 +S'editable' +p32406 +I00 +sS'value' +p32407 +S'none' +p32408 +sssS'description' +p32409 +(dp32410 +S'editable' +p32411 +I01 +sS'value' +p32412 +g47 +sssS'smart_head_out' +p32413 +(dp32414 +S'mandatory' +p32415 +(dp32416 +S'editable' +p32417 +I00 +sS'value' +p32418 +I00 +ssS'name' +p32419 +(dp32420 +S'editable' +p32421 +I01 +sS'value' +p32422 +S'Head Out' +p32423 +ssS'data_type' +p32424 +(dp32425 +S'editable' +p32426 +I00 +sS'value' +p32427 +S'number' +p32428 +ssS'entity_type' +p32429 +(dp32430 +S'editable' +p32431 +I00 +sS'value' +p32432 +S'Shot' +p32433 +ssS'editable' +p32434 +(dp32435 +S'editable' +p32436 +I00 +sS'value' +p32437 +I01 +ssS'unique' +p32438 +(dp32439 +S'editable' +p32440 +I00 +sS'value' +p32441 +I00 +ssS'properties' +p32442 +(dp32443 +S'default_value' +p32444 +(dp32445 +S'editable' +p32446 +I00 +sS'value' +p32447 +NssS'summary_default' +p32448 +(dp32449 +S'editable' +p32450 +I01 +sS'value' +p32451 +S'none' +p32452 +sssS'description' +p32453 +(dp32454 +S'editable' +p32455 +I01 +sS'value' +p32456 +g47 +sssS'sg_sequence' +p32457 +(dp32458 +S'mandatory' +p32459 +(dp32460 +S'editable' +p32461 +I00 +sS'value' +p32462 +I00 +ssS'name' +p32463 +(dp32464 +S'editable' +p32465 +I01 +sS'value' +p32466 +S'Sequence' +p32467 +ssS'data_type' +p32468 +(dp32469 +S'editable' +p32470 +I00 +sS'value' +p32471 +S'entity' +p32472 +ssS'entity_type' +p32473 +(dp32474 +S'editable' +p32475 +I00 +sS'value' +p32476 +S'Shot' +p32477 +ssS'editable' +p32478 +(dp32479 +S'editable' +p32480 +I00 +sS'value' +p32481 +I01 +ssS'unique' +p32482 +(dp32483 +S'editable' +p32484 +I00 +sS'value' +p32485 +I00 +ssS'properties' +p32486 +(dp32487 +S'default_value' +p32488 +(dp32489 +S'editable' +p32490 +I00 +sS'value' +p32491 +NssS'summary_default' +p32492 +(dp32493 +S'editable' +p32494 +I01 +sS'value' +p32495 +S'none' +p32496 +ssS'valid_types' +p32497 +(dp32498 +S'editable' +p32499 +I01 +sS'value' +p32500 +(lp32501 +S'Sequence' +p32502 +asssS'description' +p32503 +(dp32504 +S'editable' +p32505 +I01 +sS'value' +p32506 +g47 +sssS'image' +p32507 +(dp32508 +S'mandatory' +p32509 +(dp32510 +S'editable' +p32511 +I00 +sS'value' +p32512 +I00 +ssS'name' +p32513 +(dp32514 +S'editable' +p32515 +I01 +sS'value' +p32516 +S'Thumbnail' +p32517 +ssS'data_type' +p32518 +(dp32519 +S'editable' +p32520 +I00 +sS'value' +p32521 +S'image' +p32522 +ssS'entity_type' +p32523 +(dp32524 +S'editable' +p32525 +I00 +sS'value' +p32526 +S'Shot' +p32527 +ssS'editable' +p32528 +(dp32529 +S'editable' +p32530 +I00 +sS'value' +p32531 +I01 +ssS'unique' +p32532 +(dp32533 +S'editable' +p32534 +I00 +sS'value' +p32535 +I00 +ssS'properties' +p32536 +(dp32537 +S'default_value' +p32538 +(dp32539 +S'editable' +p32540 +I00 +sS'value' +p32541 +NssS'summary_default' +p32542 +(dp32543 +S'editable' +p32544 +I01 +sS'value' +p32545 +S'none' +p32546 +sssS'description' +p32547 +(dp32548 +S'editable' +p32549 +I01 +sS'value' +p32550 +g47 +sssS'tag_list' +p32551 +(dp32552 +S'mandatory' +p32553 +(dp32554 +S'editable' +p32555 +I00 +sS'value' +p32556 +I00 +ssS'name' +p32557 +(dp32558 +S'editable' +p32559 +I01 +sS'value' +p32560 +S'Tags' +p32561 +ssS'data_type' +p32562 +(dp32563 +S'editable' +p32564 +I00 +sS'value' +p32565 +S'tag_list' +p32566 +ssS'entity_type' +p32567 +(dp32568 +S'editable' +p32569 +I00 +sS'value' +p32570 +S'Shot' +p32571 +ssS'editable' +p32572 +(dp32573 +S'editable' +p32574 +I00 +sS'value' +p32575 +I01 +ssS'unique' +p32576 +(dp32577 +S'editable' +p32578 +I00 +sS'value' +p32579 +I00 +ssS'properties' +p32580 +(dp32581 +S'default_value' +p32582 +(dp32583 +S'editable' +p32584 +I00 +sS'value' +p32585 +NssS'summary_default' +p32586 +(dp32587 +S'editable' +p32588 +I01 +sS'value' +p32589 +S'none' +p32590 +ssS'valid_types' +p32591 +(dp32592 +S'editable' +p32593 +I01 +sS'value' +p32594 +(lp32595 +S'Tag' +p32596 +asssS'description' +p32597 +(dp32598 +S'editable' +p32599 +I01 +sS'value' +p32600 +g47 +sssS'head_duration' +p32601 +(dp32602 +S'mandatory' +p32603 +(dp32604 +S'editable' +p32605 +I00 +sS'value' +p32606 +I00 +ssS'name' +p32607 +(dp32608 +S'editable' +p32609 +I01 +sS'value' +p32610 +S'Raw Head Duration' +p32611 +ssS'data_type' +p32612 +(dp32613 +S'editable' +p32614 +I00 +sS'value' +p32615 +S'number' +p32616 +ssS'entity_type' +p32617 +(dp32618 +S'editable' +p32619 +I00 +sS'value' +p32620 +S'Shot' +p32621 +ssS'editable' +p32622 +(dp32623 +S'editable' +p32624 +I00 +sS'value' +p32625 +I01 +ssS'unique' +p32626 +(dp32627 +S'editable' +p32628 +I00 +sS'value' +p32629 +I00 +ssS'properties' +p32630 +(dp32631 +S'default_value' +p32632 +(dp32633 +S'editable' +p32634 +I00 +sS'value' +p32635 +NssS'summary_default' +p32636 +(dp32637 +S'editable' +p32638 +I01 +sS'value' +p32639 +S'none' +p32640 +sssS'description' +p32641 +(dp32642 +S'editable' +p32643 +I01 +sS'value' +p32644 +g47 +sssS'updated_at' +p32645 +(dp32646 +S'mandatory' +p32647 +(dp32648 +S'editable' +p32649 +I00 +sS'value' +p32650 +I00 +ssS'name' +p32651 +(dp32652 +S'editable' +p32653 +I01 +sS'value' +p32654 +S'Date Updated' +p32655 +ssS'data_type' +p32656 +(dp32657 +S'editable' +p32658 +I00 +sS'value' +p32659 +S'date_time' +p32660 +ssS'entity_type' +p32661 +(dp32662 +S'editable' +p32663 +I00 +sS'value' +p32664 +S'Shot' +p32665 +ssS'editable' +p32666 +(dp32667 +S'editable' +p32668 +I00 +sS'value' +p32669 +I00 +ssS'unique' +p32670 +(dp32671 +S'editable' +p32672 +I00 +sS'value' +p32673 +I00 +ssS'properties' +p32674 +(dp32675 +S'default_value' +p32676 +(dp32677 +S'editable' +p32678 +I00 +sS'value' +p32679 +NssS'summary_default' +p32680 +(dp32681 +S'editable' +p32682 +I01 +sS'value' +p32683 +S'none' +p32684 +sssS'description' +p32685 +(dp32686 +S'editable' +p32687 +I01 +sS'value' +p32688 +g47 +sssS'head_in' +p32689 +(dp32690 +S'mandatory' +p32691 +(dp32692 +S'editable' +p32693 +I00 +sS'value' +p32694 +I00 +ssS'name' +p32695 +(dp32696 +S'editable' +p32697 +I01 +sS'value' +p32698 +S'Raw Head In' +p32699 +ssS'data_type' +p32700 +(dp32701 +S'editable' +p32702 +I00 +sS'value' +p32703 +S'number' +p32704 +ssS'entity_type' +p32705 +(dp32706 +S'editable' +p32707 +I00 +sS'value' +p32708 +S'Shot' +p32709 +ssS'editable' +p32710 +(dp32711 +S'editable' +p32712 +I00 +sS'value' +p32713 +I01 +ssS'unique' +p32714 +(dp32715 +S'editable' +p32716 +I00 +sS'value' +p32717 +I00 +ssS'properties' +p32718 +(dp32719 +S'default_value' +p32720 +(dp32721 +S'editable' +p32722 +I00 +sS'value' +p32723 +NssS'summary_default' +p32724 +(dp32725 +S'editable' +p32726 +I01 +sS'value' +p32727 +S'none' +p32728 +sssS'description' +p32729 +(dp32730 +S'editable' +p32731 +I01 +sS'value' +p32732 +g47 +sssS'tasks' +p32733 +(dp32734 +S'mandatory' +p32735 +(dp32736 +S'editable' +p32737 +I00 +sS'value' +p32738 +I00 +ssS'name' +p32739 +(dp32740 +S'editable' +p32741 +I01 +sS'value' +p32742 +S'Tasks' +p32743 +ssS'data_type' +p32744 +(dp32745 +S'editable' +p32746 +I00 +sS'value' +p32747 +S'multi_entity' +p32748 +ssS'entity_type' +p32749 +(dp32750 +S'editable' +p32751 +I00 +sS'value' +p32752 +S'Shot' +p32753 +ssS'editable' +p32754 +(dp32755 +S'editable' +p32756 +I00 +sS'value' +p32757 +I01 +ssS'unique' +p32758 +(dp32759 +S'editable' +p32760 +I00 +sS'value' +p32761 +I00 +ssS'properties' +p32762 +(dp32763 +S'default_value' +p32764 +(dp32765 +S'editable' +p32766 +I00 +sS'value' +p32767 +NssS'summary_default' +p32768 +(dp32769 +S'editable' +p32770 +I01 +sS'value' +p32771 +S'none' +p32772 +ssS'valid_types' +p32773 +(dp32774 +S'editable' +p32775 +I01 +sS'value' +p32776 +(lp32777 +S'Task' +p32778 +asssS'description' +p32779 +(dp32780 +S'editable' +p32781 +I01 +sS'value' +p32782 +g47 +sssS'filmstrip_image' +p32783 +(dp32784 +S'mandatory' +p32785 +(dp32786 +S'editable' +p32787 +I00 +sS'value' +p32788 +I00 +ssS'name' +p32789 +(dp32790 +S'editable' +p32791 +I01 +sS'value' +p32792 +S'Filmstrip Thumbnail' +p32793 +ssS'data_type' +p32794 +(dp32795 +S'editable' +p32796 +I00 +sS'value' +p32797 +S'image' +p32798 +ssS'entity_type' +p32799 +(dp32800 +S'editable' +p32801 +I00 +sS'value' +p32802 +S'Shot' +p32803 +ssS'editable' +p32804 +(dp32805 +S'editable' +p32806 +I00 +sS'value' +p32807 +I01 +ssS'unique' +p32808 +(dp32809 +S'editable' +p32810 +I00 +sS'value' +p32811 +I00 +ssS'properties' +p32812 +(dp32813 +S'default_value' +p32814 +(dp32815 +S'editable' +p32816 +I00 +sS'value' +p32817 +NssS'summary_default' +p32818 +(dp32819 +S'editable' +p32820 +I01 +sS'value' +p32821 +S'none' +p32822 +sssS'description' +p32823 +(dp32824 +S'editable' +p32825 +I01 +sS'value' +p32826 +g47 +sssS'sg_cut_duration' +p32827 +(dp32828 +S'mandatory' +p32829 +(dp32830 +S'editable' +p32831 +I00 +sS'value' +p32832 +I00 +ssS'name' +p32833 +(dp32834 +S'editable' +p32835 +I01 +sS'value' +p32836 +S'Cut Duration' +p32837 +ssS'data_type' +p32838 +(dp32839 +S'editable' +p32840 +I00 +sS'value' +p32841 +S'number' +p32842 +ssS'entity_type' +p32843 +(dp32844 +S'editable' +p32845 +I00 +sS'value' +p32846 +S'Shot' +p32847 +ssS'editable' +p32848 +(dp32849 +S'editable' +p32850 +I00 +sS'value' +p32851 +I01 +ssS'unique' +p32852 +(dp32853 +S'editable' +p32854 +I00 +sS'value' +p32855 +I00 +ssS'properties' +p32856 +(dp32857 +S'default_value' +p32858 +(dp32859 +S'editable' +p32860 +I00 +sS'value' +p32861 +NssS'summary_default' +p32862 +(dp32863 +S'editable' +p32864 +I01 +sS'value' +p32865 +S'sum' +p32866 +sssS'description' +p32867 +(dp32868 +S'editable' +p32869 +I01 +sS'value' +p32870 +S'Duration of this shot in the cut.' +p32871 +sssS'cached_display_name' +p32872 +(dp32873 +S'mandatory' +p32874 +(dp32875 +S'editable' +p32876 +I00 +sS'value' +p32877 +I00 +ssS'name' +p32878 +(dp32879 +S'editable' +p32880 +I01 +sS'value' +p32881 +S'Cached Display Name' +p32882 +ssS'data_type' +p32883 +(dp32884 +S'editable' +p32885 +I00 +sS'value' +p32886 +S'text' +p32887 +ssS'entity_type' +p32888 +(dp32889 +S'editable' +p32890 +I00 +sS'value' +p32891 +S'Shot' +p32892 +ssS'editable' +p32893 +(dp32894 +S'editable' +p32895 +I00 +sS'value' +p32896 +I01 +ssS'unique' +p32897 +(dp32898 +S'editable' +p32899 +I00 +sS'value' +p32900 +I00 +ssS'properties' +p32901 +(dp32902 +S'default_value' +p32903 +(dp32904 +S'editable' +p32905 +I00 +sS'value' +p32906 +NssS'summary_default' +p32907 +(dp32908 +S'editable' +p32909 +I00 +sS'value' +p32910 +S'none' +p32911 +sssS'description' +p32912 +(dp32913 +S'editable' +p32914 +I01 +sS'value' +p32915 +g47 +sssS'smart_cut_duration' +p32916 +(dp32917 +S'mandatory' +p32918 +(dp32919 +S'editable' +p32920 +I00 +sS'value' +p32921 +I00 +ssS'name' +p32922 +(dp32923 +S'editable' +p32924 +I01 +sS'value' +p32925 +S'Cut Duration' +p32926 +ssS'data_type' +p32927 +(dp32928 +S'editable' +p32929 +I00 +sS'value' +p32930 +S'number' +p32931 +ssS'entity_type' +p32932 +(dp32933 +S'editable' +p32934 +I00 +sS'value' +p32935 +S'Shot' +p32936 +ssS'editable' +p32937 +(dp32938 +S'editable' +p32939 +I00 +sS'value' +p32940 +I01 +ssS'unique' +p32941 +(dp32942 +S'editable' +p32943 +I00 +sS'value' +p32944 +I00 +ssS'properties' +p32945 +(dp32946 +S'default_value' +p32947 +(dp32948 +S'editable' +p32949 +I00 +sS'value' +p32950 +NssS'summary_default' +p32951 +(dp32952 +S'editable' +p32953 +I01 +sS'value' +p32954 +S'none' +p32955 +sssS'description' +p32956 +(dp32957 +S'editable' +p32958 +I01 +sS'value' +p32959 +g47 +sssS'id' +p32960 +(dp32961 +S'mandatory' +p32962 +(dp32963 +S'editable' +p32964 +I00 +sS'value' +p32965 +I00 +ssS'name' +p32966 +(dp32967 +S'editable' +p32968 +I01 +sS'value' +p32969 +S'Id' +p32970 +ssS'data_type' +p32971 +(dp32972 +S'editable' +p32973 +I00 +sS'value' +p32974 +S'number' +p32975 +ssS'entity_type' +p32976 +(dp32977 +S'editable' +p32978 +I00 +sS'value' +p32979 +S'Shot' +p32980 +ssS'editable' +p32981 +(dp32982 +S'editable' +p32983 +I00 +sS'value' +p32984 +I00 +ssS'unique' +p32985 +(dp32986 +S'editable' +p32987 +I00 +sS'value' +p32988 +I00 +ssS'properties' +p32989 +(dp32990 +S'default_value' +p32991 +(dp32992 +S'editable' +p32993 +I00 +sS'value' +p32994 +NssS'summary_default' +p32995 +(dp32996 +S'editable' +p32997 +I01 +sS'value' +p32998 +S'none' +p32999 +sssS'description' +p33000 +(dp33001 +S'editable' +p33002 +I01 +sS'value' +p33003 +g47 +sssS'updated_by' +p33004 +(dp33005 +S'mandatory' +p33006 +(dp33007 +S'editable' +p33008 +I00 +sS'value' +p33009 +I00 +ssS'name' +p33010 +(dp33011 +S'editable' +p33012 +I01 +sS'value' +p33013 +S'Updated by' +p33014 +ssS'data_type' +p33015 +(dp33016 +S'editable' +p33017 +I00 +sS'value' +p33018 +S'entity' +p33019 +ssS'entity_type' +p33020 +(dp33021 +S'editable' +p33022 +I00 +sS'value' +p33023 +S'Shot' +p33024 +ssS'editable' +p33025 +(dp33026 +S'editable' +p33027 +I00 +sS'value' +p33028 +I00 +ssS'unique' +p33029 +(dp33030 +S'editable' +p33031 +I00 +sS'value' +p33032 +I00 +ssS'properties' +p33033 +(dp33034 +S'default_value' +p33035 +(dp33036 +S'editable' +p33037 +I00 +sS'value' +p33038 +NssS'summary_default' +p33039 +(dp33040 +S'editable' +p33041 +I01 +sS'value' +p33042 +S'none' +p33043 +ssS'valid_types' +p33044 +(dp33045 +S'editable' +p33046 +I01 +sS'value' +p33047 +(lp33048 +S'HumanUser' +p33049 +aS'ApiUser' +p33050 +asssS'description' +p33051 +(dp33052 +S'editable' +p33053 +I01 +sS'value' +p33054 +g47 +sssS'open_notes' +p33055 +(dp33056 +S'mandatory' +p33057 +(dp33058 +S'editable' +p33059 +I00 +sS'value' +p33060 +I00 +ssS'name' +p33061 +(dp33062 +S'editable' +p33063 +I01 +sS'value' +p33064 +S'Open Notes' +p33065 +ssS'data_type' +p33066 +(dp33067 +S'editable' +p33068 +I00 +sS'value' +p33069 +S'multi_entity' +p33070 +ssS'entity_type' +p33071 +(dp33072 +S'editable' +p33073 +I00 +sS'value' +p33074 +S'Shot' +p33075 +ssS'editable' +p33076 +(dp33077 +S'editable' +p33078 +I00 +sS'value' +p33079 +I00 +ssS'unique' +p33080 +(dp33081 +S'editable' +p33082 +I00 +sS'value' +p33083 +I00 +ssS'properties' +p33084 +(dp33085 +S'default_value' +p33086 +(dp33087 +S'editable' +p33088 +I00 +sS'value' +p33089 +NssS'summary_default' +p33090 +(dp33091 +S'editable' +p33092 +I01 +sS'value' +p33093 +S'none' +p33094 +ssS'valid_types' +p33095 +(dp33096 +S'editable' +p33097 +I01 +sS'value' +p33098 +(lp33099 +S'Note' +p33100 +asssS'description' +p33101 +(dp33102 +S'editable' +p33103 +I01 +sS'value' +p33104 +g47 +sssS'addressings_cc' +p33105 +(dp33106 +S'mandatory' +p33107 +(dp33108 +S'editable' +p33109 +I00 +sS'value' +p33110 +I00 +ssS'name' +p33111 +(dp33112 +S'editable' +p33113 +I01 +sS'value' +p33114 +S'Cc' +p33115 +ssS'data_type' +p33116 +(dp33117 +S'editable' +p33118 +I00 +sS'value' +p33119 +S'multi_entity' +p33120 +ssS'entity_type' +p33121 +(dp33122 +S'editable' +p33123 +I00 +sS'value' +p33124 +S'Shot' +p33125 +ssS'editable' +p33126 +(dp33127 +S'editable' +p33128 +I00 +sS'value' +p33129 +I01 +ssS'unique' +p33130 +(dp33131 +S'editable' +p33132 +I00 +sS'value' +p33133 +I00 +ssS'properties' +p33134 +(dp33135 +S'default_value' +p33136 +(dp33137 +S'editable' +p33138 +I00 +sS'value' +p33139 +NssS'summary_default' +p33140 +(dp33141 +S'editable' +p33142 +I01 +sS'value' +p33143 +S'none' +p33144 +ssS'valid_types' +p33145 +(dp33146 +S'editable' +p33147 +I01 +sS'value' +p33148 +(lp33149 +S'Group' +p33150 +aS'HumanUser' +p33151 +asssS'description' +p33152 +(dp33153 +S'editable' +p33154 +I01 +sS'value' +p33155 +g47 +sssS'sg_working_duration' +p33156 +(dp33157 +S'mandatory' +p33158 +(dp33159 +S'editable' +p33160 +I00 +sS'value' +p33161 +I00 +ssS'name' +p33162 +(dp33163 +S'editable' +p33164 +I01 +sS'value' +p33165 +S'Working Duration' +p33166 +ssS'data_type' +p33167 +(dp33168 +S'editable' +p33169 +I00 +sS'value' +p33170 +S'number' +p33171 +ssS'entity_type' +p33172 +(dp33173 +S'editable' +p33174 +I00 +sS'value' +p33175 +S'Shot' +p33176 +ssS'editable' +p33177 +(dp33178 +S'editable' +p33179 +I00 +sS'value' +p33180 +I01 +ssS'unique' +p33181 +(dp33182 +S'editable' +p33183 +I00 +sS'value' +p33184 +I00 +ssS'properties' +p33185 +(dp33186 +S'default_value' +p33187 +(dp33188 +S'editable' +p33189 +I00 +sS'value' +p33190 +NssS'summary_default' +p33191 +(dp33192 +S'editable' +p33193 +I01 +sS'value' +p33194 +S'none' +p33195 +sssS'description' +p33196 +(dp33197 +S'editable' +p33198 +I01 +sS'value' +p33199 +S'The full duration of available frames in this Shot from Head In to Tail Out.' +p33200 +sssS'sg_shotnumber' +p33201 +(dp33202 +S'mandatory' +p33203 +(dp33204 +S'editable' +p33205 +I00 +sS'value' +p33206 +I00 +ssS'name' +p33207 +(dp33208 +S'editable' +p33209 +I01 +sS'value' +p33210 +S'shotnumber' +p33211 +ssS'data_type' +p33212 +(dp33213 +S'editable' +p33214 +I00 +sS'value' +p33215 +S'text' +p33216 +ssS'entity_type' +p33217 +(dp33218 +S'editable' +p33219 +I00 +sS'value' +p33220 +S'Shot' +p33221 +ssS'editable' +p33222 +(dp33223 +S'editable' +p33224 +I00 +sS'value' +p33225 +I01 +ssS'unique' +p33226 +(dp33227 +S'editable' +p33228 +I00 +sS'value' +p33229 +I00 +ssS'properties' +p33230 +(dp33231 +S'default_value' +p33232 +(dp33233 +S'editable' +p33234 +I00 +sS'value' +p33235 +NssS'summary_default' +p33236 +(dp33237 +S'editable' +p33238 +I01 +sS'value' +p33239 +S'none' +p33240 +sssS'description' +p33241 +(dp33242 +S'editable' +p33243 +I01 +sS'value' +p33244 +g47 +sssS'task_template' +p33245 +(dp33246 +S'mandatory' +p33247 +(dp33248 +S'editable' +p33249 +I00 +sS'value' +p33250 +I00 +ssS'name' +p33251 +(dp33252 +S'editable' +p33253 +I01 +sS'value' +p33254 +S'Task Template' +p33255 +ssS'data_type' +p33256 +(dp33257 +S'editable' +p33258 +I00 +sS'value' +p33259 +S'entity' +p33260 +ssS'entity_type' +p33261 +(dp33262 +S'editable' +p33263 +I00 +sS'value' +p33264 +S'Shot' +p33265 +ssS'editable' +p33266 +(dp33267 +S'editable' +p33268 +I00 +sS'value' +p33269 +I01 +ssS'unique' +p33270 +(dp33271 +S'editable' +p33272 +I00 +sS'value' +p33273 +I00 +ssS'properties' +p33274 +(dp33275 +S'default_value' +p33276 +(dp33277 +S'editable' +p33278 +I00 +sS'value' +p33279 +NssS'summary_default' +p33280 +(dp33281 +S'editable' +p33282 +I01 +sS'value' +p33283 +S'none' +p33284 +ssS'valid_types' +p33285 +(dp33286 +S'editable' +p33287 +I01 +sS'value' +p33288 +(lp33289 +S'TaskTemplate' +p33290 +asssS'description' +p33291 +(dp33292 +S'editable' +p33293 +I01 +sS'value' +p33294 +g47 +sssS'created_by' +p33295 +(dp33296 +S'mandatory' +p33297 +(dp33298 +S'editable' +p33299 +I00 +sS'value' +p33300 +I00 +ssS'name' +p33301 +(dp33302 +S'editable' +p33303 +I01 +sS'value' +p33304 +S'Created by' +p33305 +ssS'data_type' +p33306 +(dp33307 +S'editable' +p33308 +I00 +sS'value' +p33309 +S'entity' +p33310 +ssS'entity_type' +p33311 +(dp33312 +S'editable' +p33313 +I00 +sS'value' +p33314 +S'Shot' +p33315 +ssS'editable' +p33316 +(dp33317 +S'editable' +p33318 +I00 +sS'value' +p33319 +I00 +ssS'unique' +p33320 +(dp33321 +S'editable' +p33322 +I00 +sS'value' +p33323 +I00 +ssS'properties' +p33324 +(dp33325 +S'default_value' +p33326 +(dp33327 +S'editable' +p33328 +I00 +sS'value' +p33329 +NssS'summary_default' +p33330 +(dp33331 +S'editable' +p33332 +I01 +sS'value' +p33333 +S'none' +p33334 +ssS'valid_types' +p33335 +(dp33336 +S'editable' +p33337 +I01 +sS'value' +p33338 +(lp33339 +S'HumanUser' +p33340 +aS'ApiUser' +p33341 +asssS'description' +p33342 +(dp33343 +S'editable' +p33344 +I01 +sS'value' +p33345 +g47 +sssS'smart_tail_duration' +p33346 +(dp33347 +S'mandatory' +p33348 +(dp33349 +S'editable' +p33350 +I00 +sS'value' +p33351 +I00 +ssS'name' +p33352 +(dp33353 +S'editable' +p33354 +I01 +sS'value' +p33355 +S'Tail Duration' +p33356 +ssS'data_type' +p33357 +(dp33358 +S'editable' +p33359 +I00 +sS'value' +p33360 +S'number' +p33361 +ssS'entity_type' +p33362 +(dp33363 +S'editable' +p33364 +I00 +sS'value' +p33365 +S'Shot' +p33366 +ssS'editable' +p33367 +(dp33368 +S'editable' +p33369 +I00 +sS'value' +p33370 +I01 +ssS'unique' +p33371 +(dp33372 +S'editable' +p33373 +I00 +sS'value' +p33374 +I00 +ssS'properties' +p33375 +(dp33376 +S'default_value' +p33377 +(dp33378 +S'editable' +p33379 +I00 +sS'value' +p33380 +NssS'summary_default' +p33381 +(dp33382 +S'editable' +p33383 +I01 +sS'value' +p33384 +S'none' +p33385 +sssS'description' +p33386 +(dp33387 +S'editable' +p33388 +I01 +sS'value' +p33389 +g47 +sssS'parent_shots' +p33390 +(dp33391 +S'mandatory' +p33392 +(dp33393 +S'editable' +p33394 +I00 +sS'value' +p33395 +I00 +ssS'name' +p33396 +(dp33397 +S'editable' +p33398 +I01 +sS'value' +p33399 +S'Parent Shots' +p33400 +ssS'data_type' +p33401 +(dp33402 +S'editable' +p33403 +I00 +sS'value' +p33404 +S'multi_entity' +p33405 +ssS'entity_type' +p33406 +(dp33407 +S'editable' +p33408 +I00 +sS'value' +p33409 +S'Shot' +p33410 +ssS'editable' +p33411 +(dp33412 +S'editable' +p33413 +I00 +sS'value' +p33414 +I01 +ssS'unique' +p33415 +(dp33416 +S'editable' +p33417 +I00 +sS'value' +p33418 +I00 +ssS'properties' +p33419 +(dp33420 +S'default_value' +p33421 +(dp33422 +S'editable' +p33423 +I00 +sS'value' +p33424 +NssS'summary_default' +p33425 +(dp33426 +S'editable' +p33427 +I01 +sS'value' +p33428 +S'none' +p33429 +ssS'valid_types' +p33430 +(dp33431 +S'editable' +p33432 +I01 +sS'value' +p33433 +(lp33434 +S'Shot' +p33435 +asssS'description' +p33436 +(dp33437 +S'editable' +p33438 +I01 +sS'value' +p33439 +g47 +sssS'sg_status_list' +p33440 +(dp33441 +S'mandatory' +p33442 +(dp33443 +S'editable' +p33444 +I00 +sS'value' +p33445 +I00 +ssS'name' +p33446 +(dp33447 +S'editable' +p33448 +I01 +sS'value' +p33449 +S'Status' +p33450 +ssS'data_type' +p33451 +(dp33452 +S'editable' +p33453 +I00 +sS'value' +p33454 +S'status_list' +p33455 +ssS'entity_type' +p33456 +(dp33457 +S'editable' +p33458 +I00 +sS'value' +p33459 +S'Shot' +p33460 +ssS'editable' +p33461 +(dp33462 +S'editable' +p33463 +I00 +sS'value' +p33464 +I01 +ssS'unique' +p33465 +(dp33466 +S'editable' +p33467 +I00 +sS'value' +p33468 +I00 +ssS'properties' +p33469 +(dp33470 +S'default_value' +p33471 +(dp33472 +S'editable' +p33473 +I01 +sS'value' +p33474 +S'wtg' +p33475 +ssS'valid_values' +p33476 +(dp33477 +S'editable' +p33478 +I01 +sS'value' +p33479 +(lp33480 +S'cbb' +p33481 +aS'fin' +p33482 +aS'ip' +p33483 +aS'omt' +p33484 +aS'hld' +p33485 +aS'rdy' +p33486 +aS'wtg' +p33487 +assS'summary_default' +p33488 +(dp33489 +S'editable' +p33490 +I01 +sS'value' +p33491 +S'status_list' +p33492 +sssS'description' +p33493 +(dp33494 +S'editable' +p33495 +I01 +sS'value' +p33496 +g47 +sssS'smart_head_in' +p33497 +(dp33498 +S'mandatory' +p33499 +(dp33500 +S'editable' +p33501 +I00 +sS'value' +p33502 +I00 +ssS'name' +p33503 +(dp33504 +S'editable' +p33505 +I01 +sS'value' +p33506 +S'Head In' +p33507 +ssS'data_type' +p33508 +(dp33509 +S'editable' +p33510 +I00 +sS'value' +p33511 +S'number' +p33512 +ssS'entity_type' +p33513 +(dp33514 +S'editable' +p33515 +I00 +sS'value' +p33516 +S'Shot' +p33517 +ssS'editable' +p33518 +(dp33519 +S'editable' +p33520 +I00 +sS'value' +p33521 +I01 +ssS'unique' +p33522 +(dp33523 +S'editable' +p33524 +I00 +sS'value' +p33525 +I00 +ssS'properties' +p33526 +(dp33527 +S'default_value' +p33528 +(dp33529 +S'editable' +p33530 +I00 +sS'value' +p33531 +NssS'summary_default' +p33532 +(dp33533 +S'editable' +p33534 +I01 +sS'value' +p33535 +S'none' +p33536 +sssS'description' +p33537 +(dp33538 +S'editable' +p33539 +I01 +sS'value' +p33540 +g47 +sssS'smart_working_duration' +p33541 +(dp33542 +S'mandatory' +p33543 +(dp33544 +S'editable' +p33545 +I00 +sS'value' +p33546 +I00 +ssS'name' +p33547 +(dp33548 +S'editable' +p33549 +I01 +sS'value' +p33550 +S'Working Duration' +p33551 +ssS'data_type' +p33552 +(dp33553 +S'editable' +p33554 +I00 +sS'value' +p33555 +S'number' +p33556 +ssS'entity_type' +p33557 +(dp33558 +S'editable' +p33559 +I00 +sS'value' +p33560 +S'Shot' +p33561 +ssS'editable' +p33562 +(dp33563 +S'editable' +p33564 +I00 +sS'value' +p33565 +I00 +ssS'unique' +p33566 +(dp33567 +S'editable' +p33568 +I00 +sS'value' +p33569 +I00 +ssS'properties' +p33570 +(dp33571 +S'default_value' +p33572 +(dp33573 +S'editable' +p33574 +I00 +sS'value' +p33575 +NssS'summary_default' +p33576 +(dp33577 +S'editable' +p33578 +I01 +sS'value' +p33579 +S'none' +p33580 +sssS'description' +p33581 +(dp33582 +S'editable' +p33583 +I01 +sS'value' +p33584 +g47 +sssS'sg_cut_in' +p33585 +(dp33586 +S'mandatory' +p33587 +(dp33588 +S'editable' +p33589 +I00 +sS'value' +p33590 +I00 +ssS'name' +p33591 +(dp33592 +S'editable' +p33593 +I01 +sS'value' +p33594 +S'Cut In' +p33595 +ssS'data_type' +p33596 +(dp33597 +S'editable' +p33598 +I00 +sS'value' +p33599 +S'number' +p33600 +ssS'entity_type' +p33601 +(dp33602 +S'editable' +p33603 +I00 +sS'value' +p33604 +S'Shot' +p33605 +ssS'editable' +p33606 +(dp33607 +S'editable' +p33608 +I00 +sS'value' +p33609 +I01 +ssS'unique' +p33610 +(dp33611 +S'editable' +p33612 +I00 +sS'value' +p33613 +I00 +ssS'properties' +p33614 +(dp33615 +S'default_value' +p33616 +(dp33617 +S'editable' +p33618 +I00 +sS'value' +p33619 +NssS'summary_default' +p33620 +(dp33621 +S'editable' +p33622 +I01 +sS'value' +p33623 +S'sum' +p33624 +sssS'description' +p33625 +(dp33626 +S'editable' +p33627 +I01 +sS'value' +p33628 +S'The first frame used in the cut. This input comes from editorial and is used for playback of movie and frames.' +p33629 +sssS'elements' +p33630 +(dp33631 +S'mandatory' +p33632 +(dp33633 +S'editable' +p33634 +I00 +sS'value' +p33635 +I00 +ssS'name' +p33636 +(dp33637 +S'editable' +p33638 +I01 +sS'value' +p33639 +S'Elements' +p33640 +ssS'data_type' +p33641 +(dp33642 +S'editable' +p33643 +I00 +sS'value' +p33644 +S'multi_entity' +p33645 +ssS'entity_type' +p33646 +(dp33647 +S'editable' +p33648 +I00 +sS'value' +p33649 +S'Shot' +p33650 +ssS'editable' +p33651 +(dp33652 +S'editable' +p33653 +I00 +sS'value' +p33654 +I01 +ssS'unique' +p33655 +(dp33656 +S'editable' +p33657 +I00 +sS'value' +p33658 +I00 +ssS'properties' +p33659 +(dp33660 +S'default_value' +p33661 +(dp33662 +S'editable' +p33663 +I00 +sS'value' +p33664 +NssS'summary_default' +p33665 +(dp33666 +S'editable' +p33667 +I00 +sS'value' +p33668 +S'none' +p33669 +ssS'valid_types' +p33670 +(dp33671 +S'editable' +p33672 +I00 +sS'value' +p33673 +(lp33674 +S'Element' +p33675 +asssS'description' +p33676 +(dp33677 +S'editable' +p33678 +I01 +sS'value' +p33679 +g47 +sssS'sg_shot_type' +p33680 +(dp33681 +S'mandatory' +p33682 +(dp33683 +S'editable' +p33684 +I00 +sS'value' +p33685 +I00 +ssS'name' +p33686 +(dp33687 +S'editable' +p33688 +I01 +sS'value' +p33689 +S'Type' +p33690 +ssS'data_type' +p33691 +(dp33692 +S'editable' +p33693 +I00 +sS'value' +p33694 +S'list' +p33695 +ssS'entity_type' +p33696 +(dp33697 +S'editable' +p33698 +I00 +sS'value' +p33699 +S'Shot' +p33700 +ssS'editable' +p33701 +(dp33702 +S'editable' +p33703 +I00 +sS'value' +p33704 +I01 +ssS'unique' +p33705 +(dp33706 +S'editable' +p33707 +I00 +sS'value' +p33708 +I00 +ssS'properties' +p33709 +(dp33710 +S'default_value' +p33711 +(dp33712 +S'editable' +p33713 +I00 +sS'value' +p33714 +NssS'valid_values' +p33715 +(dp33716 +S'editable' +p33717 +I01 +sS'value' +p33718 +(lp33719 +ssS'summary_default' +p33720 +(dp33721 +S'editable' +p33722 +I01 +sS'value' +p33723 +S'none' +p33724 +sssS'description' +p33725 +(dp33726 +S'editable' +p33727 +I01 +sS'value' +p33728 +g47 +sssS'description' +p33729 +(dp33730 +S'mandatory' +p33731 +(dp33732 +S'editable' +p33733 +I00 +sS'value' +p33734 +I00 +ssS'name' +p33735 +(dp33736 +S'editable' +p33737 +I01 +sS'value' +p33738 +S'Description' +p33739 +ssS'data_type' +p33740 +(dp33741 +S'editable' +p33742 +I00 +sS'value' +p33743 +S'text' +p33744 +ssS'entity_type' +p33745 +(dp33746 +S'editable' +p33747 +I00 +sS'value' +p33748 +S'Shot' +p33749 +ssS'editable' +p33750 +(dp33751 +S'editable' +p33752 +I00 +sS'value' +p33753 +I01 +ssS'unique' +p33754 +(dp33755 +S'editable' +p33756 +I00 +sS'value' +p33757 +I00 +ssS'properties' +p33758 +(dp33759 +S'default_value' +p33760 +(dp33761 +S'editable' +p33762 +I00 +sS'value' +p33763 +NssS'summary_default' +p33764 +(dp33765 +S'editable' +p33766 +I01 +sS'value' +p33767 +S'none' +p33768 +sssS'description' +p33769 +(dp33770 +S'editable' +p33771 +I01 +sS'value' +p33772 +g47 +sssS'smart_cut_out' +p33773 +(dp33774 +S'mandatory' +p33775 +(dp33776 +S'editable' +p33777 +I00 +sS'value' +p33778 +I00 +ssS'name' +p33779 +(dp33780 +S'editable' +p33781 +I01 +sS'value' +p33782 +S'Cut Out' +p33783 +ssS'data_type' +p33784 +(dp33785 +S'editable' +p33786 +I00 +sS'value' +p33787 +S'number' +p33788 +ssS'entity_type' +p33789 +(dp33790 +S'editable' +p33791 +I00 +sS'value' +p33792 +S'Shot' +p33793 +ssS'editable' +p33794 +(dp33795 +S'editable' +p33796 +I00 +sS'value' +p33797 +I01 +ssS'unique' +p33798 +(dp33799 +S'editable' +p33800 +I00 +sS'value' +p33801 +I00 +ssS'properties' +p33802 +(dp33803 +S'default_value' +p33804 +(dp33805 +S'editable' +p33806 +I00 +sS'value' +p33807 +NssS'summary_default' +p33808 +(dp33809 +S'editable' +p33810 +I01 +sS'value' +p33811 +S'none' +p33812 +sssS'description' +p33813 +(dp33814 +S'editable' +p33815 +I01 +sS'value' +p33816 +g47 +sssS'tail_out' +p33817 +(dp33818 +S'mandatory' +p33819 +(dp33820 +S'editable' +p33821 +I00 +sS'value' +p33822 +I00 +ssS'name' +p33823 +(dp33824 +S'editable' +p33825 +I01 +sS'value' +p33826 +S'Raw Tail Out' +p33827 +ssS'data_type' +p33828 +(dp33829 +S'editable' +p33830 +I00 +sS'value' +p33831 +S'number' +p33832 +ssS'entity_type' +p33833 +(dp33834 +S'editable' +p33835 +I00 +sS'value' +p33836 +S'Shot' +p33837 +ssS'editable' +p33838 +(dp33839 +S'editable' +p33840 +I00 +sS'value' +p33841 +I01 +ssS'unique' +p33842 +(dp33843 +S'editable' +p33844 +I00 +sS'value' +p33845 +I00 +ssS'properties' +p33846 +(dp33847 +S'default_value' +p33848 +(dp33849 +S'editable' +p33850 +I00 +sS'value' +p33851 +NssS'summary_default' +p33852 +(dp33853 +S'editable' +p33854 +I01 +sS'value' +p33855 +S'none' +p33856 +sssS'description' +p33857 +(dp33858 +S'editable' +p33859 +I01 +sS'value' +p33860 +g47 +sssS'sg_cut_out' +p33861 +(dp33862 +S'mandatory' +p33863 +(dp33864 +S'editable' +p33865 +I00 +sS'value' +p33866 +I00 +ssS'name' +p33867 +(dp33868 +S'editable' +p33869 +I01 +sS'value' +p33870 +S'Cut Out' +p33871 +ssS'data_type' +p33872 +(dp33873 +S'editable' +p33874 +I00 +sS'value' +p33875 +S'number' +p33876 +ssS'entity_type' +p33877 +(dp33878 +S'editable' +p33879 +I00 +sS'value' +p33880 +S'Shot' +p33881 +ssS'editable' +p33882 +(dp33883 +S'editable' +p33884 +I00 +sS'value' +p33885 +I01 +ssS'unique' +p33886 +(dp33887 +S'editable' +p33888 +I00 +sS'value' +p33889 +I00 +ssS'properties' +p33890 +(dp33891 +S'default_value' +p33892 +(dp33893 +S'editable' +p33894 +I00 +sS'value' +p33895 +NssS'summary_default' +p33896 +(dp33897 +S'editable' +p33898 +I01 +sS'value' +p33899 +S'sum' +p33900 +sssS'description' +p33901 +(dp33902 +S'editable' +p33903 +I01 +sS'value' +p33904 +S'The last frame used in the cut. This input comes from editorial and is used for playback of movie and frames.' +p33905 +sssS'sg_tail_out' +p33906 +(dp33907 +S'mandatory' +p33908 +(dp33909 +S'editable' +p33910 +I00 +sS'value' +p33911 +I00 +ssS'name' +p33912 +(dp33913 +S'editable' +p33914 +I01 +sS'value' +p33915 +S'Tail Out' +p33916 +ssS'data_type' +p33917 +(dp33918 +S'editable' +p33919 +I00 +sS'value' +p33920 +S'number' +p33921 +ssS'entity_type' +p33922 +(dp33923 +S'editable' +p33924 +I00 +sS'value' +p33925 +S'Shot' +p33926 +ssS'editable' +p33927 +(dp33928 +S'editable' +p33929 +I00 +sS'value' +p33930 +I01 +ssS'unique' +p33931 +(dp33932 +S'editable' +p33933 +I00 +sS'value' +p33934 +I00 +ssS'properties' +p33935 +(dp33936 +S'default_value' +p33937 +(dp33938 +S'editable' +p33939 +I00 +sS'value' +p33940 +NssS'summary_default' +p33941 +(dp33942 +S'editable' +p33943 +I01 +sS'value' +p33944 +S'none' +p33945 +sssS'description' +p33946 +(dp33947 +S'editable' +p33948 +I01 +sS'value' +p33949 +S'The last frame number that footage is available for this Shot.' +p33950 +sssS'smart_cut_in' +p33951 +(dp33952 +S'mandatory' +p33953 +(dp33954 +S'editable' +p33955 +I00 +sS'value' +p33956 +I00 +ssS'name' +p33957 +(dp33958 +S'editable' +p33959 +I01 +sS'value' +p33960 +S'Cut In' +p33961 +ssS'data_type' +p33962 +(dp33963 +S'editable' +p33964 +I00 +sS'value' +p33965 +S'number' +p33966 +ssS'entity_type' +p33967 +(dp33968 +S'editable' +p33969 +I00 +sS'value' +p33970 +S'Shot' +p33971 +ssS'editable' +p33972 +(dp33973 +S'editable' +p33974 +I00 +sS'value' +p33975 +I01 +ssS'unique' +p33976 +(dp33977 +S'editable' +p33978 +I00 +sS'value' +p33979 +I00 +ssS'properties' +p33980 +(dp33981 +S'default_value' +p33982 +(dp33983 +S'editable' +p33984 +I00 +sS'value' +p33985 +NssS'summary_default' +p33986 +(dp33987 +S'editable' +p33988 +I01 +sS'value' +p33989 +S'none' +p33990 +sssS'description' +p33991 +(dp33992 +S'editable' +p33993 +I01 +sS'value' +p33994 +g47 +sssS'smart_cut_summary_display' +p33995 +(dp33996 +S'mandatory' +p33997 +(dp33998 +S'editable' +p33999 +I00 +sS'value' +p34000 +I00 +ssS'name' +p34001 +(dp34002 +S'editable' +p34003 +I01 +sS'value' +p34004 +S'Cut Summary' +p34005 +ssS'data_type' +p34006 +(dp34007 +S'editable' +p34008 +I00 +sS'value' +p34009 +S'text' +p34010 +ssS'entity_type' +p34011 +(dp34012 +S'editable' +p34013 +I00 +sS'value' +p34014 +S'Shot' +p34015 +ssS'editable' +p34016 +(dp34017 +S'editable' +p34018 +I00 +sS'value' +p34019 +I00 +ssS'unique' +p34020 +(dp34021 +S'editable' +p34022 +I00 +sS'value' +p34023 +I00 +ssS'properties' +p34024 +(dp34025 +S'default_value' +p34026 +(dp34027 +S'editable' +p34028 +I00 +sS'value' +p34029 +NssS'summary_default' +p34030 +(dp34031 +S'editable' +p34032 +I01 +sS'value' +p34033 +S'none' +p34034 +sssS'description' +p34035 +(dp34036 +S'editable' +p34037 +I01 +sS'value' +p34038 +g47 +sssS'cut_in' +p34039 +(dp34040 +S'mandatory' +p34041 +(dp34042 +S'editable' +p34043 +I00 +sS'value' +p34044 +I00 +ssS'name' +p34045 +(dp34046 +S'editable' +p34047 +I01 +sS'value' +p34048 +S'Raw Cut In' +p34049 +ssS'data_type' +p34050 +(dp34051 +S'editable' +p34052 +I00 +sS'value' +p34053 +S'number' +p34054 +ssS'entity_type' +p34055 +(dp34056 +S'editable' +p34057 +I00 +sS'value' +p34058 +S'Shot' +p34059 +ssS'editable' +p34060 +(dp34061 +S'editable' +p34062 +I00 +sS'value' +p34063 +I01 +ssS'unique' +p34064 +(dp34065 +S'editable' +p34066 +I00 +sS'value' +p34067 +I00 +ssS'properties' +p34068 +(dp34069 +S'default_value' +p34070 +(dp34071 +S'editable' +p34072 +I00 +sS'value' +p34073 +NssS'summary_default' +p34074 +(dp34075 +S'editable' +p34076 +I01 +sS'value' +p34077 +S'none' +p34078 +sssS'description' +p34079 +(dp34080 +S'editable' +p34081 +I01 +sS'value' +p34082 +g47 +sssS'smart_duration_summary_display' +p34083 +(dp34084 +S'mandatory' +p34085 +(dp34086 +S'editable' +p34087 +I00 +sS'value' +p34088 +I00 +ssS'name' +p34089 +(dp34090 +S'editable' +p34091 +I01 +sS'value' +p34092 +S'Duration Summary' +p34093 +ssS'data_type' +p34094 +(dp34095 +S'editable' +p34096 +I00 +sS'value' +p34097 +S'text' +p34098 +ssS'entity_type' +p34099 +(dp34100 +S'editable' +p34101 +I00 +sS'value' +p34102 +S'Shot' +p34103 +ssS'editable' +p34104 +(dp34105 +S'editable' +p34106 +I00 +sS'value' +p34107 +I00 +ssS'unique' +p34108 +(dp34109 +S'editable' +p34110 +I00 +sS'value' +p34111 +I00 +ssS'properties' +p34112 +(dp34113 +S'default_value' +p34114 +(dp34115 +S'editable' +p34116 +I00 +sS'value' +p34117 +NssS'summary_default' +p34118 +(dp34119 +S'editable' +p34120 +I01 +sS'value' +p34121 +S'none' +p34122 +sssS'description' +p34123 +(dp34124 +S'editable' +p34125 +I01 +sS'value' +p34126 +g47 +sssS'tail_duration' +p34127 +(dp34128 +S'mandatory' +p34129 +(dp34130 +S'editable' +p34131 +I00 +sS'value' +p34132 +I00 +ssS'name' +p34133 +(dp34134 +S'editable' +p34135 +I01 +sS'value' +p34136 +S'Raw Tail Duration' +p34137 +ssS'data_type' +p34138 +(dp34139 +S'editable' +p34140 +I00 +sS'value' +p34141 +S'number' +p34142 +ssS'entity_type' +p34143 +(dp34144 +S'editable' +p34145 +I00 +sS'value' +p34146 +S'Shot' +p34147 +ssS'editable' +p34148 +(dp34149 +S'editable' +p34150 +I00 +sS'value' +p34151 +I01 +ssS'unique' +p34152 +(dp34153 +S'editable' +p34154 +I00 +sS'value' +p34155 +I00 +ssS'properties' +p34156 +(dp34157 +S'default_value' +p34158 +(dp34159 +S'editable' +p34160 +I00 +sS'value' +p34161 +NssS'summary_default' +p34162 +(dp34163 +S'editable' +p34164 +I01 +sS'value' +p34165 +S'none' +p34166 +sssS'description' +p34167 +(dp34168 +S'editable' +p34169 +I01 +sS'value' +p34170 +g47 +sssS'smart_tail_out' +p34171 +(dp34172 +S'mandatory' +p34173 +(dp34174 +S'editable' +p34175 +I00 +sS'value' +p34176 +I00 +ssS'name' +p34177 +(dp34178 +S'editable' +p34179 +I01 +sS'value' +p34180 +S'Tail Out' +p34181 +ssS'data_type' +p34182 +(dp34183 +S'editable' +p34184 +I00 +sS'value' +p34185 +S'number' +p34186 +ssS'entity_type' +p34187 +(dp34188 +S'editable' +p34189 +I00 +sS'value' +p34190 +S'Shot' +p34191 +ssS'editable' +p34192 +(dp34193 +S'editable' +p34194 +I00 +sS'value' +p34195 +I01 +ssS'unique' +p34196 +(dp34197 +S'editable' +p34198 +I00 +sS'value' +p34199 +I00 +ssS'properties' +p34200 +(dp34201 +S'default_value' +p34202 +(dp34203 +S'editable' +p34204 +I00 +sS'value' +p34205 +NssS'summary_default' +p34206 +(dp34207 +S'editable' +p34208 +I01 +sS'value' +p34209 +S'none' +p34210 +sssS'description' +p34211 +(dp34212 +S'editable' +p34213 +I01 +sS'value' +p34214 +g47 +sssS'step_0' +p34215 +(dp34216 +S'mandatory' +p34217 +(dp34218 +S'editable' +p34219 +I00 +sS'value' +p34220 +I00 +ssS'name' +p34221 +(dp34222 +S'editable' +p34223 +I01 +sS'value' +p34224 +S'ALL TASKS' +p34225 +ssS'data_type' +p34226 +(dp34227 +S'editable' +p34228 +I00 +sS'value' +p34229 +S'pivot_column' +p34230 +ssS'entity_type' +p34231 +(dp34232 +S'editable' +p34233 +I00 +sS'value' +p34234 +S'Shot' +p34235 +ssS'editable' +p34236 +(dp34237 +S'editable' +p34238 +I00 +sS'value' +p34239 +I00 +ssS'unique' +p34240 +(dp34241 +S'editable' +p34242 +I00 +sS'value' +p34243 +I00 +ssS'properties' +p34244 +(dp34245 +S'default_value' +p34246 +(dp34247 +S'editable' +p34248 +I00 +sS'value' +p34249 +NssS'summary_default' +p34250 +(dp34251 +S'editable' +p34252 +I00 +sS'value' +p34253 +S'none' +p34254 +sssS'description' +p34255 +(dp34256 +S'editable' +p34257 +I01 +sS'value' +p34258 +g47 +sssS'cut_duration' +p34259 +(dp34260 +S'mandatory' +p34261 +(dp34262 +S'editable' +p34263 +I00 +sS'value' +p34264 +I00 +ssS'name' +p34265 +(dp34266 +S'editable' +p34267 +I01 +sS'value' +p34268 +S'Raw Cut Duration' +p34269 +ssS'data_type' +p34270 +(dp34271 +S'editable' +p34272 +I00 +sS'value' +p34273 +S'number' +p34274 +ssS'entity_type' +p34275 +(dp34276 +S'editable' +p34277 +I00 +sS'value' +p34278 +S'Shot' +p34279 +ssS'editable' +p34280 +(dp34281 +S'editable' +p34282 +I00 +sS'value' +p34283 +I01 +ssS'unique' +p34284 +(dp34285 +S'editable' +p34286 +I00 +sS'value' +p34287 +I00 +ssS'properties' +p34288 +(dp34289 +S'default_value' +p34290 +(dp34291 +S'editable' +p34292 +I00 +sS'value' +p34293 +NssS'summary_default' +p34294 +(dp34295 +S'editable' +p34296 +I01 +sS'value' +p34297 +S'none' +p34298 +sssS'description' +p34299 +(dp34300 +S'editable' +p34301 +I01 +sS'value' +p34302 +g47 +sssS'step_5' +p34303 +(dp34304 +S'mandatory' +p34305 +(dp34306 +S'editable' +p34307 +I00 +sS'value' +p34308 +I00 +ssS'name' +p34309 +(dp34310 +S'editable' +p34311 +I01 +sS'value' +p34312 +S'Anm' +p34313 +ssS'data_type' +p34314 +(dp34315 +S'editable' +p34316 +I00 +sS'value' +p34317 +S'pivot_column' +p34318 +ssS'entity_type' +p34319 +(dp34320 +S'editable' +p34321 +I00 +sS'value' +p34322 +S'Shot' +p34323 +ssS'editable' +p34324 +(dp34325 +S'editable' +p34326 +I00 +sS'value' +p34327 +I00 +ssS'unique' +p34328 +(dp34329 +S'editable' +p34330 +I00 +sS'value' +p34331 +I00 +ssS'properties' +p34332 +(dp34333 +S'default_value' +p34334 +(dp34335 +S'editable' +p34336 +I00 +sS'value' +p34337 +NssS'summary_default' +p34338 +(dp34339 +S'editable' +p34340 +I00 +sS'value' +p34341 +S'none' +p34342 +sssS'description' +p34343 +(dp34344 +S'editable' +p34345 +I01 +sS'value' +p34346 +g47 +sssS'assets' +p34347 +(dp34348 +S'mandatory' +p34349 +(dp34350 +S'editable' +p34351 +I00 +sS'value' +p34352 +I00 +ssS'name' +p34353 +(dp34354 +S'editable' +p34355 +I01 +sS'value' +p34356 +S'Assets' +p34357 +ssS'data_type' +p34358 +(dp34359 +S'editable' +p34360 +I00 +sS'value' +p34361 +S'multi_entity' +p34362 +ssS'entity_type' +p34363 +(dp34364 +S'editable' +p34365 +I00 +sS'value' +p34366 +S'Shot' +p34367 +ssS'editable' +p34368 +(dp34369 +S'editable' +p34370 +I00 +sS'value' +p34371 +I01 +ssS'unique' +p34372 +(dp34373 +S'editable' +p34374 +I00 +sS'value' +p34375 +I00 +ssS'properties' +p34376 +(dp34377 +S'default_value' +p34378 +(dp34379 +S'editable' +p34380 +I00 +sS'value' +p34381 +NssS'summary_default' +p34382 +(dp34383 +S'editable' +p34384 +I01 +sS'value' +p34385 +S'none' +p34386 +ssS'valid_types' +p34387 +(dp34388 +S'editable' +p34389 +I01 +sS'value' +p34390 +(lp34391 +S'Asset' +p34392 +asssS'description' +p34393 +(dp34394 +S'editable' +p34395 +I01 +sS'value' +p34396 +g47 +sssS'step_7' +p34397 +(dp34398 +S'mandatory' +p34399 +(dp34400 +S'editable' +p34401 +I00 +sS'value' +p34402 +I00 +ssS'name' +p34403 +(dp34404 +S'editable' +p34405 +I01 +sS'value' +p34406 +S'Light' +p34407 +ssS'data_type' +p34408 +(dp34409 +S'editable' +p34410 +I00 +sS'value' +p34411 +S'pivot_column' +p34412 +ssS'entity_type' +p34413 +(dp34414 +S'editable' +p34415 +I00 +sS'value' +p34416 +S'Shot' +p34417 +ssS'editable' +p34418 +(dp34419 +S'editable' +p34420 +I00 +sS'value' +p34421 +I00 +ssS'unique' +p34422 +(dp34423 +S'editable' +p34424 +I00 +sS'value' +p34425 +I00 +ssS'properties' +p34426 +(dp34427 +S'default_value' +p34428 +(dp34429 +S'editable' +p34430 +I00 +sS'value' +p34431 +NssS'summary_default' +p34432 +(dp34433 +S'editable' +p34434 +I00 +sS'value' +p34435 +S'none' +p34436 +sssS'description' +p34437 +(dp34438 +S'editable' +p34439 +I01 +sS'value' +p34440 +g47 +sssS'step_6' +p34441 +(dp34442 +S'mandatory' +p34443 +(dp34444 +S'editable' +p34445 +I00 +sS'value' +p34446 +I00 +ssS'name' +p34447 +(dp34448 +S'editable' +p34449 +I01 +sS'value' +p34450 +S'FX' +p34451 +ssS'data_type' +p34452 +(dp34453 +S'editable' +p34454 +I00 +sS'value' +p34455 +S'pivot_column' +p34456 +ssS'entity_type' +p34457 +(dp34458 +S'editable' +p34459 +I00 +sS'value' +p34460 +S'Shot' +p34461 +ssS'editable' +p34462 +(dp34463 +S'editable' +p34464 +I00 +sS'value' +p34465 +I00 +ssS'unique' +p34466 +(dp34467 +S'editable' +p34468 +I00 +sS'value' +p34469 +I00 +ssS'properties' +p34470 +(dp34471 +S'default_value' +p34472 +(dp34473 +S'editable' +p34474 +I00 +sS'value' +p34475 +NssS'summary_default' +p34476 +(dp34477 +S'editable' +p34478 +I00 +sS'value' +p34479 +S'none' +p34480 +sssS'description' +p34481 +(dp34482 +S'editable' +p34483 +I01 +sS'value' +p34484 +g47 +sssS'smart_tail_in' +p34485 +(dp34486 +S'mandatory' +p34487 +(dp34488 +S'editable' +p34489 +I00 +sS'value' +p34490 +I00 +ssS'name' +p34491 +(dp34492 +S'editable' +p34493 +I01 +sS'value' +p34494 +S'Tail In' +p34495 +ssS'data_type' +p34496 +(dp34497 +S'editable' +p34498 +I00 +sS'value' +p34499 +S'number' +p34500 +ssS'entity_type' +p34501 +(dp34502 +S'editable' +p34503 +I00 +sS'value' +p34504 +S'Shot' +p34505 +ssS'editable' +p34506 +(dp34507 +S'editable' +p34508 +I00 +sS'value' +p34509 +I01 +ssS'unique' +p34510 +(dp34511 +S'editable' +p34512 +I00 +sS'value' +p34513 +I00 +ssS'properties' +p34514 +(dp34515 +S'default_value' +p34516 +(dp34517 +S'editable' +p34518 +I00 +sS'value' +p34519 +NssS'summary_default' +p34520 +(dp34521 +S'editable' +p34522 +I01 +sS'value' +p34523 +S'none' +p34524 +sssS'description' +p34525 +(dp34526 +S'editable' +p34527 +I01 +sS'value' +p34528 +g47 +sssS'step_8' +p34529 +(dp34530 +S'mandatory' +p34531 +(dp34532 +S'editable' +p34533 +I00 +sS'value' +p34534 +I00 +ssS'name' +p34535 +(dp34536 +S'editable' +p34537 +I01 +sS'value' +p34538 +S'Comp' +p34539 +ssS'data_type' +p34540 +(dp34541 +S'editable' +p34542 +I00 +sS'value' +p34543 +S'pivot_column' +p34544 +ssS'entity_type' +p34545 +(dp34546 +S'editable' +p34547 +I00 +sS'value' +p34548 +S'Shot' +p34549 +ssS'editable' +p34550 +(dp34551 +S'editable' +p34552 +I00 +sS'value' +p34553 +I00 +ssS'unique' +p34554 +(dp34555 +S'editable' +p34556 +I00 +sS'value' +p34557 +I00 +ssS'properties' +p34558 +(dp34559 +S'default_value' +p34560 +(dp34561 +S'editable' +p34562 +I00 +sS'value' +p34563 +NssS'summary_default' +p34564 +(dp34565 +S'editable' +p34566 +I00 +sS'value' +p34567 +S'none' +p34568 +sssS'description' +p34569 +(dp34570 +S'editable' +p34571 +I01 +sS'value' +p34572 +g47 +sssS'created_at' +p34573 +(dp34574 +S'mandatory' +p34575 +(dp34576 +S'editable' +p34577 +I00 +sS'value' +p34578 +I00 +ssS'name' +p34579 +(dp34580 +S'editable' +p34581 +I01 +sS'value' +p34582 +S'Date Created' +p34583 +ssS'data_type' +p34584 +(dp34585 +S'editable' +p34586 +I00 +sS'value' +p34587 +S'date_time' +p34588 +ssS'entity_type' +p34589 +(dp34590 +S'editable' +p34591 +I00 +sS'value' +p34592 +S'Shot' +p34593 +ssS'editable' +p34594 +(dp34595 +S'editable' +p34596 +I00 +sS'value' +p34597 +I00 +ssS'unique' +p34598 +(dp34599 +S'editable' +p34600 +I00 +sS'value' +p34601 +I00 +ssS'properties' +p34602 +(dp34603 +S'default_value' +p34604 +(dp34605 +S'editable' +p34606 +I00 +sS'value' +p34607 +NssS'summary_default' +p34608 +(dp34609 +S'editable' +p34610 +I01 +sS'value' +p34611 +S'none' +p34612 +sssS'description' +p34613 +(dp34614 +S'editable' +p34615 +I01 +sS'value' +p34616 +g47 +sssS'sg_scene' +p34617 +(dp34618 +S'mandatory' +p34619 +(dp34620 +S'editable' +p34621 +I00 +sS'value' +p34622 +I00 +ssS'name' +p34623 +(dp34624 +S'editable' +p34625 +I01 +sS'value' +p34626 +S'Scene' +p34627 +ssS'data_type' +p34628 +(dp34629 +S'editable' +p34630 +I00 +sS'value' +p34631 +S'entity' +p34632 +ssS'entity_type' +p34633 +(dp34634 +S'editable' +p34635 +I00 +sS'value' +p34636 +S'Shot' +p34637 +ssS'editable' +p34638 +(dp34639 +S'editable' +p34640 +I00 +sS'value' +p34641 +I01 +ssS'unique' +p34642 +(dp34643 +S'editable' +p34644 +I00 +sS'value' +p34645 +I00 +ssS'properties' +p34646 +(dp34647 +S'default_value' +p34648 +(dp34649 +S'editable' +p34650 +I00 +sS'value' +p34651 +NssS'summary_default' +p34652 +(dp34653 +S'editable' +p34654 +I01 +sS'value' +p34655 +S'none' +p34656 +ssS'valid_types' +p34657 +(dp34658 +S'editable' +p34659 +I01 +sS'value' +p34660 +(lp34661 +S'Scene' +p34662 +asssS'description' +p34663 +(dp34664 +S'editable' +p34665 +I01 +sS'value' +p34666 +g47 +sssS'sg_cut_order' +p34667 +(dp34668 +S'mandatory' +p34669 +(dp34670 +S'editable' +p34671 +I00 +sS'value' +p34672 +I00 +ssS'name' +p34673 +(dp34674 +S'editable' +p34675 +I01 +sS'value' +p34676 +S'Cut Order' +p34677 +ssS'data_type' +p34678 +(dp34679 +S'editable' +p34680 +I00 +sS'value' +p34681 +S'number' +p34682 +ssS'entity_type' +p34683 +(dp34684 +S'editable' +p34685 +I00 +sS'value' +p34686 +S'Shot' +p34687 +ssS'editable' +p34688 +(dp34689 +S'editable' +p34690 +I00 +sS'value' +p34691 +I01 +ssS'unique' +p34692 +(dp34693 +S'editable' +p34694 +I00 +sS'value' +p34695 +I00 +ssS'properties' +p34696 +(dp34697 +S'default_value' +p34698 +(dp34699 +S'editable' +p34700 +I00 +sS'value' +p34701 +NssS'summary_default' +p34702 +(dp34703 +S'editable' +p34704 +I01 +sS'value' +p34705 +S'none' +p34706 +sssS'description' +p34707 +(dp34708 +S'editable' +p34709 +I01 +sS'value' +p34710 +S'Order that the Shot plays in the overall cut for the entire Project. Used for sorting Shots and Versions of Shots when playing in cut order and pulling in neighboring Shots of Versions to the current one being viewed.' +p34711 +sssS'project' +p34712 +(dp34713 +S'mandatory' +p34714 +(dp34715 +S'editable' +p34716 +I00 +sS'value' +p34717 +I00 +ssS'name' +p34718 +(dp34719 +S'editable' +p34720 +I01 +sS'value' +p34721 +S'Project' +p34722 +ssS'data_type' +p34723 +(dp34724 +S'editable' +p34725 +I00 +sS'value' +p34726 +S'entity' +p34727 +ssS'entity_type' +p34728 +(dp34729 +S'editable' +p34730 +I00 +sS'value' +p34731 +S'Shot' +p34732 +ssS'editable' +p34733 +(dp34734 +S'editable' +p34735 +I00 +sS'value' +p34736 +I01 +ssS'unique' +p34737 +(dp34738 +S'editable' +p34739 +I00 +sS'value' +p34740 +I00 +ssS'properties' +p34741 +(dp34742 +S'default_value' +p34743 +(dp34744 +S'editable' +p34745 +I00 +sS'value' +p34746 +NssS'summary_default' +p34747 +(dp34748 +S'editable' +p34749 +I01 +sS'value' +p34750 +S'none' +p34751 +ssS'valid_types' +p34752 +(dp34753 +S'editable' +p34754 +I01 +sS'value' +p34755 +(lp34756 +S'Project' +p34757 +asssS'description' +p34758 +(dp34759 +S'editable' +p34760 +I01 +sS'value' +p34761 +g47 +sssS'sg_head_in' +p34762 +(dp34763 +S'mandatory' +p34764 +(dp34765 +S'editable' +p34766 +I00 +sS'value' +p34767 +I00 +ssS'name' +p34768 +(dp34769 +S'editable' +p34770 +I01 +sS'value' +p34771 +S'Head In' +p34772 +ssS'data_type' +p34773 +(dp34774 +S'editable' +p34775 +I00 +sS'value' +p34776 +S'number' +p34777 +ssS'entity_type' +p34778 +(dp34779 +S'editable' +p34780 +I00 +sS'value' +p34781 +S'Shot' +p34782 +ssS'editable' +p34783 +(dp34784 +S'editable' +p34785 +I00 +sS'value' +p34786 +I01 +ssS'unique' +p34787 +(dp34788 +S'editable' +p34789 +I00 +sS'value' +p34790 +I00 +ssS'properties' +p34791 +(dp34792 +S'default_value' +p34793 +(dp34794 +S'editable' +p34795 +I00 +sS'value' +p34796 +NssS'summary_default' +p34797 +(dp34798 +S'editable' +p34799 +I01 +sS'value' +p34800 +S'none' +p34801 +sssS'description' +p34802 +(dp34803 +S'editable' +p34804 +I01 +sS'value' +p34805 +S'The first frame number that footage is available for this Shot.' +p34806 +sssS'tail_in' +p34807 +(dp34808 +S'mandatory' +p34809 +(dp34810 +S'editable' +p34811 +I00 +sS'value' +p34812 +I00 +ssS'name' +p34813 +(dp34814 +S'editable' +p34815 +I01 +sS'value' +p34816 +S'Raw Tail In' +p34817 +ssS'data_type' +p34818 +(dp34819 +S'editable' +p34820 +I00 +sS'value' +p34821 +S'number' +p34822 +ssS'entity_type' +p34823 +(dp34824 +S'editable' +p34825 +I00 +sS'value' +p34826 +S'Shot' +p34827 +ssS'editable' +p34828 +(dp34829 +S'editable' +p34830 +I00 +sS'value' +p34831 +I01 +ssS'unique' +p34832 +(dp34833 +S'editable' +p34834 +I00 +sS'value' +p34835 +I00 +ssS'properties' +p34836 +(dp34837 +S'default_value' +p34838 +(dp34839 +S'editable' +p34840 +I00 +sS'value' +p34841 +NssS'summary_default' +p34842 +(dp34843 +S'editable' +p34844 +I01 +sS'value' +p34845 +S'none' +p34846 +sssS'description' +p34847 +(dp34848 +S'editable' +p34849 +I01 +sS'value' +p34850 +g47 +sssS'shots' +p34851 +(dp34852 +S'mandatory' +p34853 +(dp34854 +S'editable' +p34855 +I00 +sS'value' +p34856 +I00 +ssS'name' +p34857 +(dp34858 +S'editable' +p34859 +I01 +sS'value' +p34860 +S'Sub Shots' +p34861 +ssS'data_type' +p34862 +(dp34863 +S'editable' +p34864 +I00 +sS'value' +p34865 +S'multi_entity' +p34866 +ssS'entity_type' +p34867 +(dp34868 +S'editable' +p34869 +I00 +sS'value' +p34870 +S'Shot' +p34871 +ssS'editable' +p34872 +(dp34873 +S'editable' +p34874 +I00 +sS'value' +p34875 +I01 +ssS'unique' +p34876 +(dp34877 +S'editable' +p34878 +I00 +sS'value' +p34879 +I00 +ssS'properties' +p34880 +(dp34881 +S'default_value' +p34882 +(dp34883 +S'editable' +p34884 +I00 +sS'value' +p34885 +NssS'summary_default' +p34886 +(dp34887 +S'editable' +p34888 +I01 +sS'value' +p34889 +S'none' +p34890 +ssS'valid_types' +p34891 +(dp34892 +S'editable' +p34893 +I01 +sS'value' +p34894 +(lp34895 +S'Shot' +p34896 +asssS'description' +p34897 +(dp34898 +S'editable' +p34899 +I01 +sS'value' +p34900 +g47 +sssS'smart_head_duration' +p34901 +(dp34902 +S'mandatory' +p34903 +(dp34904 +S'editable' +p34905 +I00 +sS'value' +p34906 +I00 +ssS'name' +p34907 +(dp34908 +S'editable' +p34909 +I01 +sS'value' +p34910 +S'Head Duration' +p34911 +ssS'data_type' +p34912 +(dp34913 +S'editable' +p34914 +I00 +sS'value' +p34915 +S'number' +p34916 +ssS'entity_type' +p34917 +(dp34918 +S'editable' +p34919 +I00 +sS'value' +p34920 +S'Shot' +p34921 +ssS'editable' +p34922 +(dp34923 +S'editable' +p34924 +I00 +sS'value' +p34925 +I01 +ssS'unique' +p34926 +(dp34927 +S'editable' +p34928 +I00 +sS'value' +p34929 +I00 +ssS'properties' +p34930 +(dp34931 +S'default_value' +p34932 +(dp34933 +S'editable' +p34934 +I00 +sS'value' +p34935 +NssS'summary_default' +p34936 +(dp34937 +S'editable' +p34938 +I01 +sS'value' +p34939 +S'none' +p34940 +sssS'description' +p34941 +(dp34942 +S'editable' +p34943 +I01 +sS'value' +p34944 +g47 +sssS'cut_out' +p34945 +(dp34946 +S'mandatory' +p34947 +(dp34948 +S'editable' +p34949 +I00 +sS'value' +p34950 +I00 +ssS'name' +p34951 +(dp34952 +S'editable' +p34953 +I01 +sS'value' +p34954 +S'Raw Cut Out' +p34955 +ssS'data_type' +p34956 +(dp34957 +S'editable' +p34958 +I00 +sS'value' +p34959 +S'number' +p34960 +ssS'entity_type' +p34961 +(dp34962 +S'editable' +p34963 +I00 +sS'value' +p34964 +S'Shot' +p34965 +ssS'editable' +p34966 +(dp34967 +S'editable' +p34968 +I00 +sS'value' +p34969 +I01 +ssS'unique' +p34970 +(dp34971 +S'editable' +p34972 +I00 +sS'value' +p34973 +I00 +ssS'properties' +p34974 +(dp34975 +S'default_value' +p34976 +(dp34977 +S'editable' +p34978 +I00 +sS'value' +p34979 +NssS'summary_default' +p34980 +(dp34981 +S'editable' +p34982 +I01 +sS'value' +p34983 +S'none' +p34984 +sssS'description' +p34985 +(dp34986 +S'editable' +p34987 +I01 +sS'value' +p34988 +g47 +sssS'head_out' +p34989 +(dp34990 +S'mandatory' +p34991 +(dp34992 +S'editable' +p34993 +I00 +sS'value' +p34994 +I00 +ssS'name' +p34995 +(dp34996 +S'editable' +p34997 +I01 +sS'value' +p34998 +S'Raw Head Out' +p34999 +ssS'data_type' +p35000 +(dp35001 +S'editable' +p35002 +I00 +sS'value' +p35003 +S'number' +p35004 +ssS'entity_type' +p35005 +(dp35006 +S'editable' +p35007 +I00 +sS'value' +p35008 +S'Shot' +p35009 +ssS'editable' +p35010 +(dp35011 +S'editable' +p35012 +I00 +sS'value' +p35013 +I01 +ssS'unique' +p35014 +(dp35015 +S'editable' +p35016 +I00 +sS'value' +p35017 +I00 +ssS'properties' +p35018 +(dp35019 +S'default_value' +p35020 +(dp35021 +S'editable' +p35022 +I00 +sS'value' +p35023 +NssS'summary_default' +p35024 +(dp35025 +S'editable' +p35026 +I01 +sS'value' +p35027 +S'none' +p35028 +sssS'description' +p35029 +(dp35030 +S'editable' +p35031 +I01 +sS'value' +p35032 +g47 +sssS'notes' +p35033 +(dp35034 +S'mandatory' +p35035 +(dp35036 +S'editable' +p35037 +I00 +sS'value' +p35038 +I00 +ssS'name' +p35039 +(dp35040 +S'editable' +p35041 +I01 +sS'value' +p35042 +S'Notes' +p35043 +ssS'data_type' +p35044 +(dp35045 +S'editable' +p35046 +I00 +sS'value' +p35047 +S'multi_entity' +p35048 +ssS'entity_type' +p35049 +(dp35050 +S'editable' +p35051 +I00 +sS'value' +p35052 +S'Shot' +p35053 +ssS'editable' +p35054 +(dp35055 +S'editable' +p35056 +I00 +sS'value' +p35057 +I01 +ssS'unique' +p35058 +(dp35059 +S'editable' +p35060 +I00 +sS'value' +p35061 +I00 +ssS'properties' +p35062 +(dp35063 +S'default_value' +p35064 +(dp35065 +S'editable' +p35066 +I00 +sS'value' +p35067 +NssS'summary_default' +p35068 +(dp35069 +S'editable' +p35070 +I01 +sS'value' +p35071 +S'none' +p35072 +ssS'valid_types' +p35073 +(dp35074 +S'editable' +p35075 +I01 +sS'value' +p35076 +(lp35077 +S'Note' +p35078 +asssS'description' +p35079 +(dp35080 +S'editable' +p35081 +I01 +sS'value' +p35082 +g47 +ssssS'TankPublishedFile' +p35083 +(dp35084 +S'open_notes_count' +p35085 +(dp35086 +S'mandatory' +p35087 +(dp35088 +S'editable' +p35089 +I00 +sS'value' +p35090 +I00 +ssS'name' +p35091 +(dp35092 +S'editable' +p35093 +I01 +sS'value' +p35094 +S'Open Notes Count' +p35095 +ssS'data_type' +p35096 +(dp35097 +S'editable' +p35098 +I00 +sS'value' +p35099 +S'text' +p35100 +ssS'entity_type' +p35101 +(dp35102 +S'editable' +p35103 +I00 +sS'value' +p35104 +S'TankPublishedFile' +p35105 +ssS'editable' +p35106 +(dp35107 +S'editable' +p35108 +I00 +sS'value' +p35109 +I00 +ssS'unique' +p35110 +(dp35111 +S'editable' +p35112 +I00 +sS'value' +p35113 +I00 +ssS'properties' +p35114 +(dp35115 +S'default_value' +p35116 +(dp35117 +S'editable' +p35118 +I00 +sS'value' +p35119 +NssS'summary_default' +p35120 +(dp35121 +S'editable' +p35122 +I01 +sS'value' +p35123 +S'none' +p35124 +sssS'description' +p35125 +(dp35126 +S'editable' +p35127 +I01 +sS'value' +p35128 +g47 +sssS'code' +p35129 +(dp35130 +S'mandatory' +p35131 +(dp35132 +S'editable' +p35133 +I00 +sS'value' +p35134 +I01 +ssS'name' +p35135 +(dp35136 +S'editable' +p35137 +I01 +sS'value' +p35138 +S'Tank Published File Name' +p35139 +ssS'data_type' +p35140 +(dp35141 +S'editable' +p35142 +I00 +sS'value' +p35143 +S'text' +p35144 +ssS'entity_type' +p35145 +(dp35146 +S'editable' +p35147 +I00 +sS'value' +p35148 +S'TankPublishedFile' +p35149 +ssS'editable' +p35150 +(dp35151 +S'editable' +p35152 +I00 +sS'value' +p35153 +I01 +ssS'unique' +p35154 +(dp35155 +S'editable' +p35156 +I00 +sS'value' +p35157 +I00 +ssS'properties' +p35158 +(dp35159 +S'default_value' +p35160 +(dp35161 +S'editable' +p35162 +I00 +sS'value' +p35163 +NssS'summary_default' +p35164 +(dp35165 +S'editable' +p35166 +I01 +sS'value' +p35167 +S'none' +p35168 +sssS'description' +p35169 +(dp35170 +S'editable' +p35171 +I01 +sS'value' +p35172 +g47 +sssS'image' +p35173 +(dp35174 +S'mandatory' +p35175 +(dp35176 +S'editable' +p35177 +I00 +sS'value' +p35178 +I00 +ssS'name' +p35179 +(dp35180 +S'editable' +p35181 +I01 +sS'value' +p35182 +S'Thumbnail' +p35183 +ssS'data_type' +p35184 +(dp35185 +S'editable' +p35186 +I00 +sS'value' +p35187 +S'image' +p35188 +ssS'entity_type' +p35189 +(dp35190 +S'editable' +p35191 +I00 +sS'value' +p35192 +S'TankPublishedFile' +p35193 +ssS'editable' +p35194 +(dp35195 +S'editable' +p35196 +I00 +sS'value' +p35197 +I01 +ssS'unique' +p35198 +(dp35199 +S'editable' +p35200 +I00 +sS'value' +p35201 +I00 +ssS'properties' +p35202 +(dp35203 +S'default_value' +p35204 +(dp35205 +S'editable' +p35206 +I00 +sS'value' +p35207 +NssS'summary_default' +p35208 +(dp35209 +S'editable' +p35210 +I01 +sS'value' +p35211 +S'none' +p35212 +sssS'description' +p35213 +(dp35214 +S'editable' +p35215 +I01 +sS'value' +p35216 +g47 +sssS'updated_at' +p35217 +(dp35218 +S'mandatory' +p35219 +(dp35220 +S'editable' +p35221 +I00 +sS'value' +p35222 +I00 +ssS'name' +p35223 +(dp35224 +S'editable' +p35225 +I01 +sS'value' +p35226 +S'Date Updated' +p35227 +ssS'data_type' +p35228 +(dp35229 +S'editable' +p35230 +I00 +sS'value' +p35231 +S'date_time' +p35232 +ssS'entity_type' +p35233 +(dp35234 +S'editable' +p35235 +I00 +sS'value' +p35236 +S'TankPublishedFile' +p35237 +ssS'editable' +p35238 +(dp35239 +S'editable' +p35240 +I00 +sS'value' +p35241 +I00 +ssS'unique' +p35242 +(dp35243 +S'editable' +p35244 +I00 +sS'value' +p35245 +I00 +ssS'properties' +p35246 +(dp35247 +S'default_value' +p35248 +(dp35249 +S'editable' +p35250 +I00 +sS'value' +p35251 +NssS'summary_default' +p35252 +(dp35253 +S'editable' +p35254 +I01 +sS'value' +p35255 +S'none' +p35256 +sssS'description' +p35257 +(dp35258 +S'editable' +p35259 +I01 +sS'value' +p35260 +g47 +sssS'entity' +p35261 +(dp35262 +S'mandatory' +p35263 +(dp35264 +S'editable' +p35265 +I00 +sS'value' +p35266 +I00 +ssS'name' +p35267 +(dp35268 +S'editable' +p35269 +I01 +sS'value' +p35270 +S'Link' +p35271 +ssS'data_type' +p35272 +(dp35273 +S'editable' +p35274 +I00 +sS'value' +p35275 +S'entity' +p35276 +ssS'entity_type' +p35277 +(dp35278 +S'editable' +p35279 +I00 +sS'value' +p35280 +S'TankPublishedFile' +p35281 +ssS'editable' +p35282 +(dp35283 +S'editable' +p35284 +I00 +sS'value' +p35285 +I00 +ssS'unique' +p35286 +(dp35287 +S'editable' +p35288 +I00 +sS'value' +p35289 +I00 +ssS'properties' +p35290 +(dp35291 +S'default_value' +p35292 +(dp35293 +S'editable' +p35294 +I00 +sS'value' +p35295 +NssS'summary_default' +p35296 +(dp35297 +S'editable' +p35298 +I01 +sS'value' +p35299 +S'none' +p35300 +ssS'valid_types' +p35301 +(dp35302 +S'editable' +p35303 +I01 +sS'value' +p35304 +(lp35305 +S'Asset' +p35306 +aS'Shot' +p35307 +aS'Project' +p35308 +asssS'description' +p35309 +(dp35310 +S'editable' +p35311 +I01 +sS'value' +p35312 +g47 +sssS'cached_display_name' +p35313 +(dp35314 +S'mandatory' +p35315 +(dp35316 +S'editable' +p35317 +I00 +sS'value' +p35318 +I00 +ssS'name' +p35319 +(dp35320 +S'editable' +p35321 +I01 +sS'value' +p35322 +S'Cached Display Name' +p35323 +ssS'data_type' +p35324 +(dp35325 +S'editable' +p35326 +I00 +sS'value' +p35327 +S'text' +p35328 +ssS'entity_type' +p35329 +(dp35330 +S'editable' +p35331 +I00 +sS'value' +p35332 +S'TankPublishedFile' +p35333 +ssS'editable' +p35334 +(dp35335 +S'editable' +p35336 +I00 +sS'value' +p35337 +I01 +ssS'unique' +p35338 +(dp35339 +S'editable' +p35340 +I00 +sS'value' +p35341 +I00 +ssS'properties' +p35342 +(dp35343 +S'default_value' +p35344 +(dp35345 +S'editable' +p35346 +I00 +sS'value' +p35347 +NssS'summary_default' +p35348 +(dp35349 +S'editable' +p35350 +I00 +sS'value' +p35351 +S'none' +p35352 +sssS'description' +p35353 +(dp35354 +S'editable' +p35355 +I01 +sS'value' +p35356 +g47 +sssS'downstream_tank_published_files' +p35357 +(dp35358 +S'mandatory' +p35359 +(dp35360 +S'editable' +p35361 +I00 +sS'value' +p35362 +I00 +ssS'name' +p35363 +(dp35364 +S'editable' +p35365 +I01 +sS'value' +p35366 +S'Downstream Tank Published Files' +p35367 +ssS'data_type' +p35368 +(dp35369 +S'editable' +p35370 +I00 +sS'value' +p35371 +S'multi_entity' +p35372 +ssS'entity_type' +p35373 +(dp35374 +S'editable' +p35375 +I00 +sS'value' +p35376 +S'TankPublishedFile' +p35377 +ssS'editable' +p35378 +(dp35379 +S'editable' +p35380 +I00 +sS'value' +p35381 +I01 +ssS'unique' +p35382 +(dp35383 +S'editable' +p35384 +I00 +sS'value' +p35385 +I00 +ssS'properties' +p35386 +(dp35387 +S'default_value' +p35388 +(dp35389 +S'editable' +p35390 +I00 +sS'value' +p35391 +NssS'summary_default' +p35392 +(dp35393 +S'editable' +p35394 +I00 +sS'value' +p35395 +S'none' +p35396 +ssS'valid_types' +p35397 +(dp35398 +S'editable' +p35399 +I00 +sS'value' +p35400 +(lp35401 +S'TankPublishedFile' +p35402 +asssS'description' +p35403 +(dp35404 +S'editable' +p35405 +I01 +sS'value' +p35406 +g47 +sssS'path_cache' +p35407 +(dp35408 +S'mandatory' +p35409 +(dp35410 +S'editable' +p35411 +I00 +sS'value' +p35412 +I00 +ssS'name' +p35413 +(dp35414 +S'editable' +p35415 +I01 +sS'value' +p35416 +S'Path Cache' +p35417 +ssS'data_type' +p35418 +(dp35419 +S'editable' +p35420 +I00 +sS'value' +p35421 +S'text' +p35422 +ssS'entity_type' +p35423 +(dp35424 +S'editable' +p35425 +I00 +sS'value' +p35426 +S'TankPublishedFile' +p35427 +ssS'editable' +p35428 +(dp35429 +S'editable' +p35430 +I00 +sS'value' +p35431 +I00 +ssS'unique' +p35432 +(dp35433 +S'editable' +p35434 +I00 +sS'value' +p35435 +I00 +ssS'properties' +p35436 +(dp35437 +S'default_value' +p35438 +(dp35439 +S'editable' +p35440 +I00 +sS'value' +p35441 +NssS'summary_default' +p35442 +(dp35443 +S'editable' +p35444 +I01 +sS'value' +p35445 +S'none' +p35446 +sssS'description' +p35447 +(dp35448 +S'editable' +p35449 +I01 +sS'value' +p35450 +g47 +sssS'id' +p35451 +(dp35452 +S'mandatory' +p35453 +(dp35454 +S'editable' +p35455 +I00 +sS'value' +p35456 +I00 +ssS'name' +p35457 +(dp35458 +S'editable' +p35459 +I01 +sS'value' +p35460 +S'Id' +p35461 +ssS'data_type' +p35462 +(dp35463 +S'editable' +p35464 +I00 +sS'value' +p35465 +S'number' +p35466 +ssS'entity_type' +p35467 +(dp35468 +S'editable' +p35469 +I00 +sS'value' +p35470 +S'TankPublishedFile' +p35471 +ssS'editable' +p35472 +(dp35473 +S'editable' +p35474 +I00 +sS'value' +p35475 +I00 +ssS'unique' +p35476 +(dp35477 +S'editable' +p35478 +I00 +sS'value' +p35479 +I00 +ssS'properties' +p35480 +(dp35481 +S'default_value' +p35482 +(dp35483 +S'editable' +p35484 +I00 +sS'value' +p35485 +NssS'summary_default' +p35486 +(dp35487 +S'editable' +p35488 +I01 +sS'value' +p35489 +S'none' +p35490 +sssS'description' +p35491 +(dp35492 +S'editable' +p35493 +I01 +sS'value' +p35494 +g47 +sssS'updated_by' +p35495 +(dp35496 +S'mandatory' +p35497 +(dp35498 +S'editable' +p35499 +I00 +sS'value' +p35500 +I00 +ssS'name' +p35501 +(dp35502 +S'editable' +p35503 +I01 +sS'value' +p35504 +S'Updated by' +p35505 +ssS'data_type' +p35506 +(dp35507 +S'editable' +p35508 +I00 +sS'value' +p35509 +S'entity' +p35510 +ssS'entity_type' +p35511 +(dp35512 +S'editable' +p35513 +I00 +sS'value' +p35514 +S'TankPublishedFile' +p35515 +ssS'editable' +p35516 +(dp35517 +S'editable' +p35518 +I00 +sS'value' +p35519 +I00 +ssS'unique' +p35520 +(dp35521 +S'editable' +p35522 +I00 +sS'value' +p35523 +I00 +ssS'properties' +p35524 +(dp35525 +S'default_value' +p35526 +(dp35527 +S'editable' +p35528 +I00 +sS'value' +p35529 +NssS'summary_default' +p35530 +(dp35531 +S'editable' +p35532 +I01 +sS'value' +p35533 +S'none' +p35534 +ssS'valid_types' +p35535 +(dp35536 +S'editable' +p35537 +I01 +sS'value' +p35538 +(lp35539 +S'HumanUser' +p35540 +aS'ApiUser' +p35541 +asssS'description' +p35542 +(dp35543 +S'editable' +p35544 +I01 +sS'value' +p35545 +g47 +sssS'open_notes' +p35546 +(dp35547 +S'mandatory' +p35548 +(dp35549 +S'editable' +p35550 +I00 +sS'value' +p35551 +I00 +ssS'name' +p35552 +(dp35553 +S'editable' +p35554 +I01 +sS'value' +p35555 +S'Open Notes' +p35556 +ssS'data_type' +p35557 +(dp35558 +S'editable' +p35559 +I00 +sS'value' +p35560 +S'multi_entity' +p35561 +ssS'entity_type' +p35562 +(dp35563 +S'editable' +p35564 +I00 +sS'value' +p35565 +S'TankPublishedFile' +p35566 +ssS'editable' +p35567 +(dp35568 +S'editable' +p35569 +I00 +sS'value' +p35570 +I00 +ssS'unique' +p35571 +(dp35572 +S'editable' +p35573 +I00 +sS'value' +p35574 +I00 +ssS'properties' +p35575 +(dp35576 +S'default_value' +p35577 +(dp35578 +S'editable' +p35579 +I00 +sS'value' +p35580 +NssS'summary_default' +p35581 +(dp35582 +S'editable' +p35583 +I01 +sS'value' +p35584 +S'none' +p35585 +ssS'valid_types' +p35586 +(dp35587 +S'editable' +p35588 +I01 +sS'value' +p35589 +(lp35590 +S'Note' +p35591 +asssS'description' +p35592 +(dp35593 +S'editable' +p35594 +I01 +sS'value' +p35595 +g47 +sssS'upstream_tank_published_files' +p35596 +(dp35597 +S'mandatory' +p35598 +(dp35599 +S'editable' +p35600 +I00 +sS'value' +p35601 +I00 +ssS'name' +p35602 +(dp35603 +S'editable' +p35604 +I01 +sS'value' +p35605 +S'Upstream Tank Published Files' +p35606 +ssS'data_type' +p35607 +(dp35608 +S'editable' +p35609 +I00 +sS'value' +p35610 +S'multi_entity' +p35611 +ssS'entity_type' +p35612 +(dp35613 +S'editable' +p35614 +I00 +sS'value' +p35615 +S'TankPublishedFile' +p35616 +ssS'editable' +p35617 +(dp35618 +S'editable' +p35619 +I00 +sS'value' +p35620 +I01 +ssS'unique' +p35621 +(dp35622 +S'editable' +p35623 +I00 +sS'value' +p35624 +I00 +ssS'properties' +p35625 +(dp35626 +S'default_value' +p35627 +(dp35628 +S'editable' +p35629 +I00 +sS'value' +p35630 +NssS'summary_default' +p35631 +(dp35632 +S'editable' +p35633 +I00 +sS'value' +p35634 +S'none' +p35635 +ssS'valid_types' +p35636 +(dp35637 +S'editable' +p35638 +I00 +sS'value' +p35639 +(lp35640 +S'TankPublishedFile' +p35641 +asssS'description' +p35642 +(dp35643 +S'editable' +p35644 +I01 +sS'value' +p35645 +g47 +sssS'created_by' +p35646 +(dp35647 +S'mandatory' +p35648 +(dp35649 +S'editable' +p35650 +I00 +sS'value' +p35651 +I00 +ssS'name' +p35652 +(dp35653 +S'editable' +p35654 +I01 +sS'value' +p35655 +S'Created by' +p35656 +ssS'data_type' +p35657 +(dp35658 +S'editable' +p35659 +I00 +sS'value' +p35660 +S'entity' +p35661 +ssS'entity_type' +p35662 +(dp35663 +S'editable' +p35664 +I00 +sS'value' +p35665 +S'TankPublishedFile' +p35666 +ssS'editable' +p35667 +(dp35668 +S'editable' +p35669 +I00 +sS'value' +p35670 +I00 +ssS'unique' +p35671 +(dp35672 +S'editable' +p35673 +I00 +sS'value' +p35674 +I00 +ssS'properties' +p35675 +(dp35676 +S'default_value' +p35677 +(dp35678 +S'editable' +p35679 +I00 +sS'value' +p35680 +NssS'summary_default' +p35681 +(dp35682 +S'editable' +p35683 +I01 +sS'value' +p35684 +S'none' +p35685 +ssS'valid_types' +p35686 +(dp35687 +S'editable' +p35688 +I01 +sS'value' +p35689 +(lp35690 +S'HumanUser' +p35691 +aS'ApiUser' +p35692 +asssS'description' +p35693 +(dp35694 +S'editable' +p35695 +I01 +sS'value' +p35696 +g47 +sssS'sg_status_list' +p35697 +(dp35698 +S'mandatory' +p35699 +(dp35700 +S'editable' +p35701 +I00 +sS'value' +p35702 +I00 +ssS'name' +p35703 +(dp35704 +S'editable' +p35705 +I01 +sS'value' +p35706 +S'Status' +p35707 +ssS'data_type' +p35708 +(dp35709 +S'editable' +p35710 +I00 +sS'value' +p35711 +S'status_list' +p35712 +ssS'entity_type' +p35713 +(dp35714 +S'editable' +p35715 +I00 +sS'value' +p35716 +S'TankPublishedFile' +p35717 +ssS'editable' +p35718 +(dp35719 +S'editable' +p35720 +I00 +sS'value' +p35721 +I01 +ssS'unique' +p35722 +(dp35723 +S'editable' +p35724 +I00 +sS'value' +p35725 +I00 +ssS'properties' +p35726 +(dp35727 +S'default_value' +p35728 +(dp35729 +S'editable' +p35730 +I01 +sS'value' +p35731 +S'wtg' +p35732 +ssS'valid_values' +p35733 +(dp35734 +S'editable' +p35735 +I01 +sS'value' +p35736 +(lp35737 +S'wtg' +p35738 +aS'ip' +p35739 +aS'cmpt' +p35740 +assS'summary_default' +p35741 +(dp35742 +S'editable' +p35743 +I01 +sS'value' +p35744 +S'none' +p35745 +sssS'description' +p35746 +(dp35747 +S'editable' +p35748 +I01 +sS'value' +p35749 +g47 +sssS'description' +p35750 +(dp35751 +S'mandatory' +p35752 +(dp35753 +S'editable' +p35754 +I00 +sS'value' +p35755 +I00 +ssS'name' +p35756 +(dp35757 +S'editable' +p35758 +I01 +sS'value' +p35759 +S'Description' +p35760 +ssS'data_type' +p35761 +(dp35762 +S'editable' +p35763 +I00 +sS'value' +p35764 +S'text' +p35765 +ssS'entity_type' +p35766 +(dp35767 +S'editable' +p35768 +I00 +sS'value' +p35769 +S'TankPublishedFile' +p35770 +ssS'editable' +p35771 +(dp35772 +S'editable' +p35773 +I00 +sS'value' +p35774 +I01 +ssS'unique' +p35775 +(dp35776 +S'editable' +p35777 +I00 +sS'value' +p35778 +I00 +ssS'properties' +p35779 +(dp35780 +S'default_value' +p35781 +(dp35782 +S'editable' +p35783 +I00 +sS'value' +p35784 +NssS'summary_default' +p35785 +(dp35786 +S'editable' +p35787 +I01 +sS'value' +p35788 +S'none' +p35789 +sssS'description' +p35790 +(dp35791 +S'editable' +p35792 +I01 +sS'value' +p35793 +g47 +sssS'path_cache_storage' +p35794 +(dp35795 +S'mandatory' +p35796 +(dp35797 +S'editable' +p35798 +I00 +sS'value' +p35799 +I00 +ssS'name' +p35800 +(dp35801 +S'editable' +p35802 +I01 +sS'value' +p35803 +S'Path Cache Storage' +p35804 +ssS'data_type' +p35805 +(dp35806 +S'editable' +p35807 +I00 +sS'value' +p35808 +S'entity' +p35809 +ssS'entity_type' +p35810 +(dp35811 +S'editable' +p35812 +I00 +sS'value' +p35813 +S'TankPublishedFile' +p35814 +ssS'editable' +p35815 +(dp35816 +S'editable' +p35817 +I00 +sS'value' +p35818 +I00 +ssS'unique' +p35819 +(dp35820 +S'editable' +p35821 +I00 +sS'value' +p35822 +I00 +ssS'properties' +p35823 +(dp35824 +S'default_value' +p35825 +(dp35826 +S'editable' +p35827 +I00 +sS'value' +p35828 +NssS'summary_default' +p35829 +(dp35830 +S'editable' +p35831 +I01 +sS'value' +p35832 +S'none' +p35833 +ssS'valid_types' +p35834 +(dp35835 +S'editable' +p35836 +I01 +sS'value' +p35837 +(lp35838 +S'LocalStorage' +p35839 +asssS'description' +p35840 +(dp35841 +S'editable' +p35842 +I01 +sS'value' +p35843 +g47 +sssS'path' +p35844 +(dp35845 +S'mandatory' +p35846 +(dp35847 +S'editable' +p35848 +I00 +sS'value' +p35849 +I00 +ssS'name' +p35850 +(dp35851 +S'editable' +p35852 +I01 +sS'value' +p35853 +S'Path' +p35854 +ssS'data_type' +p35855 +(dp35856 +S'editable' +p35857 +I00 +sS'value' +p35858 +S'url' +p35859 +ssS'entity_type' +p35860 +(dp35861 +S'editable' +p35862 +I00 +sS'value' +p35863 +S'TankPublishedFile' +p35864 +ssS'editable' +p35865 +(dp35866 +S'editable' +p35867 +I00 +sS'value' +p35868 +I00 +ssS'unique' +p35869 +(dp35870 +S'editable' +p35871 +I00 +sS'value' +p35872 +I00 +ssS'properties' +p35873 +(dp35874 +S'default_value' +p35875 +(dp35876 +S'editable' +p35877 +I00 +sS'value' +p35878 +NssS'open_in_new_window' +p35879 +(dp35880 +S'editable' +p35881 +I01 +sS'value' +p35882 +I01 +ssS'summary_default' +p35883 +(dp35884 +S'editable' +p35885 +I01 +sS'value' +p35886 +S'none' +p35887 +sssS'description' +p35888 +(dp35889 +S'editable' +p35890 +I01 +sS'value' +p35891 +g47 +sssS'version_number' +p35892 +(dp35893 +S'mandatory' +p35894 +(dp35895 +S'editable' +p35896 +I00 +sS'value' +p35897 +I00 +ssS'name' +p35898 +(dp35899 +S'editable' +p35900 +I01 +sS'value' +p35901 +S'Version Number' +p35902 +ssS'data_type' +p35903 +(dp35904 +S'editable' +p35905 +I00 +sS'value' +p35906 +S'number' +p35907 +ssS'entity_type' +p35908 +(dp35909 +S'editable' +p35910 +I00 +sS'value' +p35911 +S'TankPublishedFile' +p35912 +ssS'editable' +p35913 +(dp35914 +S'editable' +p35915 +I00 +sS'value' +p35916 +I00 +ssS'unique' +p35917 +(dp35918 +S'editable' +p35919 +I00 +sS'value' +p35920 +I00 +ssS'properties' +p35921 +(dp35922 +S'default_value' +p35923 +(dp35924 +S'editable' +p35925 +I00 +sS'value' +p35926 +NssS'summary_default' +p35927 +(dp35928 +S'editable' +p35929 +I01 +sS'value' +p35930 +S'none' +p35931 +sssS'description' +p35932 +(dp35933 +S'editable' +p35934 +I01 +sS'value' +p35935 +g47 +sssS'task' +p35936 +(dp35937 +S'mandatory' +p35938 +(dp35939 +S'editable' +p35940 +I00 +sS'value' +p35941 +I00 +ssS'name' +p35942 +(dp35943 +S'editable' +p35944 +I01 +sS'value' +p35945 +S'Task' +p35946 +ssS'data_type' +p35947 +(dp35948 +S'editable' +p35949 +I00 +sS'value' +p35950 +S'entity' +p35951 +ssS'entity_type' +p35952 +(dp35953 +S'editable' +p35954 +I00 +sS'value' +p35955 +S'TankPublishedFile' +p35956 +ssS'editable' +p35957 +(dp35958 +S'editable' +p35959 +I00 +sS'value' +p35960 +I00 +ssS'unique' +p35961 +(dp35962 +S'editable' +p35963 +I00 +sS'value' +p35964 +I00 +ssS'properties' +p35965 +(dp35966 +S'default_value' +p35967 +(dp35968 +S'editable' +p35969 +I00 +sS'value' +p35970 +NssS'summary_default' +p35971 +(dp35972 +S'editable' +p35973 +I01 +sS'value' +p35974 +S'none' +p35975 +ssS'valid_types' +p35976 +(dp35977 +S'editable' +p35978 +I01 +sS'value' +p35979 +(lp35980 +S'Task' +p35981 +asssS'description' +p35982 +(dp35983 +S'editable' +p35984 +I01 +sS'value' +p35985 +g47 +sssS'name' +p35986 +(dp35987 +S'mandatory' +p35988 +(dp35989 +S'editable' +p35990 +I00 +sS'value' +p35991 +I00 +ssS'name' +p35992 +(dp35993 +S'editable' +p35994 +I01 +sS'value' +p35995 +S'Name' +p35996 +ssS'data_type' +p35997 +(dp35998 +S'editable' +p35999 +I00 +sS'value' +p36000 +S'text' +p36001 +ssS'entity_type' +p36002 +(dp36003 +S'editable' +p36004 +I00 +sS'value' +p36005 +S'TankPublishedFile' +p36006 +ssS'editable' +p36007 +(dp36008 +S'editable' +p36009 +I00 +sS'value' +p36010 +I00 +ssS'unique' +p36011 +(dp36012 +S'editable' +p36013 +I00 +sS'value' +p36014 +I00 +ssS'properties' +p36015 +(dp36016 +S'default_value' +p36017 +(dp36018 +S'editable' +p36019 +I00 +sS'value' +p36020 +NssS'summary_default' +p36021 +(dp36022 +S'editable' +p36023 +I01 +sS'value' +p36024 +S'none' +p36025 +sssS'description' +p36026 +(dp36027 +S'editable' +p36028 +I01 +sS'value' +p36029 +g47 +sssS'created_at' +p36030 +(dp36031 +S'mandatory' +p36032 +(dp36033 +S'editable' +p36034 +I00 +sS'value' +p36035 +I00 +ssS'name' +p36036 +(dp36037 +S'editable' +p36038 +I01 +sS'value' +p36039 +S'Date Created' +p36040 +ssS'data_type' +p36041 +(dp36042 +S'editable' +p36043 +I00 +sS'value' +p36044 +S'date_time' +p36045 +ssS'entity_type' +p36046 +(dp36047 +S'editable' +p36048 +I00 +sS'value' +p36049 +S'TankPublishedFile' +p36050 +ssS'editable' +p36051 +(dp36052 +S'editable' +p36053 +I00 +sS'value' +p36054 +I00 +ssS'unique' +p36055 +(dp36056 +S'editable' +p36057 +I00 +sS'value' +p36058 +I00 +ssS'properties' +p36059 +(dp36060 +S'default_value' +p36061 +(dp36062 +S'editable' +p36063 +I00 +sS'value' +p36064 +NssS'summary_default' +p36065 +(dp36066 +S'editable' +p36067 +I01 +sS'value' +p36068 +S'none' +p36069 +sssS'description' +p36070 +(dp36071 +S'editable' +p36072 +I01 +sS'value' +p36073 +g47 +sssS'tank_type' +p36074 +(dp36075 +S'mandatory' +p36076 +(dp36077 +S'editable' +p36078 +I00 +sS'value' +p36079 +I00 +ssS'name' +p36080 +(dp36081 +S'editable' +p36082 +I01 +sS'value' +p36083 +S'Tank Type' +p36084 +ssS'data_type' +p36085 +(dp36086 +S'editable' +p36087 +I00 +sS'value' +p36088 +S'entity' +p36089 +ssS'entity_type' +p36090 +(dp36091 +S'editable' +p36092 +I00 +sS'value' +p36093 +S'TankPublishedFile' +p36094 +ssS'editable' +p36095 +(dp36096 +S'editable' +p36097 +I00 +sS'value' +p36098 +I00 +ssS'unique' +p36099 +(dp36100 +S'editable' +p36101 +I00 +sS'value' +p36102 +I00 +ssS'properties' +p36103 +(dp36104 +S'default_value' +p36105 +(dp36106 +S'editable' +p36107 +I00 +sS'value' +p36108 +NssS'summary_default' +p36109 +(dp36110 +S'editable' +p36111 +I01 +sS'value' +p36112 +S'none' +p36113 +ssS'valid_types' +p36114 +(dp36115 +S'editable' +p36116 +I01 +sS'value' +p36117 +(lp36118 +S'TankType' +p36119 +asssS'description' +p36120 +(dp36121 +S'editable' +p36122 +I01 +sS'value' +p36123 +g47 +sssS'project' +p36124 +(dp36125 +S'mandatory' +p36126 +(dp36127 +S'editable' +p36128 +I00 +sS'value' +p36129 +I00 +ssS'name' +p36130 +(dp36131 +S'editable' +p36132 +I01 +sS'value' +p36133 +S'Project' +p36134 +ssS'data_type' +p36135 +(dp36136 +S'editable' +p36137 +I00 +sS'value' +p36138 +S'entity' +p36139 +ssS'entity_type' +p36140 +(dp36141 +S'editable' +p36142 +I00 +sS'value' +p36143 +S'TankPublishedFile' +p36144 +ssS'editable' +p36145 +(dp36146 +S'editable' +p36147 +I00 +sS'value' +p36148 +I01 +ssS'unique' +p36149 +(dp36150 +S'editable' +p36151 +I00 +sS'value' +p36152 +I00 +ssS'properties' +p36153 +(dp36154 +S'default_value' +p36155 +(dp36156 +S'editable' +p36157 +I00 +sS'value' +p36158 +NssS'summary_default' +p36159 +(dp36160 +S'editable' +p36161 +I01 +sS'value' +p36162 +S'none' +p36163 +ssS'valid_types' +p36164 +(dp36165 +S'editable' +p36166 +I01 +sS'value' +p36167 +(lp36168 +S'Project' +p36169 +asssS'description' +p36170 +(dp36171 +S'editable' +p36172 +I01 +sS'value' +p36173 +g47 +sssS'tag_list' +p36174 +(dp36175 +S'mandatory' +p36176 +(dp36177 +S'editable' +p36178 +I00 +sS'value' +p36179 +I00 +ssS'name' +p36180 +(dp36181 +S'editable' +p36182 +I01 +sS'value' +p36183 +S'Tags' +p36184 +ssS'data_type' +p36185 +(dp36186 +S'editable' +p36187 +I00 +sS'value' +p36188 +S'tag_list' +p36189 +ssS'entity_type' +p36190 +(dp36191 +S'editable' +p36192 +I00 +sS'value' +p36193 +S'TankPublishedFile' +p36194 +ssS'editable' +p36195 +(dp36196 +S'editable' +p36197 +I00 +sS'value' +p36198 +I01 +ssS'unique' +p36199 +(dp36200 +S'editable' +p36201 +I00 +sS'value' +p36202 +I00 +ssS'properties' +p36203 +(dp36204 +S'default_value' +p36205 +(dp36206 +S'editable' +p36207 +I00 +sS'value' +p36208 +NssS'summary_default' +p36209 +(dp36210 +S'editable' +p36211 +I01 +sS'value' +p36212 +S'none' +p36213 +ssS'valid_types' +p36214 +(dp36215 +S'editable' +p36216 +I01 +sS'value' +p36217 +(lp36218 +S'Tag' +p36219 +asssS'description' +p36220 +(dp36221 +S'editable' +p36222 +I01 +sS'value' +p36223 +g47 +sssS'notes' +p36224 +(dp36225 +S'mandatory' +p36226 +(dp36227 +S'editable' +p36228 +I00 +sS'value' +p36229 +I00 +ssS'name' +p36230 +(dp36231 +S'editable' +p36232 +I01 +sS'value' +p36233 +S'Notes' +p36234 +ssS'data_type' +p36235 +(dp36236 +S'editable' +p36237 +I00 +sS'value' +p36238 +S'multi_entity' +p36239 +ssS'entity_type' +p36240 +(dp36241 +S'editable' +p36242 +I00 +sS'value' +p36243 +S'TankPublishedFile' +p36244 +ssS'editable' +p36245 +(dp36246 +S'editable' +p36247 +I00 +sS'value' +p36248 +I01 +ssS'unique' +p36249 +(dp36250 +S'editable' +p36251 +I00 +sS'value' +p36252 +I00 +ssS'properties' +p36253 +(dp36254 +S'default_value' +p36255 +(dp36256 +S'editable' +p36257 +I00 +sS'value' +p36258 +NssS'summary_default' +p36259 +(dp36260 +S'editable' +p36261 +I01 +sS'value' +p36262 +S'none' +p36263 +ssS'valid_types' +p36264 +(dp36265 +S'editable' +p36266 +I01 +sS'value' +p36267 +(lp36268 +S'Note' +p36269 +asssS'description' +p36270 +(dp36271 +S'editable' +p36272 +I01 +sS'value' +p36273 +g47 +ssssS'CustomEntity04' +p36274 +(dp36275 +S'open_notes_count' +p36276 +(dp36277 +S'mandatory' +p36278 +(dp36279 +S'editable' +p36280 +I00 +sS'value' +p36281 +I00 +ssS'name' +p36282 +(dp36283 +S'editable' +p36284 +I01 +sS'value' +p36285 +S'Open Notes Count' +p36286 +ssS'data_type' +p36287 +(dp36288 +S'editable' +p36289 +I00 +sS'value' +p36290 +S'text' +p36291 +ssS'entity_type' +p36292 +(dp36293 +S'editable' +p36294 +I00 +sS'value' +p36295 +S'CustomEntity04' +p36296 +ssS'editable' +p36297 +(dp36298 +S'editable' +p36299 +I00 +sS'value' +p36300 +I00 +ssS'unique' +p36301 +(dp36302 +S'editable' +p36303 +I00 +sS'value' +p36304 +I00 +ssS'properties' +p36305 +(dp36306 +S'default_value' +p36307 +(dp36308 +S'editable' +p36309 +I00 +sS'value' +p36310 +NssS'summary_default' +p36311 +(dp36312 +S'editable' +p36313 +I01 +sS'value' +p36314 +S'none' +p36315 +sssS'description' +p36316 +(dp36317 +S'editable' +p36318 +I01 +sS'value' +p36319 +g47 +sssS'code' +p36320 +(dp36321 +S'mandatory' +p36322 +(dp36323 +S'editable' +p36324 +I00 +sS'value' +p36325 +I01 +ssS'name' +p36326 +(dp36327 +S'editable' +p36328 +I01 +sS'value' +p36329 +S'Custom Entity04 Name' +p36330 +ssS'data_type' +p36331 +(dp36332 +S'editable' +p36333 +I00 +sS'value' +p36334 +S'text' +p36335 +ssS'entity_type' +p36336 +(dp36337 +S'editable' +p36338 +I00 +sS'value' +p36339 +S'CustomEntity04' +p36340 +ssS'editable' +p36341 +(dp36342 +S'editable' +p36343 +I00 +sS'value' +p36344 +I01 +ssS'unique' +p36345 +(dp36346 +S'editable' +p36347 +I00 +sS'value' +p36348 +I00 +ssS'properties' +p36349 +(dp36350 +S'default_value' +p36351 +(dp36352 +S'editable' +p36353 +I00 +sS'value' +p36354 +NssS'summary_default' +p36355 +(dp36356 +S'editable' +p36357 +I01 +sS'value' +p36358 +S'none' +p36359 +sssS'description' +p36360 +(dp36361 +S'editable' +p36362 +I01 +sS'value' +p36363 +g47 +sssS'open_notes' +p36364 +(dp36365 +S'mandatory' +p36366 +(dp36367 +S'editable' +p36368 +I00 +sS'value' +p36369 +I00 +ssS'name' +p36370 +(dp36371 +S'editable' +p36372 +I01 +sS'value' +p36373 +S'Open Notes' +p36374 +ssS'data_type' +p36375 +(dp36376 +S'editable' +p36377 +I00 +sS'value' +p36378 +S'multi_entity' +p36379 +ssS'entity_type' +p36380 +(dp36381 +S'editable' +p36382 +I00 +sS'value' +p36383 +S'CustomEntity04' +p36384 +ssS'editable' +p36385 +(dp36386 +S'editable' +p36387 +I00 +sS'value' +p36388 +I00 +ssS'unique' +p36389 +(dp36390 +S'editable' +p36391 +I00 +sS'value' +p36392 +I00 +ssS'properties' +p36393 +(dp36394 +S'default_value' +p36395 +(dp36396 +S'editable' +p36397 +I00 +sS'value' +p36398 +NssS'summary_default' +p36399 +(dp36400 +S'editable' +p36401 +I01 +sS'value' +p36402 +S'none' +p36403 +ssS'valid_types' +p36404 +(dp36405 +S'editable' +p36406 +I01 +sS'value' +p36407 +(lp36408 +S'Note' +p36409 +asssS'description' +p36410 +(dp36411 +S'editable' +p36412 +I01 +sS'value' +p36413 +g47 +sssS'description' +p36414 +(dp36415 +S'mandatory' +p36416 +(dp36417 +S'editable' +p36418 +I00 +sS'value' +p36419 +I00 +ssS'name' +p36420 +(dp36421 +S'editable' +p36422 +I01 +sS'value' +p36423 +S'Description' +p36424 +ssS'data_type' +p36425 +(dp36426 +S'editable' +p36427 +I00 +sS'value' +p36428 +S'text' +p36429 +ssS'entity_type' +p36430 +(dp36431 +S'editable' +p36432 +I00 +sS'value' +p36433 +S'CustomEntity04' +p36434 +ssS'editable' +p36435 +(dp36436 +S'editable' +p36437 +I00 +sS'value' +p36438 +I01 +ssS'unique' +p36439 +(dp36440 +S'editable' +p36441 +I00 +sS'value' +p36442 +I00 +ssS'properties' +p36443 +(dp36444 +S'default_value' +p36445 +(dp36446 +S'editable' +p36447 +I00 +sS'value' +p36448 +NssS'summary_default' +p36449 +(dp36450 +S'editable' +p36451 +I01 +sS'value' +p36452 +S'none' +p36453 +sssS'description' +p36454 +(dp36455 +S'editable' +p36456 +I01 +sS'value' +p36457 +g47 +sssS'created_at' +p36458 +(dp36459 +S'mandatory' +p36460 +(dp36461 +S'editable' +p36462 +I00 +sS'value' +p36463 +I00 +ssS'name' +p36464 +(dp36465 +S'editable' +p36466 +I01 +sS'value' +p36467 +S'Date Created' +p36468 +ssS'data_type' +p36469 +(dp36470 +S'editable' +p36471 +I00 +sS'value' +p36472 +S'date_time' +p36473 +ssS'entity_type' +p36474 +(dp36475 +S'editable' +p36476 +I00 +sS'value' +p36477 +S'CustomEntity04' +p36478 +ssS'editable' +p36479 +(dp36480 +S'editable' +p36481 +I00 +sS'value' +p36482 +I00 +ssS'unique' +p36483 +(dp36484 +S'editable' +p36485 +I00 +sS'value' +p36486 +I00 +ssS'properties' +p36487 +(dp36488 +S'default_value' +p36489 +(dp36490 +S'editable' +p36491 +I00 +sS'value' +p36492 +NssS'summary_default' +p36493 +(dp36494 +S'editable' +p36495 +I01 +sS'value' +p36496 +S'none' +p36497 +sssS'description' +p36498 +(dp36499 +S'editable' +p36500 +I01 +sS'value' +p36501 +g47 +sssS'updated_at' +p36502 +(dp36503 +S'mandatory' +p36504 +(dp36505 +S'editable' +p36506 +I00 +sS'value' +p36507 +I00 +ssS'name' +p36508 +(dp36509 +S'editable' +p36510 +I01 +sS'value' +p36511 +S'Date Updated' +p36512 +ssS'data_type' +p36513 +(dp36514 +S'editable' +p36515 +I00 +sS'value' +p36516 +S'date_time' +p36517 +ssS'entity_type' +p36518 +(dp36519 +S'editable' +p36520 +I00 +sS'value' +p36521 +S'CustomEntity04' +p36522 +ssS'editable' +p36523 +(dp36524 +S'editable' +p36525 +I00 +sS'value' +p36526 +I00 +ssS'unique' +p36527 +(dp36528 +S'editable' +p36529 +I00 +sS'value' +p36530 +I00 +ssS'properties' +p36531 +(dp36532 +S'default_value' +p36533 +(dp36534 +S'editable' +p36535 +I00 +sS'value' +p36536 +NssS'summary_default' +p36537 +(dp36538 +S'editable' +p36539 +I01 +sS'value' +p36540 +S'none' +p36541 +sssS'description' +p36542 +(dp36543 +S'editable' +p36544 +I01 +sS'value' +p36545 +g47 +sssS'created_by' +p36546 +(dp36547 +S'mandatory' +p36548 +(dp36549 +S'editable' +p36550 +I00 +sS'value' +p36551 +I00 +ssS'name' +p36552 +(dp36553 +S'editable' +p36554 +I01 +sS'value' +p36555 +S'Created by' +p36556 +ssS'data_type' +p36557 +(dp36558 +S'editable' +p36559 +I00 +sS'value' +p36560 +S'entity' +p36561 +ssS'entity_type' +p36562 +(dp36563 +S'editable' +p36564 +I00 +sS'value' +p36565 +S'CustomEntity04' +p36566 +ssS'editable' +p36567 +(dp36568 +S'editable' +p36569 +I00 +sS'value' +p36570 +I00 +ssS'unique' +p36571 +(dp36572 +S'editable' +p36573 +I00 +sS'value' +p36574 +I00 +ssS'properties' +p36575 +(dp36576 +S'default_value' +p36577 +(dp36578 +S'editable' +p36579 +I00 +sS'value' +p36580 +NssS'summary_default' +p36581 +(dp36582 +S'editable' +p36583 +I01 +sS'value' +p36584 +S'none' +p36585 +ssS'valid_types' +p36586 +(dp36587 +S'editable' +p36588 +I01 +sS'value' +p36589 +(lp36590 +S'HumanUser' +p36591 +aS'ApiUser' +p36592 +asssS'description' +p36593 +(dp36594 +S'editable' +p36595 +I01 +sS'value' +p36596 +g47 +sssS'id' +p36597 +(dp36598 +S'mandatory' +p36599 +(dp36600 +S'editable' +p36601 +I00 +sS'value' +p36602 +I00 +ssS'name' +p36603 +(dp36604 +S'editable' +p36605 +I01 +sS'value' +p36606 +S'Id' +p36607 +ssS'data_type' +p36608 +(dp36609 +S'editable' +p36610 +I00 +sS'value' +p36611 +S'number' +p36612 +ssS'entity_type' +p36613 +(dp36614 +S'editable' +p36615 +I00 +sS'value' +p36616 +S'CustomEntity04' +p36617 +ssS'editable' +p36618 +(dp36619 +S'editable' +p36620 +I00 +sS'value' +p36621 +I00 +ssS'unique' +p36622 +(dp36623 +S'editable' +p36624 +I00 +sS'value' +p36625 +I00 +ssS'properties' +p36626 +(dp36627 +S'default_value' +p36628 +(dp36629 +S'editable' +p36630 +I00 +sS'value' +p36631 +NssS'summary_default' +p36632 +(dp36633 +S'editable' +p36634 +I01 +sS'value' +p36635 +S'none' +p36636 +sssS'description' +p36637 +(dp36638 +S'editable' +p36639 +I01 +sS'value' +p36640 +g47 +sssS'project' +p36641 +(dp36642 +S'mandatory' +p36643 +(dp36644 +S'editable' +p36645 +I00 +sS'value' +p36646 +I00 +ssS'name' +p36647 +(dp36648 +S'editable' +p36649 +I01 +sS'value' +p36650 +S'Project' +p36651 +ssS'data_type' +p36652 +(dp36653 +S'editable' +p36654 +I00 +sS'value' +p36655 +S'entity' +p36656 +ssS'entity_type' +p36657 +(dp36658 +S'editable' +p36659 +I00 +sS'value' +p36660 +S'CustomEntity04' +p36661 +ssS'editable' +p36662 +(dp36663 +S'editable' +p36664 +I00 +sS'value' +p36665 +I01 +ssS'unique' +p36666 +(dp36667 +S'editable' +p36668 +I00 +sS'value' +p36669 +I00 +ssS'properties' +p36670 +(dp36671 +S'default_value' +p36672 +(dp36673 +S'editable' +p36674 +I00 +sS'value' +p36675 +NssS'summary_default' +p36676 +(dp36677 +S'editable' +p36678 +I01 +sS'value' +p36679 +S'none' +p36680 +ssS'valid_types' +p36681 +(dp36682 +S'editable' +p36683 +I01 +sS'value' +p36684 +(lp36685 +S'Project' +p36686 +asssS'description' +p36687 +(dp36688 +S'editable' +p36689 +I01 +sS'value' +p36690 +g47 +sssS'filmstrip_image' +p36691 +(dp36692 +S'mandatory' +p36693 +(dp36694 +S'editable' +p36695 +I00 +sS'value' +p36696 +I00 +ssS'name' +p36697 +(dp36698 +S'editable' +p36699 +I01 +sS'value' +p36700 +S'Filmstrip Thumbnail' +p36701 +ssS'data_type' +p36702 +(dp36703 +S'editable' +p36704 +I00 +sS'value' +p36705 +S'image' +p36706 +ssS'entity_type' +p36707 +(dp36708 +S'editable' +p36709 +I00 +sS'value' +p36710 +S'CustomEntity04' +p36711 +ssS'editable' +p36712 +(dp36713 +S'editable' +p36714 +I00 +sS'value' +p36715 +I01 +ssS'unique' +p36716 +(dp36717 +S'editable' +p36718 +I00 +sS'value' +p36719 +I00 +ssS'properties' +p36720 +(dp36721 +S'default_value' +p36722 +(dp36723 +S'editable' +p36724 +I00 +sS'value' +p36725 +NssS'summary_default' +p36726 +(dp36727 +S'editable' +p36728 +I01 +sS'value' +p36729 +S'none' +p36730 +sssS'description' +p36731 +(dp36732 +S'editable' +p36733 +I01 +sS'value' +p36734 +g47 +sssS'sg_status_list' +p36735 +(dp36736 +S'mandatory' +p36737 +(dp36738 +S'editable' +p36739 +I00 +sS'value' +p36740 +I00 +ssS'name' +p36741 +(dp36742 +S'editable' +p36743 +I01 +sS'value' +p36744 +S'Status' +p36745 +ssS'data_type' +p36746 +(dp36747 +S'editable' +p36748 +I00 +sS'value' +p36749 +S'status_list' +p36750 +ssS'entity_type' +p36751 +(dp36752 +S'editable' +p36753 +I00 +sS'value' +p36754 +S'CustomEntity04' +p36755 +ssS'editable' +p36756 +(dp36757 +S'editable' +p36758 +I00 +sS'value' +p36759 +I01 +ssS'unique' +p36760 +(dp36761 +S'editable' +p36762 +I00 +sS'value' +p36763 +I00 +ssS'properties' +p36764 +(dp36765 +S'default_value' +p36766 +(dp36767 +S'editable' +p36768 +I01 +sS'value' +p36769 +S'wtg' +p36770 +ssS'valid_values' +p36771 +(dp36772 +S'editable' +p36773 +I01 +sS'value' +p36774 +(lp36775 +S'cmpt' +p36776 +aS'ip' +p36777 +aS'wtg' +p36778 +assS'summary_default' +p36779 +(dp36780 +S'editable' +p36781 +I01 +sS'value' +p36782 +S'none' +p36783 +sssS'description' +p36784 +(dp36785 +S'editable' +p36786 +I01 +sS'value' +p36787 +g47 +sssS'image' +p36788 +(dp36789 +S'mandatory' +p36790 +(dp36791 +S'editable' +p36792 +I00 +sS'value' +p36793 +I00 +ssS'name' +p36794 +(dp36795 +S'editable' +p36796 +I01 +sS'value' +p36797 +S'Thumbnail' +p36798 +ssS'data_type' +p36799 +(dp36800 +S'editable' +p36801 +I00 +sS'value' +p36802 +S'image' +p36803 +ssS'entity_type' +p36804 +(dp36805 +S'editable' +p36806 +I00 +sS'value' +p36807 +S'CustomEntity04' +p36808 +ssS'editable' +p36809 +(dp36810 +S'editable' +p36811 +I00 +sS'value' +p36812 +I01 +ssS'unique' +p36813 +(dp36814 +S'editable' +p36815 +I00 +sS'value' +p36816 +I00 +ssS'properties' +p36817 +(dp36818 +S'default_value' +p36819 +(dp36820 +S'editable' +p36821 +I00 +sS'value' +p36822 +NssS'summary_default' +p36823 +(dp36824 +S'editable' +p36825 +I01 +sS'value' +p36826 +S'none' +p36827 +sssS'description' +p36828 +(dp36829 +S'editable' +p36830 +I01 +sS'value' +p36831 +g47 +sssS'cached_display_name' +p36832 +(dp36833 +S'mandatory' +p36834 +(dp36835 +S'editable' +p36836 +I00 +sS'value' +p36837 +I00 +ssS'name' +p36838 +(dp36839 +S'editable' +p36840 +I01 +sS'value' +p36841 +S'Cached Display Name' +p36842 +ssS'data_type' +p36843 +(dp36844 +S'editable' +p36845 +I00 +sS'value' +p36846 +S'text' +p36847 +ssS'entity_type' +p36848 +(dp36849 +S'editable' +p36850 +I00 +sS'value' +p36851 +S'CustomEntity04' +p36852 +ssS'editable' +p36853 +(dp36854 +S'editable' +p36855 +I00 +sS'value' +p36856 +I01 +ssS'unique' +p36857 +(dp36858 +S'editable' +p36859 +I00 +sS'value' +p36860 +I00 +ssS'properties' +p36861 +(dp36862 +S'default_value' +p36863 +(dp36864 +S'editable' +p36865 +I00 +sS'value' +p36866 +NssS'summary_default' +p36867 +(dp36868 +S'editable' +p36869 +I00 +sS'value' +p36870 +S'none' +p36871 +sssS'description' +p36872 +(dp36873 +S'editable' +p36874 +I01 +sS'value' +p36875 +g47 +sssS'tag_list' +p36876 +(dp36877 +S'mandatory' +p36878 +(dp36879 +S'editable' +p36880 +I00 +sS'value' +p36881 +I00 +ssS'name' +p36882 +(dp36883 +S'editable' +p36884 +I01 +sS'value' +p36885 +S'Tags' +p36886 +ssS'data_type' +p36887 +(dp36888 +S'editable' +p36889 +I00 +sS'value' +p36890 +S'tag_list' +p36891 +ssS'entity_type' +p36892 +(dp36893 +S'editable' +p36894 +I00 +sS'value' +p36895 +S'CustomEntity04' +p36896 +ssS'editable' +p36897 +(dp36898 +S'editable' +p36899 +I00 +sS'value' +p36900 +I01 +ssS'unique' +p36901 +(dp36902 +S'editable' +p36903 +I00 +sS'value' +p36904 +I00 +ssS'properties' +p36905 +(dp36906 +S'default_value' +p36907 +(dp36908 +S'editable' +p36909 +I00 +sS'value' +p36910 +NssS'summary_default' +p36911 +(dp36912 +S'editable' +p36913 +I01 +sS'value' +p36914 +S'none' +p36915 +ssS'valid_types' +p36916 +(dp36917 +S'editable' +p36918 +I01 +sS'value' +p36919 +(lp36920 +S'Tag' +p36921 +asssS'description' +p36922 +(dp36923 +S'editable' +p36924 +I01 +sS'value' +p36925 +g47 +sssS'notes' +p36926 +(dp36927 +S'mandatory' +p36928 +(dp36929 +S'editable' +p36930 +I00 +sS'value' +p36931 +I00 +ssS'name' +p36932 +(dp36933 +S'editable' +p36934 +I01 +sS'value' +p36935 +S'Notes' +p36936 +ssS'data_type' +p36937 +(dp36938 +S'editable' +p36939 +I00 +sS'value' +p36940 +S'multi_entity' +p36941 +ssS'entity_type' +p36942 +(dp36943 +S'editable' +p36944 +I00 +sS'value' +p36945 +S'CustomEntity04' +p36946 +ssS'editable' +p36947 +(dp36948 +S'editable' +p36949 +I00 +sS'value' +p36950 +I01 +ssS'unique' +p36951 +(dp36952 +S'editable' +p36953 +I00 +sS'value' +p36954 +I00 +ssS'properties' +p36955 +(dp36956 +S'default_value' +p36957 +(dp36958 +S'editable' +p36959 +I00 +sS'value' +p36960 +NssS'summary_default' +p36961 +(dp36962 +S'editable' +p36963 +I01 +sS'value' +p36964 +S'none' +p36965 +ssS'valid_types' +p36966 +(dp36967 +S'editable' +p36968 +I01 +sS'value' +p36969 +(lp36970 +S'Note' +p36971 +asssS'description' +p36972 +(dp36973 +S'editable' +p36974 +I01 +sS'value' +p36975 +g47 +sssS'updated_by' +p36976 +(dp36977 +S'mandatory' +p36978 +(dp36979 +S'editable' +p36980 +I00 +sS'value' +p36981 +I00 +ssS'name' +p36982 +(dp36983 +S'editable' +p36984 +I01 +sS'value' +p36985 +S'Updated by' +p36986 +ssS'data_type' +p36987 +(dp36988 +S'editable' +p36989 +I00 +sS'value' +p36990 +S'entity' +p36991 +ssS'entity_type' +p36992 +(dp36993 +S'editable' +p36994 +I00 +sS'value' +p36995 +S'CustomEntity04' +p36996 +ssS'editable' +p36997 +(dp36998 +S'editable' +p36999 +I00 +sS'value' +p37000 +I00 +ssS'unique' +p37001 +(dp37002 +S'editable' +p37003 +I00 +sS'value' +p37004 +I00 +ssS'properties' +p37005 +(dp37006 +S'default_value' +p37007 +(dp37008 +S'editable' +p37009 +I00 +sS'value' +p37010 +NssS'summary_default' +p37011 +(dp37012 +S'editable' +p37013 +I01 +sS'value' +p37014 +S'none' +p37015 +ssS'valid_types' +p37016 +(dp37017 +S'editable' +p37018 +I01 +sS'value' +p37019 +(lp37020 +S'HumanUser' +p37021 +aS'ApiUser' +p37022 +asssS'description' +p37023 +(dp37024 +S'editable' +p37025 +I01 +sS'value' +p37026 +g47 +ssssS'Sequence' +p37027 +(dp37028 +S'sg_sequence_type' +p37029 +(dp37030 +S'mandatory' +p37031 +(dp37032 +S'editable' +p37033 +I00 +sS'value' +p37034 +I00 +ssS'name' +p37035 +(dp37036 +S'editable' +p37037 +I01 +sS'value' +p37038 +S'Type' +p37039 +ssS'data_type' +p37040 +(dp37041 +S'editable' +p37042 +I00 +sS'value' +p37043 +S'list' +p37044 +ssS'entity_type' +p37045 +(dp37046 +S'editable' +p37047 +I00 +sS'value' +p37048 +S'Sequence' +p37049 +ssS'editable' +p37050 +(dp37051 +S'editable' +p37052 +I00 +sS'value' +p37053 +I01 +ssS'unique' +p37054 +(dp37055 +S'editable' +p37056 +I00 +sS'value' +p37057 +I00 +ssS'properties' +p37058 +(dp37059 +S'default_value' +p37060 +(dp37061 +S'editable' +p37062 +I00 +sS'value' +p37063 +NssS'valid_values' +p37064 +(dp37065 +S'editable' +p37066 +I01 +sS'value' +p37067 +(lp37068 +ssS'summary_default' +p37069 +(dp37070 +S'editable' +p37071 +I01 +sS'value' +p37072 +S'none' +p37073 +sssS'description' +p37074 +(dp37075 +S'editable' +p37076 +I01 +sS'value' +p37077 +g47 +sssS'open_notes_count' +p37078 +(dp37079 +S'mandatory' +p37080 +(dp37081 +S'editable' +p37082 +I00 +sS'value' +p37083 +I00 +ssS'name' +p37084 +(dp37085 +S'editable' +p37086 +I01 +sS'value' +p37087 +S'Open Notes Count' +p37088 +ssS'data_type' +p37089 +(dp37090 +S'editable' +p37091 +I00 +sS'value' +p37092 +S'text' +p37093 +ssS'entity_type' +p37094 +(dp37095 +S'editable' +p37096 +I00 +sS'value' +p37097 +S'Sequence' +p37098 +ssS'editable' +p37099 +(dp37100 +S'editable' +p37101 +I00 +sS'value' +p37102 +I00 +ssS'unique' +p37103 +(dp37104 +S'editable' +p37105 +I00 +sS'value' +p37106 +I00 +ssS'properties' +p37107 +(dp37108 +S'default_value' +p37109 +(dp37110 +S'editable' +p37111 +I00 +sS'value' +p37112 +NssS'summary_default' +p37113 +(dp37114 +S'editable' +p37115 +I01 +sS'value' +p37116 +S'none' +p37117 +sssS'description' +p37118 +(dp37119 +S'editable' +p37120 +I01 +sS'value' +p37121 +g47 +sssS'code' +p37122 +(dp37123 +S'mandatory' +p37124 +(dp37125 +S'editable' +p37126 +I00 +sS'value' +p37127 +I01 +ssS'name' +p37128 +(dp37129 +S'editable' +p37130 +I01 +sS'value' +p37131 +S'Sequence Name' +p37132 +ssS'data_type' +p37133 +(dp37134 +S'editable' +p37135 +I00 +sS'value' +p37136 +S'text' +p37137 +ssS'entity_type' +p37138 +(dp37139 +S'editable' +p37140 +I00 +sS'value' +p37141 +S'Sequence' +p37142 +ssS'editable' +p37143 +(dp37144 +S'editable' +p37145 +I00 +sS'value' +p37146 +I01 +ssS'unique' +p37147 +(dp37148 +S'editable' +p37149 +I00 +sS'value' +p37150 +I00 +ssS'properties' +p37151 +(dp37152 +S'default_value' +p37153 +(dp37154 +S'editable' +p37155 +I00 +sS'value' +p37156 +NssS'summary_default' +p37157 +(dp37158 +S'editable' +p37159 +I01 +sS'value' +p37160 +S'none' +p37161 +sssS'description' +p37162 +(dp37163 +S'editable' +p37164 +I01 +sS'value' +p37165 +g47 +sssS'image' +p37166 +(dp37167 +S'mandatory' +p37168 +(dp37169 +S'editable' +p37170 +I00 +sS'value' +p37171 +I00 +ssS'name' +p37172 +(dp37173 +S'editable' +p37174 +I01 +sS'value' +p37175 +S'Thumbnail' +p37176 +ssS'data_type' +p37177 +(dp37178 +S'editable' +p37179 +I00 +sS'value' +p37180 +S'image' +p37181 +ssS'entity_type' +p37182 +(dp37183 +S'editable' +p37184 +I00 +sS'value' +p37185 +S'Sequence' +p37186 +ssS'editable' +p37187 +(dp37188 +S'editable' +p37189 +I00 +sS'value' +p37190 +I01 +ssS'unique' +p37191 +(dp37192 +S'editable' +p37193 +I00 +sS'value' +p37194 +I00 +ssS'properties' +p37195 +(dp37196 +S'default_value' +p37197 +(dp37198 +S'editable' +p37199 +I00 +sS'value' +p37200 +NssS'summary_default' +p37201 +(dp37202 +S'editable' +p37203 +I01 +sS'value' +p37204 +S'none' +p37205 +sssS'description' +p37206 +(dp37207 +S'editable' +p37208 +I01 +sS'value' +p37209 +g47 +sssS'updated_at' +p37210 +(dp37211 +S'mandatory' +p37212 +(dp37213 +S'editable' +p37214 +I00 +sS'value' +p37215 +I00 +ssS'name' +p37216 +(dp37217 +S'editable' +p37218 +I01 +sS'value' +p37219 +S'Date Updated' +p37220 +ssS'data_type' +p37221 +(dp37222 +S'editable' +p37223 +I00 +sS'value' +p37224 +S'date_time' +p37225 +ssS'entity_type' +p37226 +(dp37227 +S'editable' +p37228 +I00 +sS'value' +p37229 +S'Sequence' +p37230 +ssS'editable' +p37231 +(dp37232 +S'editable' +p37233 +I00 +sS'value' +p37234 +I00 +ssS'unique' +p37235 +(dp37236 +S'editable' +p37237 +I00 +sS'value' +p37238 +I00 +ssS'properties' +p37239 +(dp37240 +S'default_value' +p37241 +(dp37242 +S'editable' +p37243 +I00 +sS'value' +p37244 +NssS'summary_default' +p37245 +(dp37246 +S'editable' +p37247 +I01 +sS'value' +p37248 +S'none' +p37249 +sssS'description' +p37250 +(dp37251 +S'editable' +p37252 +I01 +sS'value' +p37253 +g47 +sssS'tasks' +p37254 +(dp37255 +S'mandatory' +p37256 +(dp37257 +S'editable' +p37258 +I00 +sS'value' +p37259 +I00 +ssS'name' +p37260 +(dp37261 +S'editable' +p37262 +I01 +sS'value' +p37263 +S'Tasks' +p37264 +ssS'data_type' +p37265 +(dp37266 +S'editable' +p37267 +I00 +sS'value' +p37268 +S'multi_entity' +p37269 +ssS'entity_type' +p37270 +(dp37271 +S'editable' +p37272 +I00 +sS'value' +p37273 +S'Sequence' +p37274 +ssS'editable' +p37275 +(dp37276 +S'editable' +p37277 +I00 +sS'value' +p37278 +I01 +ssS'unique' +p37279 +(dp37280 +S'editable' +p37281 +I00 +sS'value' +p37282 +I00 +ssS'properties' +p37283 +(dp37284 +S'default_value' +p37285 +(dp37286 +S'editable' +p37287 +I00 +sS'value' +p37288 +NssS'summary_default' +p37289 +(dp37290 +S'editable' +p37291 +I01 +sS'value' +p37292 +S'none' +p37293 +ssS'valid_types' +p37294 +(dp37295 +S'editable' +p37296 +I01 +sS'value' +p37297 +(lp37298 +S'Task' +p37299 +asssS'description' +p37300 +(dp37301 +S'editable' +p37302 +I01 +sS'value' +p37303 +g47 +sssS'cached_display_name' +p37304 +(dp37305 +S'mandatory' +p37306 +(dp37307 +S'editable' +p37308 +I00 +sS'value' +p37309 +I00 +ssS'name' +p37310 +(dp37311 +S'editable' +p37312 +I01 +sS'value' +p37313 +S'Cached Display Name' +p37314 +ssS'data_type' +p37315 +(dp37316 +S'editable' +p37317 +I00 +sS'value' +p37318 +S'text' +p37319 +ssS'entity_type' +p37320 +(dp37321 +S'editable' +p37322 +I00 +sS'value' +p37323 +S'Sequence' +p37324 +ssS'editable' +p37325 +(dp37326 +S'editable' +p37327 +I00 +sS'value' +p37328 +I01 +ssS'unique' +p37329 +(dp37330 +S'editable' +p37331 +I00 +sS'value' +p37332 +I00 +ssS'properties' +p37333 +(dp37334 +S'default_value' +p37335 +(dp37336 +S'editable' +p37337 +I00 +sS'value' +p37338 +NssS'summary_default' +p37339 +(dp37340 +S'editable' +p37341 +I00 +sS'value' +p37342 +S'none' +p37343 +sssS'description' +p37344 +(dp37345 +S'editable' +p37346 +I01 +sS'value' +p37347 +g47 +sssS'id' +p37348 +(dp37349 +S'mandatory' +p37350 +(dp37351 +S'editable' +p37352 +I00 +sS'value' +p37353 +I00 +ssS'name' +p37354 +(dp37355 +S'editable' +p37356 +I01 +sS'value' +p37357 +S'Id' +p37358 +ssS'data_type' +p37359 +(dp37360 +S'editable' +p37361 +I00 +sS'value' +p37362 +S'number' +p37363 +ssS'entity_type' +p37364 +(dp37365 +S'editable' +p37366 +I00 +sS'value' +p37367 +S'Sequence' +p37368 +ssS'editable' +p37369 +(dp37370 +S'editable' +p37371 +I00 +sS'value' +p37372 +I00 +ssS'unique' +p37373 +(dp37374 +S'editable' +p37375 +I00 +sS'value' +p37376 +I00 +ssS'properties' +p37377 +(dp37378 +S'default_value' +p37379 +(dp37380 +S'editable' +p37381 +I00 +sS'value' +p37382 +NssS'summary_default' +p37383 +(dp37384 +S'editable' +p37385 +I01 +sS'value' +p37386 +S'none' +p37387 +sssS'description' +p37388 +(dp37389 +S'editable' +p37390 +I01 +sS'value' +p37391 +g47 +sssS'sg_due_1' +p37392 +(dp37393 +S'mandatory' +p37394 +(dp37395 +S'editable' +p37396 +I00 +sS'value' +p37397 +I00 +ssS'name' +p37398 +(dp37399 +S'editable' +p37400 +I01 +sS'value' +p37401 +S'Due' +p37402 +ssS'data_type' +p37403 +(dp37404 +S'editable' +p37405 +I00 +sS'value' +p37406 +S'date' +p37407 +ssS'entity_type' +p37408 +(dp37409 +S'editable' +p37410 +I00 +sS'value' +p37411 +S'Sequence' +p37412 +ssS'editable' +p37413 +(dp37414 +S'editable' +p37415 +I00 +sS'value' +p37416 +I01 +ssS'unique' +p37417 +(dp37418 +S'editable' +p37419 +I00 +sS'value' +p37420 +I00 +ssS'properties' +p37421 +(dp37422 +S'default_value' +p37423 +(dp37424 +S'editable' +p37425 +I00 +sS'value' +p37426 +NssS'summary_default' +p37427 +(dp37428 +S'editable' +p37429 +I01 +sS'value' +p37430 +S'none' +p37431 +sssS'description' +p37432 +(dp37433 +S'editable' +p37434 +I01 +sS'value' +p37435 +g47 +sssS'open_notes' +p37436 +(dp37437 +S'mandatory' +p37438 +(dp37439 +S'editable' +p37440 +I00 +sS'value' +p37441 +I00 +ssS'name' +p37442 +(dp37443 +S'editable' +p37444 +I01 +sS'value' +p37445 +S'Open Notes' +p37446 +ssS'data_type' +p37447 +(dp37448 +S'editable' +p37449 +I00 +sS'value' +p37450 +S'multi_entity' +p37451 +ssS'entity_type' +p37452 +(dp37453 +S'editable' +p37454 +I00 +sS'value' +p37455 +S'Sequence' +p37456 +ssS'editable' +p37457 +(dp37458 +S'editable' +p37459 +I00 +sS'value' +p37460 +I00 +ssS'unique' +p37461 +(dp37462 +S'editable' +p37463 +I00 +sS'value' +p37464 +I00 +ssS'properties' +p37465 +(dp37466 +S'default_value' +p37467 +(dp37468 +S'editable' +p37469 +I00 +sS'value' +p37470 +NssS'summary_default' +p37471 +(dp37472 +S'editable' +p37473 +I01 +sS'value' +p37474 +S'none' +p37475 +ssS'valid_types' +p37476 +(dp37477 +S'editable' +p37478 +I01 +sS'value' +p37479 +(lp37480 +S'Note' +p37481 +asssS'description' +p37482 +(dp37483 +S'editable' +p37484 +I01 +sS'value' +p37485 +g47 +sssS'description' +p37486 +(dp37487 +S'mandatory' +p37488 +(dp37489 +S'editable' +p37490 +I00 +sS'value' +p37491 +I00 +ssS'name' +p37492 +(dp37493 +S'editable' +p37494 +I01 +sS'value' +p37495 +S'Description' +p37496 +ssS'data_type' +p37497 +(dp37498 +S'editable' +p37499 +I00 +sS'value' +p37500 +S'text' +p37501 +ssS'entity_type' +p37502 +(dp37503 +S'editable' +p37504 +I00 +sS'value' +p37505 +S'Sequence' +p37506 +ssS'editable' +p37507 +(dp37508 +S'editable' +p37509 +I00 +sS'value' +p37510 +I01 +ssS'unique' +p37511 +(dp37512 +S'editable' +p37513 +I00 +sS'value' +p37514 +I00 +ssS'properties' +p37515 +(dp37516 +S'default_value' +p37517 +(dp37518 +S'editable' +p37519 +I00 +sS'value' +p37520 +NssS'summary_default' +p37521 +(dp37522 +S'editable' +p37523 +I01 +sS'value' +p37524 +S'none' +p37525 +sssS'description' +p37526 +(dp37527 +S'editable' +p37528 +I01 +sS'value' +p37529 +g47 +sssS'task_template' +p37530 +(dp37531 +S'mandatory' +p37532 +(dp37533 +S'editable' +p37534 +I00 +sS'value' +p37535 +I00 +ssS'name' +p37536 +(dp37537 +S'editable' +p37538 +I01 +sS'value' +p37539 +S'Task Template' +p37540 +ssS'data_type' +p37541 +(dp37542 +S'editable' +p37543 +I00 +sS'value' +p37544 +S'entity' +p37545 +ssS'entity_type' +p37546 +(dp37547 +S'editable' +p37548 +I00 +sS'value' +p37549 +S'Sequence' +p37550 +ssS'editable' +p37551 +(dp37552 +S'editable' +p37553 +I00 +sS'value' +p37554 +I01 +ssS'unique' +p37555 +(dp37556 +S'editable' +p37557 +I00 +sS'value' +p37558 +I00 +ssS'properties' +p37559 +(dp37560 +S'default_value' +p37561 +(dp37562 +S'editable' +p37563 +I00 +sS'value' +p37564 +NssS'summary_default' +p37565 +(dp37566 +S'editable' +p37567 +I01 +sS'value' +p37568 +S'none' +p37569 +ssS'valid_types' +p37570 +(dp37571 +S'editable' +p37572 +I01 +sS'value' +p37573 +(lp37574 +S'TaskTemplate' +p37575 +asssS'description' +p37576 +(dp37577 +S'editable' +p37578 +I01 +sS'value' +p37579 +g47 +sssS'created_by' +p37580 +(dp37581 +S'mandatory' +p37582 +(dp37583 +S'editable' +p37584 +I00 +sS'value' +p37585 +I00 +ssS'name' +p37586 +(dp37587 +S'editable' +p37588 +I01 +sS'value' +p37589 +S'Created by' +p37590 +ssS'data_type' +p37591 +(dp37592 +S'editable' +p37593 +I00 +sS'value' +p37594 +S'entity' +p37595 +ssS'entity_type' +p37596 +(dp37597 +S'editable' +p37598 +I00 +sS'value' +p37599 +S'Sequence' +p37600 +ssS'editable' +p37601 +(dp37602 +S'editable' +p37603 +I00 +sS'value' +p37604 +I00 +ssS'unique' +p37605 +(dp37606 +S'editable' +p37607 +I00 +sS'value' +p37608 +I00 +ssS'properties' +p37609 +(dp37610 +S'default_value' +p37611 +(dp37612 +S'editable' +p37613 +I00 +sS'value' +p37614 +NssS'summary_default' +p37615 +(dp37616 +S'editable' +p37617 +I01 +sS'value' +p37618 +S'none' +p37619 +ssS'valid_types' +p37620 +(dp37621 +S'editable' +p37622 +I01 +sS'value' +p37623 +(lp37624 +S'HumanUser' +p37625 +aS'ApiUser' +p37626 +asssS'description' +p37627 +(dp37628 +S'editable' +p37629 +I01 +sS'value' +p37630 +g47 +sssS'sg_status_list' +p37631 +(dp37632 +S'mandatory' +p37633 +(dp37634 +S'editable' +p37635 +I00 +sS'value' +p37636 +I00 +ssS'name' +p37637 +(dp37638 +S'editable' +p37639 +I01 +sS'value' +p37640 +S'Status' +p37641 +ssS'data_type' +p37642 +(dp37643 +S'editable' +p37644 +I00 +sS'value' +p37645 +S'status_list' +p37646 +ssS'entity_type' +p37647 +(dp37648 +S'editable' +p37649 +I00 +sS'value' +p37650 +S'Sequence' +p37651 +ssS'editable' +p37652 +(dp37653 +S'editable' +p37654 +I00 +sS'value' +p37655 +I01 +ssS'unique' +p37656 +(dp37657 +S'editable' +p37658 +I00 +sS'value' +p37659 +I00 +ssS'properties' +p37660 +(dp37661 +S'default_value' +p37662 +(dp37663 +S'editable' +p37664 +I01 +sS'value' +p37665 +S'ip' +p37666 +ssS'valid_values' +p37667 +(dp37668 +S'editable' +p37669 +I01 +sS'value' +p37670 +(lp37671 +S'fin' +p37672 +aS'ip' +p37673 +aS'omt' +p37674 +aS'hld' +p37675 +assS'summary_default' +p37676 +(dp37677 +S'editable' +p37678 +I01 +sS'value' +p37679 +S'status_list' +p37680 +sssS'description' +p37681 +(dp37682 +S'editable' +p37683 +I01 +sS'value' +p37684 +g47 +sssS'updated_by' +p37685 +(dp37686 +S'mandatory' +p37687 +(dp37688 +S'editable' +p37689 +I00 +sS'value' +p37690 +I00 +ssS'name' +p37691 +(dp37692 +S'editable' +p37693 +I01 +sS'value' +p37694 +S'Updated by' +p37695 +ssS'data_type' +p37696 +(dp37697 +S'editable' +p37698 +I00 +sS'value' +p37699 +S'entity' +p37700 +ssS'entity_type' +p37701 +(dp37702 +S'editable' +p37703 +I00 +sS'value' +p37704 +S'Sequence' +p37705 +ssS'editable' +p37706 +(dp37707 +S'editable' +p37708 +I00 +sS'value' +p37709 +I00 +ssS'unique' +p37710 +(dp37711 +S'editable' +p37712 +I00 +sS'value' +p37713 +I00 +ssS'properties' +p37714 +(dp37715 +S'default_value' +p37716 +(dp37717 +S'editable' +p37718 +I00 +sS'value' +p37719 +NssS'summary_default' +p37720 +(dp37721 +S'editable' +p37722 +I01 +sS'value' +p37723 +S'none' +p37724 +ssS'valid_types' +p37725 +(dp37726 +S'editable' +p37727 +I01 +sS'value' +p37728 +(lp37729 +S'HumanUser' +p37730 +aS'ApiUser' +p37731 +asssS'description' +p37732 +(dp37733 +S'editable' +p37734 +I01 +sS'value' +p37735 +g47 +sssS'addressings_cc' +p37736 +(dp37737 +S'mandatory' +p37738 +(dp37739 +S'editable' +p37740 +I00 +sS'value' +p37741 +I00 +ssS'name' +p37742 +(dp37743 +S'editable' +p37744 +I01 +sS'value' +p37745 +S'Cc' +p37746 +ssS'data_type' +p37747 +(dp37748 +S'editable' +p37749 +I00 +sS'value' +p37750 +S'multi_entity' +p37751 +ssS'entity_type' +p37752 +(dp37753 +S'editable' +p37754 +I00 +sS'value' +p37755 +S'Sequence' +p37756 +ssS'editable' +p37757 +(dp37758 +S'editable' +p37759 +I00 +sS'value' +p37760 +I01 +ssS'unique' +p37761 +(dp37762 +S'editable' +p37763 +I00 +sS'value' +p37764 +I00 +ssS'properties' +p37765 +(dp37766 +S'default_value' +p37767 +(dp37768 +S'editable' +p37769 +I00 +sS'value' +p37770 +NssS'summary_default' +p37771 +(dp37772 +S'editable' +p37773 +I01 +sS'value' +p37774 +S'none' +p37775 +ssS'valid_types' +p37776 +(dp37777 +S'editable' +p37778 +I01 +sS'value' +p37779 +(lp37780 +S'Group' +p37781 +aS'HumanUser' +p37782 +asssS'description' +p37783 +(dp37784 +S'editable' +p37785 +I01 +sS'value' +p37786 +g47 +sssS'sg_sequencenumber' +p37787 +(dp37788 +S'mandatory' +p37789 +(dp37790 +S'editable' +p37791 +I00 +sS'value' +p37792 +I00 +ssS'name' +p37793 +(dp37794 +S'editable' +p37795 +I01 +sS'value' +p37796 +S'sequencenumber' +p37797 +ssS'data_type' +p37798 +(dp37799 +S'editable' +p37800 +I00 +sS'value' +p37801 +S'text' +p37802 +ssS'entity_type' +p37803 +(dp37804 +S'editable' +p37805 +I00 +sS'value' +p37806 +S'Sequence' +p37807 +ssS'editable' +p37808 +(dp37809 +S'editable' +p37810 +I00 +sS'value' +p37811 +I01 +ssS'unique' +p37812 +(dp37813 +S'editable' +p37814 +I00 +sS'value' +p37815 +I00 +ssS'properties' +p37816 +(dp37817 +S'default_value' +p37818 +(dp37819 +S'editable' +p37820 +I00 +sS'value' +p37821 +NssS'summary_default' +p37822 +(dp37823 +S'editable' +p37824 +I01 +sS'value' +p37825 +S'none' +p37826 +sssS'description' +p37827 +(dp37828 +S'editable' +p37829 +I01 +sS'value' +p37830 +g47 +sssS'step_0' +p37831 +(dp37832 +S'mandatory' +p37833 +(dp37834 +S'editable' +p37835 +I00 +sS'value' +p37836 +I00 +ssS'name' +p37837 +(dp37838 +S'editable' +p37839 +I01 +sS'value' +p37840 +S'ALL TASKS' +p37841 +ssS'data_type' +p37842 +(dp37843 +S'editable' +p37844 +I00 +sS'value' +p37845 +S'pivot_column' +p37846 +ssS'entity_type' +p37847 +(dp37848 +S'editable' +p37849 +I00 +sS'value' +p37850 +S'Sequence' +p37851 +ssS'editable' +p37852 +(dp37853 +S'editable' +p37854 +I00 +sS'value' +p37855 +I00 +ssS'unique' +p37856 +(dp37857 +S'editable' +p37858 +I00 +sS'value' +p37859 +I00 +ssS'properties' +p37860 +(dp37861 +S'default_value' +p37862 +(dp37863 +S'editable' +p37864 +I00 +sS'value' +p37865 +NssS'summary_default' +p37866 +(dp37867 +S'editable' +p37868 +I00 +sS'value' +p37869 +S'none' +p37870 +sssS'description' +p37871 +(dp37872 +S'editable' +p37873 +I01 +sS'value' +p37874 +g47 +sssS'assets' +p37875 +(dp37876 +S'mandatory' +p37877 +(dp37878 +S'editable' +p37879 +I00 +sS'value' +p37880 +I00 +ssS'name' +p37881 +(dp37882 +S'editable' +p37883 +I01 +sS'value' +p37884 +S'Assets' +p37885 +ssS'data_type' +p37886 +(dp37887 +S'editable' +p37888 +I00 +sS'value' +p37889 +S'multi_entity' +p37890 +ssS'entity_type' +p37891 +(dp37892 +S'editable' +p37893 +I00 +sS'value' +p37894 +S'Sequence' +p37895 +ssS'editable' +p37896 +(dp37897 +S'editable' +p37898 +I00 +sS'value' +p37899 +I01 +ssS'unique' +p37900 +(dp37901 +S'editable' +p37902 +I00 +sS'value' +p37903 +I00 +ssS'properties' +p37904 +(dp37905 +S'default_value' +p37906 +(dp37907 +S'editable' +p37908 +I00 +sS'value' +p37909 +NssS'summary_default' +p37910 +(dp37911 +S'editable' +p37912 +I01 +sS'value' +p37913 +S'none' +p37914 +ssS'valid_types' +p37915 +(dp37916 +S'editable' +p37917 +I01 +sS'value' +p37918 +(lp37919 +S'Asset' +p37920 +asssS'description' +p37921 +(dp37922 +S'editable' +p37923 +I01 +sS'value' +p37924 +g47 +sssS'sg_scene' +p37925 +(dp37926 +S'mandatory' +p37927 +(dp37928 +S'editable' +p37929 +I00 +sS'value' +p37930 +I00 +ssS'name' +p37931 +(dp37932 +S'editable' +p37933 +I01 +sS'value' +p37934 +S'Scene' +p37935 +ssS'data_type' +p37936 +(dp37937 +S'editable' +p37938 +I00 +sS'value' +p37939 +S'entity' +p37940 +ssS'entity_type' +p37941 +(dp37942 +S'editable' +p37943 +I00 +sS'value' +p37944 +S'Sequence' +p37945 +ssS'editable' +p37946 +(dp37947 +S'editable' +p37948 +I00 +sS'value' +p37949 +I01 +ssS'unique' +p37950 +(dp37951 +S'editable' +p37952 +I00 +sS'value' +p37953 +I00 +ssS'properties' +p37954 +(dp37955 +S'default_value' +p37956 +(dp37957 +S'editable' +p37958 +I00 +sS'value' +p37959 +NssS'summary_default' +p37960 +(dp37961 +S'editable' +p37962 +I01 +sS'value' +p37963 +S'none' +p37964 +ssS'valid_types' +p37965 +(dp37966 +S'editable' +p37967 +I01 +sS'value' +p37968 +(lp37969 +S'Scene' +p37970 +asssS'description' +p37971 +(dp37972 +S'editable' +p37973 +I01 +sS'value' +p37974 +g47 +sssS'notes' +p37975 +(dp37976 +S'mandatory' +p37977 +(dp37978 +S'editable' +p37979 +I00 +sS'value' +p37980 +I00 +ssS'name' +p37981 +(dp37982 +S'editable' +p37983 +I01 +sS'value' +p37984 +S'Notes' +p37985 +ssS'data_type' +p37986 +(dp37987 +S'editable' +p37988 +I00 +sS'value' +p37989 +S'multi_entity' +p37990 +ssS'entity_type' +p37991 +(dp37992 +S'editable' +p37993 +I00 +sS'value' +p37994 +S'Sequence' +p37995 +ssS'editable' +p37996 +(dp37997 +S'editable' +p37998 +I00 +sS'value' +p37999 +I01 +ssS'unique' +p38000 +(dp38001 +S'editable' +p38002 +I00 +sS'value' +p38003 +I00 +ssS'properties' +p38004 +(dp38005 +S'default_value' +p38006 +(dp38007 +S'editable' +p38008 +I00 +sS'value' +p38009 +NssS'summary_default' +p38010 +(dp38011 +S'editable' +p38012 +I01 +sS'value' +p38013 +S'none' +p38014 +ssS'valid_types' +p38015 +(dp38016 +S'editable' +p38017 +I01 +sS'value' +p38018 +(lp38019 +S'Note' +p38020 +asssS'description' +p38021 +(dp38022 +S'editable' +p38023 +I01 +sS'value' +p38024 +g47 +sssS'project' +p38025 +(dp38026 +S'mandatory' +p38027 +(dp38028 +S'editable' +p38029 +I00 +sS'value' +p38030 +I00 +ssS'name' +p38031 +(dp38032 +S'editable' +p38033 +I01 +sS'value' +p38034 +S'Project' +p38035 +ssS'data_type' +p38036 +(dp38037 +S'editable' +p38038 +I00 +sS'value' +p38039 +S'entity' +p38040 +ssS'entity_type' +p38041 +(dp38042 +S'editable' +p38043 +I00 +sS'value' +p38044 +S'Sequence' +p38045 +ssS'editable' +p38046 +(dp38047 +S'editable' +p38048 +I00 +sS'value' +p38049 +I01 +ssS'unique' +p38050 +(dp38051 +S'editable' +p38052 +I00 +sS'value' +p38053 +I00 +ssS'properties' +p38054 +(dp38055 +S'default_value' +p38056 +(dp38057 +S'editable' +p38058 +I00 +sS'value' +p38059 +NssS'summary_default' +p38060 +(dp38061 +S'editable' +p38062 +I01 +sS'value' +p38063 +S'none' +p38064 +ssS'valid_types' +p38065 +(dp38066 +S'editable' +p38067 +I01 +sS'value' +p38068 +(lp38069 +S'Project' +p38070 +asssS'description' +p38071 +(dp38072 +S'editable' +p38073 +I01 +sS'value' +p38074 +g47 +sssS'filmstrip_image' +p38075 +(dp38076 +S'mandatory' +p38077 +(dp38078 +S'editable' +p38079 +I00 +sS'value' +p38080 +I00 +ssS'name' +p38081 +(dp38082 +S'editable' +p38083 +I01 +sS'value' +p38084 +S'Filmstrip Thumbnail' +p38085 +ssS'data_type' +p38086 +(dp38087 +S'editable' +p38088 +I00 +sS'value' +p38089 +S'image' +p38090 +ssS'entity_type' +p38091 +(dp38092 +S'editable' +p38093 +I00 +sS'value' +p38094 +S'Sequence' +p38095 +ssS'editable' +p38096 +(dp38097 +S'editable' +p38098 +I00 +sS'value' +p38099 +I01 +ssS'unique' +p38100 +(dp38101 +S'editable' +p38102 +I00 +sS'value' +p38103 +I00 +ssS'properties' +p38104 +(dp38105 +S'default_value' +p38106 +(dp38107 +S'editable' +p38108 +I00 +sS'value' +p38109 +NssS'summary_default' +p38110 +(dp38111 +S'editable' +p38112 +I01 +sS'value' +p38113 +S'none' +p38114 +sssS'description' +p38115 +(dp38116 +S'editable' +p38117 +I01 +sS'value' +p38118 +g47 +sssS'sg_assigned_to' +p38119 +(dp38120 +S'mandatory' +p38121 +(dp38122 +S'editable' +p38123 +I00 +sS'value' +p38124 +I00 +ssS'name' +p38125 +(dp38126 +S'editable' +p38127 +I01 +sS'value' +p38128 +S'Assigned To' +p38129 +ssS'data_type' +p38130 +(dp38131 +S'editable' +p38132 +I00 +sS'value' +p38133 +S'entity' +p38134 +ssS'entity_type' +p38135 +(dp38136 +S'editable' +p38137 +I00 +sS'value' +p38138 +S'Sequence' +p38139 +ssS'editable' +p38140 +(dp38141 +S'editable' +p38142 +I00 +sS'value' +p38143 +I01 +ssS'unique' +p38144 +(dp38145 +S'editable' +p38146 +I00 +sS'value' +p38147 +I00 +ssS'properties' +p38148 +(dp38149 +S'default_value' +p38150 +(dp38151 +S'editable' +p38152 +I00 +sS'value' +p38153 +NssS'summary_default' +p38154 +(dp38155 +S'editable' +p38156 +I01 +sS'value' +p38157 +S'none' +p38158 +ssS'valid_types' +p38159 +(dp38160 +S'editable' +p38161 +I01 +sS'value' +p38162 +(lp38163 +S'HumanUser' +p38164 +asssS'description' +p38165 +(dp38166 +S'editable' +p38167 +I01 +sS'value' +p38168 +g47 +sssS'shots' +p38169 +(dp38170 +S'mandatory' +p38171 +(dp38172 +S'editable' +p38173 +I00 +sS'value' +p38174 +I00 +ssS'name' +p38175 +(dp38176 +S'editable' +p38177 +I01 +sS'value' +p38178 +S'Shots' +p38179 +ssS'data_type' +p38180 +(dp38181 +S'editable' +p38182 +I00 +sS'value' +p38183 +S'multi_entity' +p38184 +ssS'entity_type' +p38185 +(dp38186 +S'editable' +p38187 +I00 +sS'value' +p38188 +S'Sequence' +p38189 +ssS'editable' +p38190 +(dp38191 +S'editable' +p38192 +I00 +sS'value' +p38193 +I01 +ssS'unique' +p38194 +(dp38195 +S'editable' +p38196 +I00 +sS'value' +p38197 +I00 +ssS'properties' +p38198 +(dp38199 +S'default_value' +p38200 +(dp38201 +S'editable' +p38202 +I00 +sS'value' +p38203 +NssS'summary_default' +p38204 +(dp38205 +S'editable' +p38206 +I01 +sS'value' +p38207 +S'none' +p38208 +ssS'valid_types' +p38209 +(dp38210 +S'editable' +p38211 +I01 +sS'value' +p38212 +(lp38213 +S'Shot' +p38214 +asssS'description' +p38215 +(dp38216 +S'editable' +p38217 +I01 +sS'value' +p38218 +g47 +sssS'tag_list' +p38219 +(dp38220 +S'mandatory' +p38221 +(dp38222 +S'editable' +p38223 +I00 +sS'value' +p38224 +I00 +ssS'name' +p38225 +(dp38226 +S'editable' +p38227 +I01 +sS'value' +p38228 +S'Tags' +p38229 +ssS'data_type' +p38230 +(dp38231 +S'editable' +p38232 +I00 +sS'value' +p38233 +S'tag_list' +p38234 +ssS'entity_type' +p38235 +(dp38236 +S'editable' +p38237 +I00 +sS'value' +p38238 +S'Sequence' +p38239 +ssS'editable' +p38240 +(dp38241 +S'editable' +p38242 +I00 +sS'value' +p38243 +I01 +ssS'unique' +p38244 +(dp38245 +S'editable' +p38246 +I00 +sS'value' +p38247 +I00 +ssS'properties' +p38248 +(dp38249 +S'default_value' +p38250 +(dp38251 +S'editable' +p38252 +I00 +sS'value' +p38253 +NssS'summary_default' +p38254 +(dp38255 +S'editable' +p38256 +I01 +sS'value' +p38257 +S'none' +p38258 +ssS'valid_types' +p38259 +(dp38260 +S'editable' +p38261 +I01 +sS'value' +p38262 +(lp38263 +S'Tag' +p38264 +asssS'description' +p38265 +(dp38266 +S'editable' +p38267 +I01 +sS'value' +p38268 +g47 +sssS'created_at' +p38269 +(dp38270 +S'mandatory' +p38271 +(dp38272 +S'editable' +p38273 +I00 +sS'value' +p38274 +I00 +ssS'name' +p38275 +(dp38276 +S'editable' +p38277 +I01 +sS'value' +p38278 +S'Date Created' +p38279 +ssS'data_type' +p38280 +(dp38281 +S'editable' +p38282 +I00 +sS'value' +p38283 +S'date_time' +p38284 +ssS'entity_type' +p38285 +(dp38286 +S'editable' +p38287 +I00 +sS'value' +p38288 +S'Sequence' +p38289 +ssS'editable' +p38290 +(dp38291 +S'editable' +p38292 +I00 +sS'value' +p38293 +I00 +ssS'unique' +p38294 +(dp38295 +S'editable' +p38296 +I00 +sS'value' +p38297 +I00 +ssS'properties' +p38298 +(dp38299 +S'default_value' +p38300 +(dp38301 +S'editable' +p38302 +I00 +sS'value' +p38303 +NssS'summary_default' +p38304 +(dp38305 +S'editable' +p38306 +I01 +sS'value' +p38307 +S'none' +p38308 +sssS'description' +p38309 +(dp38310 +S'editable' +p38311 +I01 +sS'value' +p38312 +g47 +ssssS'BannerUserConnection' +p38313 +(dp38314 +S'cached_display_name' +p38315 +(dp38316 +S'mandatory' +p38317 +(dp38318 +S'editable' +p38319 +I00 +sS'value' +p38320 +I00 +ssS'name' +p38321 +(dp38322 +S'editable' +p38323 +I01 +sS'value' +p38324 +S'Cached Display Name' +p38325 +ssS'data_type' +p38326 +(dp38327 +S'editable' +p38328 +I00 +sS'value' +p38329 +S'text' +p38330 +ssS'entity_type' +p38331 +(dp38332 +S'editable' +p38333 +I00 +sS'value' +p38334 +S'BannerUserConnection' +p38335 +ssS'editable' +p38336 +(dp38337 +S'editable' +p38338 +I00 +sS'value' +p38339 +I01 +ssS'unique' +p38340 +(dp38341 +S'editable' +p38342 +I00 +sS'value' +p38343 +I00 +ssS'properties' +p38344 +(dp38345 +S'default_value' +p38346 +(dp38347 +S'editable' +p38348 +I00 +sS'value' +p38349 +NssS'summary_default' +p38350 +(dp38351 +S'editable' +p38352 +I00 +sS'value' +p38353 +S'none' +p38354 +sssS'description' +p38355 +(dp38356 +S'editable' +p38357 +I01 +sS'value' +p38358 +g47 +sssS'banner' +p38359 +(dp38360 +S'mandatory' +p38361 +(dp38362 +S'editable' +p38363 +I00 +sS'value' +p38364 +I00 +ssS'name' +p38365 +(dp38366 +S'editable' +p38367 +I01 +sS'value' +p38368 +S'Banner' +p38369 +ssS'data_type' +p38370 +(dp38371 +S'editable' +p38372 +I00 +sS'value' +p38373 +S'entity' +p38374 +ssS'entity_type' +p38375 +(dp38376 +S'editable' +p38377 +I00 +sS'value' +p38378 +S'BannerUserConnection' +p38379 +ssS'editable' +p38380 +(dp38381 +S'editable' +p38382 +I00 +sS'value' +p38383 +I01 +ssS'unique' +p38384 +(dp38385 +S'editable' +p38386 +I00 +sS'value' +p38387 +I00 +ssS'properties' +p38388 +(dp38389 +S'default_value' +p38390 +(dp38391 +S'editable' +p38392 +I00 +sS'value' +p38393 +NssS'summary_default' +p38394 +(dp38395 +S'editable' +p38396 +I00 +sS'value' +p38397 +S'none' +p38398 +ssS'valid_types' +p38399 +(dp38400 +S'editable' +p38401 +I00 +sS'value' +p38402 +(lp38403 +S'Banner' +p38404 +asssS'description' +p38405 +(dp38406 +S'editable' +p38407 +I01 +sS'value' +p38408 +g47 +sssS'id' +p38409 +(dp38410 +S'mandatory' +p38411 +(dp38412 +S'editable' +p38413 +I00 +sS'value' +p38414 +I00 +ssS'name' +p38415 +(dp38416 +S'editable' +p38417 +I01 +sS'value' +p38418 +S'Id' +p38419 +ssS'data_type' +p38420 +(dp38421 +S'editable' +p38422 +I00 +sS'value' +p38423 +S'number' +p38424 +ssS'entity_type' +p38425 +(dp38426 +S'editable' +p38427 +I00 +sS'value' +p38428 +S'BannerUserConnection' +p38429 +ssS'editable' +p38430 +(dp38431 +S'editable' +p38432 +I00 +sS'value' +p38433 +I00 +ssS'unique' +p38434 +(dp38435 +S'editable' +p38436 +I00 +sS'value' +p38437 +I00 +ssS'properties' +p38438 +(dp38439 +S'default_value' +p38440 +(dp38441 +S'editable' +p38442 +I00 +sS'value' +p38443 +NssS'summary_default' +p38444 +(dp38445 +S'editable' +p38446 +I00 +sS'value' +p38447 +S'none' +p38448 +sssS'description' +p38449 +(dp38450 +S'editable' +p38451 +I01 +sS'value' +p38452 +g47 +sssS'user' +p38453 +(dp38454 +S'mandatory' +p38455 +(dp38456 +S'editable' +p38457 +I00 +sS'value' +p38458 +I00 +ssS'name' +p38459 +(dp38460 +S'editable' +p38461 +I01 +sS'value' +p38462 +S'User' +p38463 +ssS'data_type' +p38464 +(dp38465 +S'editable' +p38466 +I00 +sS'value' +p38467 +S'entity' +p38468 +ssS'entity_type' +p38469 +(dp38470 +S'editable' +p38471 +I00 +sS'value' +p38472 +S'BannerUserConnection' +p38473 +ssS'editable' +p38474 +(dp38475 +S'editable' +p38476 +I00 +sS'value' +p38477 +I01 +ssS'unique' +p38478 +(dp38479 +S'editable' +p38480 +I00 +sS'value' +p38481 +I00 +ssS'properties' +p38482 +(dp38483 +S'default_value' +p38484 +(dp38485 +S'editable' +p38486 +I00 +sS'value' +p38487 +NssS'summary_default' +p38488 +(dp38489 +S'editable' +p38490 +I00 +sS'value' +p38491 +S'none' +p38492 +ssS'valid_types' +p38493 +(dp38494 +S'editable' +p38495 +I00 +sS'value' +p38496 +(lp38497 +S'HumanUser' +p38498 +asssS'description' +p38499 +(dp38500 +S'editable' +p38501 +I01 +sS'value' +p38502 +g47 +ssssS'AssetAssetConnection' +p38503 +(dp38504 +S'cached_display_name' +p38505 +(dp38506 +S'mandatory' +p38507 +(dp38508 +S'editable' +p38509 +I00 +sS'value' +p38510 +I00 +ssS'name' +p38511 +(dp38512 +S'editable' +p38513 +I01 +sS'value' +p38514 +S'Cached Display Name' +p38515 +ssS'data_type' +p38516 +(dp38517 +S'editable' +p38518 +I00 +sS'value' +p38519 +S'text' +p38520 +ssS'entity_type' +p38521 +(dp38522 +S'editable' +p38523 +I00 +sS'value' +p38524 +S'AssetAssetConnection' +p38525 +ssS'editable' +p38526 +(dp38527 +S'editable' +p38528 +I00 +sS'value' +p38529 +I01 +ssS'unique' +p38530 +(dp38531 +S'editable' +p38532 +I00 +sS'value' +p38533 +I00 +ssS'properties' +p38534 +(dp38535 +S'default_value' +p38536 +(dp38537 +S'editable' +p38538 +I00 +sS'value' +p38539 +NssS'summary_default' +p38540 +(dp38541 +S'editable' +p38542 +I00 +sS'value' +p38543 +S'none' +p38544 +sssS'description' +p38545 +(dp38546 +S'editable' +p38547 +I01 +sS'value' +p38548 +g47 +sssS'asset' +p38549 +(dp38550 +S'mandatory' +p38551 +(dp38552 +S'editable' +p38553 +I00 +sS'value' +p38554 +I00 +ssS'name' +p38555 +(dp38556 +S'editable' +p38557 +I01 +sS'value' +p38558 +S'Asset' +p38559 +ssS'data_type' +p38560 +(dp38561 +S'editable' +p38562 +I00 +sS'value' +p38563 +S'entity' +p38564 +ssS'entity_type' +p38565 +(dp38566 +S'editable' +p38567 +I00 +sS'value' +p38568 +S'AssetAssetConnection' +p38569 +ssS'editable' +p38570 +(dp38571 +S'editable' +p38572 +I00 +sS'value' +p38573 +I00 +ssS'unique' +p38574 +(dp38575 +S'editable' +p38576 +I00 +sS'value' +p38577 +I00 +ssS'properties' +p38578 +(dp38579 +S'default_value' +p38580 +(dp38581 +S'editable' +p38582 +I00 +sS'value' +p38583 +NssS'summary_default' +p38584 +(dp38585 +S'editable' +p38586 +I00 +sS'value' +p38587 +S'none' +p38588 +ssS'valid_types' +p38589 +(dp38590 +S'editable' +p38591 +I00 +sS'value' +p38592 +(lp38593 +S'Asset' +p38594 +asssS'description' +p38595 +(dp38596 +S'editable' +p38597 +I01 +sS'value' +p38598 +g47 +sssS'parent' +p38599 +(dp38600 +S'mandatory' +p38601 +(dp38602 +S'editable' +p38603 +I00 +sS'value' +p38604 +I00 +ssS'name' +p38605 +(dp38606 +S'editable' +p38607 +I01 +sS'value' +p38608 +S'Asset' +p38609 +ssS'data_type' +p38610 +(dp38611 +S'editable' +p38612 +I00 +sS'value' +p38613 +S'entity' +p38614 +ssS'entity_type' +p38615 +(dp38616 +S'editable' +p38617 +I00 +sS'value' +p38618 +S'AssetAssetConnection' +p38619 +ssS'editable' +p38620 +(dp38621 +S'editable' +p38622 +I00 +sS'value' +p38623 +I00 +ssS'unique' +p38624 +(dp38625 +S'editable' +p38626 +I00 +sS'value' +p38627 +I00 +ssS'properties' +p38628 +(dp38629 +S'default_value' +p38630 +(dp38631 +S'editable' +p38632 +I00 +sS'value' +p38633 +NssS'summary_default' +p38634 +(dp38635 +S'editable' +p38636 +I00 +sS'value' +p38637 +S'none' +p38638 +ssS'valid_types' +p38639 +(dp38640 +S'editable' +p38641 +I00 +sS'value' +p38642 +(lp38643 +S'Asset' +p38644 +asssS'description' +p38645 +(dp38646 +S'editable' +p38647 +I01 +sS'value' +p38648 +g47 +sssS'id' +p38649 +(dp38650 +S'mandatory' +p38651 +(dp38652 +S'editable' +p38653 +I00 +sS'value' +p38654 +I01 +ssS'name' +p38655 +(dp38656 +S'editable' +p38657 +I01 +sS'value' +p38658 +S'Id' +p38659 +ssS'data_type' +p38660 +(dp38661 +S'editable' +p38662 +I00 +sS'value' +p38663 +S'number' +p38664 +ssS'entity_type' +p38665 +(dp38666 +S'editable' +p38667 +I00 +sS'value' +p38668 +S'AssetAssetConnection' +p38669 +ssS'editable' +p38670 +(dp38671 +S'editable' +p38672 +I00 +sS'value' +p38673 +I00 +ssS'unique' +p38674 +(dp38675 +S'editable' +p38676 +I00 +sS'value' +p38677 +I00 +ssS'properties' +p38678 +(dp38679 +S'default_value' +p38680 +(dp38681 +S'editable' +p38682 +I00 +sS'value' +p38683 +NssS'summary_default' +p38684 +(dp38685 +S'editable' +p38686 +I00 +sS'value' +p38687 +S'none' +p38688 +sssS'description' +p38689 +(dp38690 +S'editable' +p38691 +I01 +sS'value' +p38692 +g47 +ssssS'Scene' +p38693 +(dp38694 +S'open_notes_count' +p38695 +(dp38696 +S'mandatory' +p38697 +(dp38698 +S'editable' +p38699 +I00 +sS'value' +p38700 +I00 +ssS'name' +p38701 +(dp38702 +S'editable' +p38703 +I01 +sS'value' +p38704 +S'Open Notes Count' +p38705 +ssS'data_type' +p38706 +(dp38707 +S'editable' +p38708 +I00 +sS'value' +p38709 +S'text' +p38710 +ssS'entity_type' +p38711 +(dp38712 +S'editable' +p38713 +I00 +sS'value' +p38714 +S'Scene' +p38715 +ssS'editable' +p38716 +(dp38717 +S'editable' +p38718 +I00 +sS'value' +p38719 +I00 +ssS'unique' +p38720 +(dp38721 +S'editable' +p38722 +I00 +sS'value' +p38723 +I00 +ssS'properties' +p38724 +(dp38725 +S'default_value' +p38726 +(dp38727 +S'editable' +p38728 +I00 +sS'value' +p38729 +NssS'summary_default' +p38730 +(dp38731 +S'editable' +p38732 +I01 +sS'value' +p38733 +S'none' +p38734 +sssS'description' +p38735 +(dp38736 +S'editable' +p38737 +I01 +sS'value' +p38738 +g47 +sssS'code' +p38739 +(dp38740 +S'mandatory' +p38741 +(dp38742 +S'editable' +p38743 +I00 +sS'value' +p38744 +I01 +ssS'name' +p38745 +(dp38746 +S'editable' +p38747 +I01 +sS'value' +p38748 +S'Scene Code' +p38749 +ssS'data_type' +p38750 +(dp38751 +S'editable' +p38752 +I00 +sS'value' +p38753 +S'text' +p38754 +ssS'entity_type' +p38755 +(dp38756 +S'editable' +p38757 +I00 +sS'value' +p38758 +S'Scene' +p38759 +ssS'editable' +p38760 +(dp38761 +S'editable' +p38762 +I00 +sS'value' +p38763 +I01 +ssS'unique' +p38764 +(dp38765 +S'editable' +p38766 +I00 +sS'value' +p38767 +I00 +ssS'properties' +p38768 +(dp38769 +S'default_value' +p38770 +(dp38771 +S'editable' +p38772 +I00 +sS'value' +p38773 +NssS'summary_default' +p38774 +(dp38775 +S'editable' +p38776 +I01 +sS'value' +p38777 +S'none' +p38778 +sssS'description' +p38779 +(dp38780 +S'editable' +p38781 +I01 +sS'value' +p38782 +g47 +sssS'image' +p38783 +(dp38784 +S'mandatory' +p38785 +(dp38786 +S'editable' +p38787 +I00 +sS'value' +p38788 +I00 +ssS'name' +p38789 +(dp38790 +S'editable' +p38791 +I01 +sS'value' +p38792 +S'Thumbnail' +p38793 +ssS'data_type' +p38794 +(dp38795 +S'editable' +p38796 +I00 +sS'value' +p38797 +S'image' +p38798 +ssS'entity_type' +p38799 +(dp38800 +S'editable' +p38801 +I00 +sS'value' +p38802 +S'Scene' +p38803 +ssS'editable' +p38804 +(dp38805 +S'editable' +p38806 +I00 +sS'value' +p38807 +I01 +ssS'unique' +p38808 +(dp38809 +S'editable' +p38810 +I00 +sS'value' +p38811 +I00 +ssS'properties' +p38812 +(dp38813 +S'default_value' +p38814 +(dp38815 +S'editable' +p38816 +I00 +sS'value' +p38817 +NssS'summary_default' +p38818 +(dp38819 +S'editable' +p38820 +I01 +sS'value' +p38821 +S'none' +p38822 +sssS'description' +p38823 +(dp38824 +S'editable' +p38825 +I01 +sS'value' +p38826 +g47 +sssS'updated_at' +p38827 +(dp38828 +S'mandatory' +p38829 +(dp38830 +S'editable' +p38831 +I00 +sS'value' +p38832 +I00 +ssS'name' +p38833 +(dp38834 +S'editable' +p38835 +I01 +sS'value' +p38836 +S'Date Updated' +p38837 +ssS'data_type' +p38838 +(dp38839 +S'editable' +p38840 +I00 +sS'value' +p38841 +S'date_time' +p38842 +ssS'entity_type' +p38843 +(dp38844 +S'editable' +p38845 +I00 +sS'value' +p38846 +S'Scene' +p38847 +ssS'editable' +p38848 +(dp38849 +S'editable' +p38850 +I00 +sS'value' +p38851 +I00 +ssS'unique' +p38852 +(dp38853 +S'editable' +p38854 +I00 +sS'value' +p38855 +I00 +ssS'properties' +p38856 +(dp38857 +S'default_value' +p38858 +(dp38859 +S'editable' +p38860 +I00 +sS'value' +p38861 +NssS'summary_default' +p38862 +(dp38863 +S'editable' +p38864 +I01 +sS'value' +p38865 +S'none' +p38866 +sssS'description' +p38867 +(dp38868 +S'editable' +p38869 +I01 +sS'value' +p38870 +g47 +sssS'tasks' +p38871 +(dp38872 +S'mandatory' +p38873 +(dp38874 +S'editable' +p38875 +I00 +sS'value' +p38876 +I00 +ssS'name' +p38877 +(dp38878 +S'editable' +p38879 +I01 +sS'value' +p38880 +S'Tasks' +p38881 +ssS'data_type' +p38882 +(dp38883 +S'editable' +p38884 +I00 +sS'value' +p38885 +S'multi_entity' +p38886 +ssS'entity_type' +p38887 +(dp38888 +S'editable' +p38889 +I00 +sS'value' +p38890 +S'Scene' +p38891 +ssS'editable' +p38892 +(dp38893 +S'editable' +p38894 +I00 +sS'value' +p38895 +I01 +ssS'unique' +p38896 +(dp38897 +S'editable' +p38898 +I00 +sS'value' +p38899 +I00 +ssS'properties' +p38900 +(dp38901 +S'default_value' +p38902 +(dp38903 +S'editable' +p38904 +I00 +sS'value' +p38905 +NssS'summary_default' +p38906 +(dp38907 +S'editable' +p38908 +I01 +sS'value' +p38909 +S'none' +p38910 +ssS'valid_types' +p38911 +(dp38912 +S'editable' +p38913 +I01 +sS'value' +p38914 +(lp38915 +S'Task' +p38916 +asssS'description' +p38917 +(dp38918 +S'editable' +p38919 +I01 +sS'value' +p38920 +g47 +sssS'cached_display_name' +p38921 +(dp38922 +S'mandatory' +p38923 +(dp38924 +S'editable' +p38925 +I00 +sS'value' +p38926 +I00 +ssS'name' +p38927 +(dp38928 +S'editable' +p38929 +I01 +sS'value' +p38930 +S'Cached Display Name' +p38931 +ssS'data_type' +p38932 +(dp38933 +S'editable' +p38934 +I00 +sS'value' +p38935 +S'text' +p38936 +ssS'entity_type' +p38937 +(dp38938 +S'editable' +p38939 +I00 +sS'value' +p38940 +S'Scene' +p38941 +ssS'editable' +p38942 +(dp38943 +S'editable' +p38944 +I00 +sS'value' +p38945 +I01 +ssS'unique' +p38946 +(dp38947 +S'editable' +p38948 +I00 +sS'value' +p38949 +I00 +ssS'properties' +p38950 +(dp38951 +S'default_value' +p38952 +(dp38953 +S'editable' +p38954 +I00 +sS'value' +p38955 +NssS'summary_default' +p38956 +(dp38957 +S'editable' +p38958 +I00 +sS'value' +p38959 +S'none' +p38960 +sssS'description' +p38961 +(dp38962 +S'editable' +p38963 +I01 +sS'value' +p38964 +g47 +sssS'id' +p38965 +(dp38966 +S'mandatory' +p38967 +(dp38968 +S'editable' +p38969 +I00 +sS'value' +p38970 +I00 +ssS'name' +p38971 +(dp38972 +S'editable' +p38973 +I01 +sS'value' +p38974 +S'Id' +p38975 +ssS'data_type' +p38976 +(dp38977 +S'editable' +p38978 +I00 +sS'value' +p38979 +S'number' +p38980 +ssS'entity_type' +p38981 +(dp38982 +S'editable' +p38983 +I00 +sS'value' +p38984 +S'Scene' +p38985 +ssS'editable' +p38986 +(dp38987 +S'editable' +p38988 +I00 +sS'value' +p38989 +I00 +ssS'unique' +p38990 +(dp38991 +S'editable' +p38992 +I00 +sS'value' +p38993 +I00 +ssS'properties' +p38994 +(dp38995 +S'default_value' +p38996 +(dp38997 +S'editable' +p38998 +I00 +sS'value' +p38999 +NssS'summary_default' +p39000 +(dp39001 +S'editable' +p39002 +I01 +sS'value' +p39003 +S'none' +p39004 +sssS'description' +p39005 +(dp39006 +S'editable' +p39007 +I01 +sS'value' +p39008 +g47 +sssS'updated_by' +p39009 +(dp39010 +S'mandatory' +p39011 +(dp39012 +S'editable' +p39013 +I00 +sS'value' +p39014 +I00 +ssS'name' +p39015 +(dp39016 +S'editable' +p39017 +I01 +sS'value' +p39018 +S'Updated by' +p39019 +ssS'data_type' +p39020 +(dp39021 +S'editable' +p39022 +I00 +sS'value' +p39023 +S'entity' +p39024 +ssS'entity_type' +p39025 +(dp39026 +S'editable' +p39027 +I00 +sS'value' +p39028 +S'Scene' +p39029 +ssS'editable' +p39030 +(dp39031 +S'editable' +p39032 +I00 +sS'value' +p39033 +I00 +ssS'unique' +p39034 +(dp39035 +S'editable' +p39036 +I00 +sS'value' +p39037 +I00 +ssS'properties' +p39038 +(dp39039 +S'default_value' +p39040 +(dp39041 +S'editable' +p39042 +I00 +sS'value' +p39043 +NssS'summary_default' +p39044 +(dp39045 +S'editable' +p39046 +I01 +sS'value' +p39047 +S'none' +p39048 +ssS'valid_types' +p39049 +(dp39050 +S'editable' +p39051 +I01 +sS'value' +p39052 +(lp39053 +S'HumanUser' +p39054 +aS'ApiUser' +p39055 +asssS'description' +p39056 +(dp39057 +S'editable' +p39058 +I01 +sS'value' +p39059 +g47 +sssS'open_notes' +p39060 +(dp39061 +S'mandatory' +p39062 +(dp39063 +S'editable' +p39064 +I00 +sS'value' +p39065 +I00 +ssS'name' +p39066 +(dp39067 +S'editable' +p39068 +I01 +sS'value' +p39069 +S'Open Notes' +p39070 +ssS'data_type' +p39071 +(dp39072 +S'editable' +p39073 +I00 +sS'value' +p39074 +S'multi_entity' +p39075 +ssS'entity_type' +p39076 +(dp39077 +S'editable' +p39078 +I00 +sS'value' +p39079 +S'Scene' +p39080 +ssS'editable' +p39081 +(dp39082 +S'editable' +p39083 +I00 +sS'value' +p39084 +I00 +ssS'unique' +p39085 +(dp39086 +S'editable' +p39087 +I00 +sS'value' +p39088 +I00 +ssS'properties' +p39089 +(dp39090 +S'default_value' +p39091 +(dp39092 +S'editable' +p39093 +I00 +sS'value' +p39094 +NssS'summary_default' +p39095 +(dp39096 +S'editable' +p39097 +I01 +sS'value' +p39098 +S'none' +p39099 +ssS'valid_types' +p39100 +(dp39101 +S'editable' +p39102 +I01 +sS'value' +p39103 +(lp39104 +S'Note' +p39105 +asssS'description' +p39106 +(dp39107 +S'editable' +p39108 +I01 +sS'value' +p39109 +g47 +sssS'task_template' +p39110 +(dp39111 +S'mandatory' +p39112 +(dp39113 +S'editable' +p39114 +I00 +sS'value' +p39115 +I00 +ssS'name' +p39116 +(dp39117 +S'editable' +p39118 +I01 +sS'value' +p39119 +S'Task Template' +p39120 +ssS'data_type' +p39121 +(dp39122 +S'editable' +p39123 +I00 +sS'value' +p39124 +S'entity' +p39125 +ssS'entity_type' +p39126 +(dp39127 +S'editable' +p39128 +I00 +sS'value' +p39129 +S'Scene' +p39130 +ssS'editable' +p39131 +(dp39132 +S'editable' +p39133 +I00 +sS'value' +p39134 +I01 +ssS'unique' +p39135 +(dp39136 +S'editable' +p39137 +I00 +sS'value' +p39138 +I00 +ssS'properties' +p39139 +(dp39140 +S'default_value' +p39141 +(dp39142 +S'editable' +p39143 +I00 +sS'value' +p39144 +NssS'summary_default' +p39145 +(dp39146 +S'editable' +p39147 +I01 +sS'value' +p39148 +S'none' +p39149 +ssS'valid_types' +p39150 +(dp39151 +S'editable' +p39152 +I01 +sS'value' +p39153 +(lp39154 +S'TaskTemplate' +p39155 +asssS'description' +p39156 +(dp39157 +S'editable' +p39158 +I01 +sS'value' +p39159 +g47 +sssS'created_by' +p39160 +(dp39161 +S'mandatory' +p39162 +(dp39163 +S'editable' +p39164 +I00 +sS'value' +p39165 +I00 +ssS'name' +p39166 +(dp39167 +S'editable' +p39168 +I01 +sS'value' +p39169 +S'Created by' +p39170 +ssS'data_type' +p39171 +(dp39172 +S'editable' +p39173 +I00 +sS'value' +p39174 +S'entity' +p39175 +ssS'entity_type' +p39176 +(dp39177 +S'editable' +p39178 +I00 +sS'value' +p39179 +S'Scene' +p39180 +ssS'editable' +p39181 +(dp39182 +S'editable' +p39183 +I00 +sS'value' +p39184 +I00 +ssS'unique' +p39185 +(dp39186 +S'editable' +p39187 +I00 +sS'value' +p39188 +I00 +ssS'properties' +p39189 +(dp39190 +S'default_value' +p39191 +(dp39192 +S'editable' +p39193 +I00 +sS'value' +p39194 +NssS'summary_default' +p39195 +(dp39196 +S'editable' +p39197 +I01 +sS'value' +p39198 +S'none' +p39199 +ssS'valid_types' +p39200 +(dp39201 +S'editable' +p39202 +I01 +sS'value' +p39203 +(lp39204 +S'HumanUser' +p39205 +aS'ApiUser' +p39206 +asssS'description' +p39207 +(dp39208 +S'editable' +p39209 +I01 +sS'value' +p39210 +g47 +sssS'sg_status_list' +p39211 +(dp39212 +S'mandatory' +p39213 +(dp39214 +S'editable' +p39215 +I00 +sS'value' +p39216 +I00 +ssS'name' +p39217 +(dp39218 +S'editable' +p39219 +I01 +sS'value' +p39220 +S'Status' +p39221 +ssS'data_type' +p39222 +(dp39223 +S'editable' +p39224 +I00 +sS'value' +p39225 +S'status_list' +p39226 +ssS'entity_type' +p39227 +(dp39228 +S'editable' +p39229 +I00 +sS'value' +p39230 +S'Scene' +p39231 +ssS'editable' +p39232 +(dp39233 +S'editable' +p39234 +I00 +sS'value' +p39235 +I01 +ssS'unique' +p39236 +(dp39237 +S'editable' +p39238 +I00 +sS'value' +p39239 +I00 +ssS'properties' +p39240 +(dp39241 +S'default_value' +p39242 +(dp39243 +S'editable' +p39244 +I01 +sS'value' +p39245 +S'act' +p39246 +ssS'valid_values' +p39247 +(dp39248 +S'editable' +p39249 +I01 +sS'value' +p39250 +(lp39251 +S'act' +p39252 +aS'cbb' +p39253 +aS'cmpt' +p39254 +aS'omt' +p39255 +aS'hld' +p39256 +assS'summary_default' +p39257 +(dp39258 +S'editable' +p39259 +I01 +sS'value' +p39260 +S'status_list' +p39261 +sssS'description' +p39262 +(dp39263 +S'editable' +p39264 +I01 +sS'value' +p39265 +g47 +sssS'description' +p39266 +(dp39267 +S'mandatory' +p39268 +(dp39269 +S'editable' +p39270 +I00 +sS'value' +p39271 +I00 +ssS'name' +p39272 +(dp39273 +S'editable' +p39274 +I01 +sS'value' +p39275 +S'Description' +p39276 +ssS'data_type' +p39277 +(dp39278 +S'editable' +p39279 +I00 +sS'value' +p39280 +S'text' +p39281 +ssS'entity_type' +p39282 +(dp39283 +S'editable' +p39284 +I00 +sS'value' +p39285 +S'Scene' +p39286 +ssS'editable' +p39287 +(dp39288 +S'editable' +p39289 +I00 +sS'value' +p39290 +I01 +ssS'unique' +p39291 +(dp39292 +S'editable' +p39293 +I00 +sS'value' +p39294 +I00 +ssS'properties' +p39295 +(dp39296 +S'default_value' +p39297 +(dp39298 +S'editable' +p39299 +I00 +sS'value' +p39300 +NssS'summary_default' +p39301 +(dp39302 +S'editable' +p39303 +I01 +sS'value' +p39304 +S'none' +p39305 +sssS'description' +p39306 +(dp39307 +S'editable' +p39308 +I01 +sS'value' +p39309 +g47 +sssS'addressings_cc' +p39310 +(dp39311 +S'mandatory' +p39312 +(dp39313 +S'editable' +p39314 +I00 +sS'value' +p39315 +I00 +ssS'name' +p39316 +(dp39317 +S'editable' +p39318 +I01 +sS'value' +p39319 +S'Cc' +p39320 +ssS'data_type' +p39321 +(dp39322 +S'editable' +p39323 +I00 +sS'value' +p39324 +S'multi_entity' +p39325 +ssS'entity_type' +p39326 +(dp39327 +S'editable' +p39328 +I00 +sS'value' +p39329 +S'Scene' +p39330 +ssS'editable' +p39331 +(dp39332 +S'editable' +p39333 +I00 +sS'value' +p39334 +I01 +ssS'unique' +p39335 +(dp39336 +S'editable' +p39337 +I00 +sS'value' +p39338 +I00 +ssS'properties' +p39339 +(dp39340 +S'default_value' +p39341 +(dp39342 +S'editable' +p39343 +I00 +sS'value' +p39344 +NssS'summary_default' +p39345 +(dp39346 +S'editable' +p39347 +I01 +sS'value' +p39348 +S'none' +p39349 +ssS'valid_types' +p39350 +(dp39351 +S'editable' +p39352 +I01 +sS'value' +p39353 +(lp39354 +S'Group' +p39355 +aS'HumanUser' +p39356 +asssS'description' +p39357 +(dp39358 +S'editable' +p39359 +I01 +sS'value' +p39360 +g47 +sssS'sg_scene_type' +p39361 +(dp39362 +S'mandatory' +p39363 +(dp39364 +S'editable' +p39365 +I00 +sS'value' +p39366 +I00 +ssS'name' +p39367 +(dp39368 +S'editable' +p39369 +I01 +sS'value' +p39370 +S'Type' +p39371 +ssS'data_type' +p39372 +(dp39373 +S'editable' +p39374 +I00 +sS'value' +p39375 +S'list' +p39376 +ssS'entity_type' +p39377 +(dp39378 +S'editable' +p39379 +I00 +sS'value' +p39380 +S'Scene' +p39381 +ssS'editable' +p39382 +(dp39383 +S'editable' +p39384 +I00 +sS'value' +p39385 +I01 +ssS'unique' +p39386 +(dp39387 +S'editable' +p39388 +I00 +sS'value' +p39389 +I00 +ssS'properties' +p39390 +(dp39391 +S'default_value' +p39392 +(dp39393 +S'editable' +p39394 +I00 +sS'value' +p39395 +NssS'valid_values' +p39396 +(dp39397 +S'editable' +p39398 +I01 +sS'value' +p39399 +(lp39400 +ssS'summary_default' +p39401 +(dp39402 +S'editable' +p39403 +I01 +sS'value' +p39404 +S'none' +p39405 +sssS'description' +p39406 +(dp39407 +S'editable' +p39408 +I01 +sS'value' +p39409 +g47 +sssS'shoot_days' +p39410 +(dp39411 +S'mandatory' +p39412 +(dp39413 +S'editable' +p39414 +I00 +sS'value' +p39415 +I00 +ssS'name' +p39416 +(dp39417 +S'editable' +p39418 +I01 +sS'value' +p39419 +S'Shoot Days' +p39420 +ssS'data_type' +p39421 +(dp39422 +S'editable' +p39423 +I00 +sS'value' +p39424 +S'multi_entity' +p39425 +ssS'entity_type' +p39426 +(dp39427 +S'editable' +p39428 +I00 +sS'value' +p39429 +S'Scene' +p39430 +ssS'editable' +p39431 +(dp39432 +S'editable' +p39433 +I00 +sS'value' +p39434 +I01 +ssS'unique' +p39435 +(dp39436 +S'editable' +p39437 +I00 +sS'value' +p39438 +I00 +ssS'properties' +p39439 +(dp39440 +S'default_value' +p39441 +(dp39442 +S'editable' +p39443 +I00 +sS'value' +p39444 +NssS'summary_default' +p39445 +(dp39446 +S'editable' +p39447 +I01 +sS'value' +p39448 +S'none' +p39449 +ssS'valid_types' +p39450 +(dp39451 +S'editable' +p39452 +I01 +sS'value' +p39453 +(lp39454 +S'ShootDay' +p39455 +asssS'description' +p39456 +(dp39457 +S'editable' +p39458 +I01 +sS'value' +p39459 +g47 +sssS'step_0' +p39460 +(dp39461 +S'mandatory' +p39462 +(dp39463 +S'editable' +p39464 +I00 +sS'value' +p39465 +I00 +ssS'name' +p39466 +(dp39467 +S'editable' +p39468 +I01 +sS'value' +p39469 +S'ALL TASKS' +p39470 +ssS'data_type' +p39471 +(dp39472 +S'editable' +p39473 +I00 +sS'value' +p39474 +S'pivot_column' +p39475 +ssS'entity_type' +p39476 +(dp39477 +S'editable' +p39478 +I00 +sS'value' +p39479 +S'Scene' +p39480 +ssS'editable' +p39481 +(dp39482 +S'editable' +p39483 +I00 +sS'value' +p39484 +I00 +ssS'unique' +p39485 +(dp39486 +S'editable' +p39487 +I00 +sS'value' +p39488 +I00 +ssS'properties' +p39489 +(dp39490 +S'default_value' +p39491 +(dp39492 +S'editable' +p39493 +I00 +sS'value' +p39494 +NssS'summary_default' +p39495 +(dp39496 +S'editable' +p39497 +I00 +sS'value' +p39498 +S'none' +p39499 +sssS'description' +p39500 +(dp39501 +S'editable' +p39502 +I01 +sS'value' +p39503 +g47 +sssS'assets' +p39504 +(dp39505 +S'mandatory' +p39506 +(dp39507 +S'editable' +p39508 +I00 +sS'value' +p39509 +I00 +ssS'name' +p39510 +(dp39511 +S'editable' +p39512 +I01 +sS'value' +p39513 +S'Assets' +p39514 +ssS'data_type' +p39515 +(dp39516 +S'editable' +p39517 +I00 +sS'value' +p39518 +S'multi_entity' +p39519 +ssS'entity_type' +p39520 +(dp39521 +S'editable' +p39522 +I00 +sS'value' +p39523 +S'Scene' +p39524 +ssS'editable' +p39525 +(dp39526 +S'editable' +p39527 +I00 +sS'value' +p39528 +I01 +ssS'unique' +p39529 +(dp39530 +S'editable' +p39531 +I00 +sS'value' +p39532 +I00 +ssS'properties' +p39533 +(dp39534 +S'default_value' +p39535 +(dp39536 +S'editable' +p39537 +I00 +sS'value' +p39538 +NssS'summary_default' +p39539 +(dp39540 +S'editable' +p39541 +I01 +sS'value' +p39542 +S'none' +p39543 +ssS'valid_types' +p39544 +(dp39545 +S'editable' +p39546 +I01 +sS'value' +p39547 +(lp39548 +S'Asset' +p39549 +asssS'description' +p39550 +(dp39551 +S'editable' +p39552 +I01 +sS'value' +p39553 +g47 +sssS'created_at' +p39554 +(dp39555 +S'mandatory' +p39556 +(dp39557 +S'editable' +p39558 +I00 +sS'value' +p39559 +I00 +ssS'name' +p39560 +(dp39561 +S'editable' +p39562 +I01 +sS'value' +p39563 +S'Date Created' +p39564 +ssS'data_type' +p39565 +(dp39566 +S'editable' +p39567 +I00 +sS'value' +p39568 +S'date_time' +p39569 +ssS'entity_type' +p39570 +(dp39571 +S'editable' +p39572 +I00 +sS'value' +p39573 +S'Scene' +p39574 +ssS'editable' +p39575 +(dp39576 +S'editable' +p39577 +I00 +sS'value' +p39578 +I00 +ssS'unique' +p39579 +(dp39580 +S'editable' +p39581 +I00 +sS'value' +p39582 +I00 +ssS'properties' +p39583 +(dp39584 +S'default_value' +p39585 +(dp39586 +S'editable' +p39587 +I00 +sS'value' +p39588 +NssS'summary_default' +p39589 +(dp39590 +S'editable' +p39591 +I01 +sS'value' +p39592 +S'none' +p39593 +sssS'description' +p39594 +(dp39595 +S'editable' +p39596 +I01 +sS'value' +p39597 +g47 +sssS'project' +p39598 +(dp39599 +S'mandatory' +p39600 +(dp39601 +S'editable' +p39602 +I00 +sS'value' +p39603 +I00 +ssS'name' +p39604 +(dp39605 +S'editable' +p39606 +I01 +sS'value' +p39607 +S'Project' +p39608 +ssS'data_type' +p39609 +(dp39610 +S'editable' +p39611 +I00 +sS'value' +p39612 +S'entity' +p39613 +ssS'entity_type' +p39614 +(dp39615 +S'editable' +p39616 +I00 +sS'value' +p39617 +S'Scene' +p39618 +ssS'editable' +p39619 +(dp39620 +S'editable' +p39621 +I00 +sS'value' +p39622 +I01 +ssS'unique' +p39623 +(dp39624 +S'editable' +p39625 +I00 +sS'value' +p39626 +I00 +ssS'properties' +p39627 +(dp39628 +S'default_value' +p39629 +(dp39630 +S'editable' +p39631 +I00 +sS'value' +p39632 +NssS'summary_default' +p39633 +(dp39634 +S'editable' +p39635 +I01 +sS'value' +p39636 +S'none' +p39637 +ssS'valid_types' +p39638 +(dp39639 +S'editable' +p39640 +I01 +sS'value' +p39641 +(lp39642 +S'Project' +p39643 +asssS'description' +p39644 +(dp39645 +S'editable' +p39646 +I01 +sS'value' +p39647 +g47 +sssS'filmstrip_image' +p39648 +(dp39649 +S'mandatory' +p39650 +(dp39651 +S'editable' +p39652 +I00 +sS'value' +p39653 +I00 +ssS'name' +p39654 +(dp39655 +S'editable' +p39656 +I01 +sS'value' +p39657 +S'Filmstrip Thumbnail' +p39658 +ssS'data_type' +p39659 +(dp39660 +S'editable' +p39661 +I00 +sS'value' +p39662 +S'image' +p39663 +ssS'entity_type' +p39664 +(dp39665 +S'editable' +p39666 +I00 +sS'value' +p39667 +S'Scene' +p39668 +ssS'editable' +p39669 +(dp39670 +S'editable' +p39671 +I00 +sS'value' +p39672 +I01 +ssS'unique' +p39673 +(dp39674 +S'editable' +p39675 +I00 +sS'value' +p39676 +I00 +ssS'properties' +p39677 +(dp39678 +S'default_value' +p39679 +(dp39680 +S'editable' +p39681 +I00 +sS'value' +p39682 +NssS'summary_default' +p39683 +(dp39684 +S'editable' +p39685 +I01 +sS'value' +p39686 +S'none' +p39687 +sssS'description' +p39688 +(dp39689 +S'editable' +p39690 +I01 +sS'value' +p39691 +g47 +sssS'shots' +p39692 +(dp39693 +S'mandatory' +p39694 +(dp39695 +S'editable' +p39696 +I00 +sS'value' +p39697 +I00 +ssS'name' +p39698 +(dp39699 +S'editable' +p39700 +I01 +sS'value' +p39701 +S'Shots' +p39702 +ssS'data_type' +p39703 +(dp39704 +S'editable' +p39705 +I00 +sS'value' +p39706 +S'multi_entity' +p39707 +ssS'entity_type' +p39708 +(dp39709 +S'editable' +p39710 +I00 +sS'value' +p39711 +S'Scene' +p39712 +ssS'editable' +p39713 +(dp39714 +S'editable' +p39715 +I00 +sS'value' +p39716 +I01 +ssS'unique' +p39717 +(dp39718 +S'editable' +p39719 +I00 +sS'value' +p39720 +I00 +ssS'properties' +p39721 +(dp39722 +S'default_value' +p39723 +(dp39724 +S'editable' +p39725 +I00 +sS'value' +p39726 +NssS'summary_default' +p39727 +(dp39728 +S'editable' +p39729 +I01 +sS'value' +p39730 +S'none' +p39731 +ssS'valid_types' +p39732 +(dp39733 +S'editable' +p39734 +I01 +sS'value' +p39735 +(lp39736 +S'Shot' +p39737 +asssS'description' +p39738 +(dp39739 +S'editable' +p39740 +I01 +sS'value' +p39741 +g47 +sssS'tag_list' +p39742 +(dp39743 +S'mandatory' +p39744 +(dp39745 +S'editable' +p39746 +I00 +sS'value' +p39747 +I00 +ssS'name' +p39748 +(dp39749 +S'editable' +p39750 +I01 +sS'value' +p39751 +S'Tags' +p39752 +ssS'data_type' +p39753 +(dp39754 +S'editable' +p39755 +I00 +sS'value' +p39756 +S'tag_list' +p39757 +ssS'entity_type' +p39758 +(dp39759 +S'editable' +p39760 +I00 +sS'value' +p39761 +S'Scene' +p39762 +ssS'editable' +p39763 +(dp39764 +S'editable' +p39765 +I00 +sS'value' +p39766 +I01 +ssS'unique' +p39767 +(dp39768 +S'editable' +p39769 +I00 +sS'value' +p39770 +I00 +ssS'properties' +p39771 +(dp39772 +S'default_value' +p39773 +(dp39774 +S'editable' +p39775 +I00 +sS'value' +p39776 +NssS'summary_default' +p39777 +(dp39778 +S'editable' +p39779 +I01 +sS'value' +p39780 +S'none' +p39781 +ssS'valid_types' +p39782 +(dp39783 +S'editable' +p39784 +I01 +sS'value' +p39785 +(lp39786 +S'Tag' +p39787 +asssS'description' +p39788 +(dp39789 +S'editable' +p39790 +I01 +sS'value' +p39791 +g47 +sssS'notes' +p39792 +(dp39793 +S'mandatory' +p39794 +(dp39795 +S'editable' +p39796 +I00 +sS'value' +p39797 +I00 +ssS'name' +p39798 +(dp39799 +S'editable' +p39800 +I01 +sS'value' +p39801 +S'Notes' +p39802 +ssS'data_type' +p39803 +(dp39804 +S'editable' +p39805 +I00 +sS'value' +p39806 +S'multi_entity' +p39807 +ssS'entity_type' +p39808 +(dp39809 +S'editable' +p39810 +I00 +sS'value' +p39811 +S'Scene' +p39812 +ssS'editable' +p39813 +(dp39814 +S'editable' +p39815 +I00 +sS'value' +p39816 +I01 +ssS'unique' +p39817 +(dp39818 +S'editable' +p39819 +I00 +sS'value' +p39820 +I00 +ssS'properties' +p39821 +(dp39822 +S'default_value' +p39823 +(dp39824 +S'editable' +p39825 +I00 +sS'value' +p39826 +NssS'summary_default' +p39827 +(dp39828 +S'editable' +p39829 +I01 +sS'value' +p39830 +S'none' +p39831 +ssS'valid_types' +p39832 +(dp39833 +S'editable' +p39834 +I01 +sS'value' +p39835 +(lp39836 +S'Note' +p39837 +asssS'description' +p39838 +(dp39839 +S'editable' +p39840 +I01 +sS'value' +p39841 +g47 +ssssS'Project' +p39842 +(dp39843 +S'step_14' +p39844 +(dp39845 +S'mandatory' +p39846 +(dp39847 +S'editable' +p39848 +I00 +sS'value' +p39849 +I00 +ssS'name' +p39850 +(dp39851 +S'editable' +p39852 +I01 +sS'value' +p39853 +S'Editorial' +p39854 +ssS'data_type' +p39855 +(dp39856 +S'editable' +p39857 +I00 +sS'value' +p39858 +S'pivot_column' +p39859 +ssS'entity_type' +p39860 +(dp39861 +S'editable' +p39862 +I00 +sS'value' +p39863 +S'Project' +p39864 +ssS'editable' +p39865 +(dp39866 +S'editable' +p39867 +I00 +sS'value' +p39868 +I00 +ssS'unique' +p39869 +(dp39870 +S'editable' +p39871 +I00 +sS'value' +p39872 +I00 +ssS'properties' +p39873 +(dp39874 +S'default_value' +p39875 +(dp39876 +S'editable' +p39877 +I00 +sS'value' +p39878 +NssS'summary_default' +p39879 +(dp39880 +S'editable' +p39881 +I00 +sS'value' +p39882 +S'none' +p39883 +sssS'description' +p39884 +(dp39885 +S'editable' +p39886 +I01 +sS'value' +p39887 +g47 +sssS'tasks' +p39888 +(dp39889 +S'mandatory' +p39890 +(dp39891 +S'editable' +p39892 +I00 +sS'value' +p39893 +I00 +ssS'name' +p39894 +(dp39895 +S'editable' +p39896 +I01 +sS'value' +p39897 +S'Tasks' +p39898 +ssS'data_type' +p39899 +(dp39900 +S'editable' +p39901 +I00 +sS'value' +p39902 +S'multi_entity' +p39903 +ssS'entity_type' +p39904 +(dp39905 +S'editable' +p39906 +I00 +sS'value' +p39907 +S'Project' +p39908 +ssS'editable' +p39909 +(dp39910 +S'editable' +p39911 +I00 +sS'value' +p39912 +I01 +ssS'unique' +p39913 +(dp39914 +S'editable' +p39915 +I00 +sS'value' +p39916 +I00 +ssS'properties' +p39917 +(dp39918 +S'default_value' +p39919 +(dp39920 +S'editable' +p39921 +I00 +sS'value' +p39922 +NssS'summary_default' +p39923 +(dp39924 +S'editable' +p39925 +I01 +sS'value' +p39926 +S'none' +p39927 +ssS'valid_types' +p39928 +(dp39929 +S'editable' +p39930 +I01 +sS'value' +p39931 +(lp39932 +S'Task' +p39933 +asssS'description' +p39934 +(dp39935 +S'editable' +p39936 +I01 +sS'value' +p39937 +g47 +sssS'color' +p39938 +(dp39939 +S'mandatory' +p39940 +(dp39941 +S'editable' +p39942 +I00 +sS'value' +p39943 +I00 +ssS'name' +p39944 +(dp39945 +S'editable' +p39946 +I01 +sS'value' +p39947 +S'Color' +p39948 +ssS'data_type' +p39949 +(dp39950 +S'editable' +p39951 +I00 +sS'value' +p39952 +S'color' +p39953 +ssS'entity_type' +p39954 +(dp39955 +S'editable' +p39956 +I00 +sS'value' +p39957 +S'Project' +p39958 +ssS'editable' +p39959 +(dp39960 +S'editable' +p39961 +I00 +sS'value' +p39962 +I01 +ssS'unique' +p39963 +(dp39964 +S'editable' +p39965 +I00 +sS'value' +p39966 +I00 +ssS'properties' +p39967 +(dp39968 +S'default_value' +p39969 +(dp39970 +S'editable' +p39971 +I00 +sS'value' +p39972 +NssS'summary_default' +p39973 +(dp39974 +S'editable' +p39975 +I01 +sS'value' +p39976 +S'none' +p39977 +sssS'description' +p39978 +(dp39979 +S'editable' +p39980 +I01 +sS'value' +p39981 +g47 +sssS'image' +p39982 +(dp39983 +S'mandatory' +p39984 +(dp39985 +S'editable' +p39986 +I00 +sS'value' +p39987 +I00 +ssS'name' +p39988 +(dp39989 +S'editable' +p39990 +I01 +sS'value' +p39991 +S'Thumbnail' +p39992 +ssS'data_type' +p39993 +(dp39994 +S'editable' +p39995 +I00 +sS'value' +p39996 +S'image' +p39997 +ssS'entity_type' +p39998 +(dp39999 +S'editable' +p40000 +I00 +sS'value' +p40001 +S'Project' +p40002 +ssS'editable' +p40003 +(dp40004 +S'editable' +p40005 +I00 +sS'value' +p40006 +I01 +ssS'unique' +p40007 +(dp40008 +S'editable' +p40009 +I00 +sS'value' +p40010 +I00 +ssS'properties' +p40011 +(dp40012 +S'default_value' +p40013 +(dp40014 +S'editable' +p40015 +I00 +sS'value' +p40016 +NssS'summary_default' +p40017 +(dp40018 +S'editable' +p40019 +I01 +sS'value' +p40020 +S'none' +p40021 +sssS'description' +p40022 +(dp40023 +S'editable' +p40024 +I01 +sS'value' +p40025 +g47 +sssS'updated_at' +p40026 +(dp40027 +S'mandatory' +p40028 +(dp40029 +S'editable' +p40030 +I00 +sS'value' +p40031 +I00 +ssS'name' +p40032 +(dp40033 +S'editable' +p40034 +I01 +sS'value' +p40035 +S'Date Updated' +p40036 +ssS'data_type' +p40037 +(dp40038 +S'editable' +p40039 +I00 +sS'value' +p40040 +S'date_time' +p40041 +ssS'entity_type' +p40042 +(dp40043 +S'editable' +p40044 +I00 +sS'value' +p40045 +S'Project' +p40046 +ssS'editable' +p40047 +(dp40048 +S'editable' +p40049 +I00 +sS'value' +p40050 +I00 +ssS'unique' +p40051 +(dp40052 +S'editable' +p40053 +I00 +sS'value' +p40054 +I00 +ssS'properties' +p40055 +(dp40056 +S'default_value' +p40057 +(dp40058 +S'editable' +p40059 +I00 +sS'value' +p40060 +NssS'summary_default' +p40061 +(dp40062 +S'editable' +p40063 +I01 +sS'value' +p40064 +S'none' +p40065 +sssS'description' +p40066 +(dp40067 +S'editable' +p40068 +I01 +sS'value' +p40069 +g47 +sssS'sg_projectnumber' +p40070 +(dp40071 +S'mandatory' +p40072 +(dp40073 +S'editable' +p40074 +I00 +sS'value' +p40075 +I00 +ssS'name' +p40076 +(dp40077 +S'editable' +p40078 +I01 +sS'value' +p40079 +S'projectnumber' +p40080 +ssS'data_type' +p40081 +(dp40082 +S'editable' +p40083 +I00 +sS'value' +p40084 +S'text' +p40085 +ssS'entity_type' +p40086 +(dp40087 +S'editable' +p40088 +I00 +sS'value' +p40089 +S'Project' +p40090 +ssS'editable' +p40091 +(dp40092 +S'editable' +p40093 +I00 +sS'value' +p40094 +I01 +ssS'unique' +p40095 +(dp40096 +S'editable' +p40097 +I00 +sS'value' +p40098 +I00 +ssS'properties' +p40099 +(dp40100 +S'default_value' +p40101 +(dp40102 +S'editable' +p40103 +I00 +sS'value' +p40104 +NssS'summary_default' +p40105 +(dp40106 +S'editable' +p40107 +I01 +sS'value' +p40108 +S'none' +p40109 +sssS'description' +p40110 +(dp40111 +S'editable' +p40112 +I01 +sS'value' +p40113 +g47 +sssS'duration' +p40114 +(dp40115 +S'mandatory' +p40116 +(dp40117 +S'editable' +p40118 +I00 +sS'value' +p40119 +I00 +ssS'name' +p40120 +(dp40121 +S'editable' +p40122 +I01 +sS'value' +p40123 +S'Duration' +p40124 +ssS'data_type' +p40125 +(dp40126 +S'editable' +p40127 +I00 +sS'value' +p40128 +S'number' +p40129 +ssS'entity_type' +p40130 +(dp40131 +S'editable' +p40132 +I00 +sS'value' +p40133 +S'Project' +p40134 +ssS'editable' +p40135 +(dp40136 +S'editable' +p40137 +I00 +sS'value' +p40138 +I00 +ssS'unique' +p40139 +(dp40140 +S'editable' +p40141 +I00 +sS'value' +p40142 +I00 +ssS'properties' +p40143 +(dp40144 +S'default_value' +p40145 +(dp40146 +S'editable' +p40147 +I00 +sS'value' +p40148 +NssS'summary_default' +p40149 +(dp40150 +S'editable' +p40151 +I01 +sS'value' +p40152 +S'none' +p40153 +sssS'description' +p40154 +(dp40155 +S'editable' +p40156 +I01 +sS'value' +p40157 +g47 +sssS'tank_name' +p40158 +(dp40159 +S'mandatory' +p40160 +(dp40161 +S'editable' +p40162 +I00 +sS'value' +p40163 +I00 +ssS'name' +p40164 +(dp40165 +S'editable' +p40166 +I01 +sS'value' +p40167 +S'Tank Name' +p40168 +ssS'data_type' +p40169 +(dp40170 +S'editable' +p40171 +I00 +sS'value' +p40172 +S'text' +p40173 +ssS'entity_type' +p40174 +(dp40175 +S'editable' +p40176 +I00 +sS'value' +p40177 +S'Project' +p40178 +ssS'editable' +p40179 +(dp40180 +S'editable' +p40181 +I00 +sS'value' +p40182 +I01 +ssS'unique' +p40183 +(dp40184 +S'editable' +p40185 +I00 +sS'value' +p40186 +I00 +ssS'properties' +p40187 +(dp40188 +S'default_value' +p40189 +(dp40190 +S'editable' +p40191 +I00 +sS'value' +p40192 +NssS'summary_default' +p40193 +(dp40194 +S'editable' +p40195 +I01 +sS'value' +p40196 +S'none' +p40197 +sssS'description' +p40198 +(dp40199 +S'editable' +p40200 +I01 +sS'value' +p40201 +g47 +sssS'billboard' +p40202 +(dp40203 +S'mandatory' +p40204 +(dp40205 +S'editable' +p40206 +I00 +sS'value' +p40207 +I00 +ssS'name' +p40208 +(dp40209 +S'editable' +p40210 +I01 +sS'value' +p40211 +S'Billboard' +p40212 +ssS'data_type' +p40213 +(dp40214 +S'editable' +p40215 +I00 +sS'value' +p40216 +S'url' +p40217 +ssS'entity_type' +p40218 +(dp40219 +S'editable' +p40220 +I00 +sS'value' +p40221 +S'Project' +p40222 +ssS'editable' +p40223 +(dp40224 +S'editable' +p40225 +I00 +sS'value' +p40226 +I01 +ssS'unique' +p40227 +(dp40228 +S'editable' +p40229 +I00 +sS'value' +p40230 +I00 +ssS'properties' +p40231 +(dp40232 +S'default_value' +p40233 +(dp40234 +S'editable' +p40235 +I00 +sS'value' +p40236 +NssS'open_in_new_window' +p40237 +(dp40238 +S'editable' +p40239 +I00 +sS'value' +p40240 +I01 +ssS'summary_default' +p40241 +(dp40242 +S'editable' +p40243 +I00 +sS'value' +p40244 +S'none' +p40245 +sssS'description' +p40246 +(dp40247 +S'editable' +p40248 +I01 +sS'value' +p40249 +g47 +sssS'cached_display_name' +p40250 +(dp40251 +S'mandatory' +p40252 +(dp40253 +S'editable' +p40254 +I00 +sS'value' +p40255 +I00 +ssS'name' +p40256 +(dp40257 +S'editable' +p40258 +I01 +sS'value' +p40259 +S'Cached Display Name' +p40260 +ssS'data_type' +p40261 +(dp40262 +S'editable' +p40263 +I00 +sS'value' +p40264 +S'text' +p40265 +ssS'entity_type' +p40266 +(dp40267 +S'editable' +p40268 +I00 +sS'value' +p40269 +S'Project' +p40270 +ssS'editable' +p40271 +(dp40272 +S'editable' +p40273 +I00 +sS'value' +p40274 +I01 +ssS'unique' +p40275 +(dp40276 +S'editable' +p40277 +I00 +sS'value' +p40278 +I00 +ssS'properties' +p40279 +(dp40280 +S'default_value' +p40281 +(dp40282 +S'editable' +p40283 +I00 +sS'value' +p40284 +NssS'summary_default' +p40285 +(dp40286 +S'editable' +p40287 +I00 +sS'value' +p40288 +S'none' +p40289 +sssS'description' +p40290 +(dp40291 +S'editable' +p40292 +I01 +sS'value' +p40293 +g47 +sssS'id' +p40294 +(dp40295 +S'mandatory' +p40296 +(dp40297 +S'editable' +p40298 +I00 +sS'value' +p40299 +I00 +ssS'name' +p40300 +(dp40301 +S'editable' +p40302 +I01 +sS'value' +p40303 +S'Id' +p40304 +ssS'data_type' +p40305 +(dp40306 +S'editable' +p40307 +I00 +sS'value' +p40308 +S'number' +p40309 +ssS'entity_type' +p40310 +(dp40311 +S'editable' +p40312 +I00 +sS'value' +p40313 +S'Project' +p40314 +ssS'editable' +p40315 +(dp40316 +S'editable' +p40317 +I00 +sS'value' +p40318 +I00 +ssS'unique' +p40319 +(dp40320 +S'editable' +p40321 +I00 +sS'value' +p40322 +I00 +ssS'properties' +p40323 +(dp40324 +S'default_value' +p40325 +(dp40326 +S'editable' +p40327 +I00 +sS'value' +p40328 +NssS'summary_default' +p40329 +(dp40330 +S'editable' +p40331 +I01 +sS'value' +p40332 +S'none' +p40333 +sssS'description' +p40334 +(dp40335 +S'editable' +p40336 +I01 +sS'value' +p40337 +g47 +sssS'updated_by' +p40338 +(dp40339 +S'mandatory' +p40340 +(dp40341 +S'editable' +p40342 +I00 +sS'value' +p40343 +I00 +ssS'name' +p40344 +(dp40345 +S'editable' +p40346 +I01 +sS'value' +p40347 +S'Updated by' +p40348 +ssS'data_type' +p40349 +(dp40350 +S'editable' +p40351 +I00 +sS'value' +p40352 +S'entity' +p40353 +ssS'entity_type' +p40354 +(dp40355 +S'editable' +p40356 +I00 +sS'value' +p40357 +S'Project' +p40358 +ssS'editable' +p40359 +(dp40360 +S'editable' +p40361 +I00 +sS'value' +p40362 +I00 +ssS'unique' +p40363 +(dp40364 +S'editable' +p40365 +I00 +sS'value' +p40366 +I00 +ssS'properties' +p40367 +(dp40368 +S'default_value' +p40369 +(dp40370 +S'editable' +p40371 +I00 +sS'value' +p40372 +NssS'summary_default' +p40373 +(dp40374 +S'editable' +p40375 +I01 +sS'value' +p40376 +S'none' +p40377 +ssS'valid_types' +p40378 +(dp40379 +S'editable' +p40380 +I01 +sS'value' +p40381 +(lp40382 +S'HumanUser' +p40383 +aS'ApiUser' +p40384 +asssS'description' +p40385 +(dp40386 +S'editable' +p40387 +I01 +sS'value' +p40388 +g47 +sssS'phases' +p40389 +(dp40390 +S'mandatory' +p40391 +(dp40392 +S'editable' +p40393 +I00 +sS'value' +p40394 +I00 +ssS'name' +p40395 +(dp40396 +S'editable' +p40397 +I01 +sS'value' +p40398 +S'Phases' +p40399 +ssS'data_type' +p40400 +(dp40401 +S'editable' +p40402 +I00 +sS'value' +p40403 +S'multi_entity' +p40404 +ssS'entity_type' +p40405 +(dp40406 +S'editable' +p40407 +I00 +sS'value' +p40408 +S'Project' +p40409 +ssS'editable' +p40410 +(dp40411 +S'editable' +p40412 +I00 +sS'value' +p40413 +I01 +ssS'unique' +p40414 +(dp40415 +S'editable' +p40416 +I00 +sS'value' +p40417 +I00 +ssS'properties' +p40418 +(dp40419 +S'default_value' +p40420 +(dp40421 +S'editable' +p40422 +I00 +sS'value' +p40423 +NssS'summary_default' +p40424 +(dp40425 +S'editable' +p40426 +I00 +sS'value' +p40427 +S'none' +p40428 +ssS'valid_types' +p40429 +(dp40430 +S'editable' +p40431 +I00 +sS'value' +p40432 +(lp40433 +S'Phase' +p40434 +asssS'description' +p40435 +(dp40436 +S'editable' +p40437 +I01 +sS'value' +p40438 +g47 +sssS'task_template' +p40439 +(dp40440 +S'mandatory' +p40441 +(dp40442 +S'editable' +p40443 +I00 +sS'value' +p40444 +I00 +ssS'name' +p40445 +(dp40446 +S'editable' +p40447 +I01 +sS'value' +p40448 +S'Task Template' +p40449 +ssS'data_type' +p40450 +(dp40451 +S'editable' +p40452 +I00 +sS'value' +p40453 +S'entity' +p40454 +ssS'entity_type' +p40455 +(dp40456 +S'editable' +p40457 +I00 +sS'value' +p40458 +S'Project' +p40459 +ssS'editable' +p40460 +(dp40461 +S'editable' +p40462 +I00 +sS'value' +p40463 +I01 +ssS'unique' +p40464 +(dp40465 +S'editable' +p40466 +I00 +sS'value' +p40467 +I00 +ssS'properties' +p40468 +(dp40469 +S'default_value' +p40470 +(dp40471 +S'editable' +p40472 +I00 +sS'value' +p40473 +NssS'summary_default' +p40474 +(dp40475 +S'editable' +p40476 +I01 +sS'value' +p40477 +S'none' +p40478 +ssS'valid_types' +p40479 +(dp40480 +S'editable' +p40481 +I01 +sS'value' +p40482 +(lp40483 +S'TaskTemplate' +p40484 +asssS'description' +p40485 +(dp40486 +S'editable' +p40487 +I01 +sS'value' +p40488 +g47 +sssS'created_by' +p40489 +(dp40490 +S'mandatory' +p40491 +(dp40492 +S'editable' +p40493 +I00 +sS'value' +p40494 +I00 +ssS'name' +p40495 +(dp40496 +S'editable' +p40497 +I01 +sS'value' +p40498 +S'Created by' +p40499 +ssS'data_type' +p40500 +(dp40501 +S'editable' +p40502 +I00 +sS'value' +p40503 +S'entity' +p40504 +ssS'entity_type' +p40505 +(dp40506 +S'editable' +p40507 +I00 +sS'value' +p40508 +S'Project' +p40509 +ssS'editable' +p40510 +(dp40511 +S'editable' +p40512 +I00 +sS'value' +p40513 +I00 +ssS'unique' +p40514 +(dp40515 +S'editable' +p40516 +I00 +sS'value' +p40517 +I00 +ssS'properties' +p40518 +(dp40519 +S'default_value' +p40520 +(dp40521 +S'editable' +p40522 +I00 +sS'value' +p40523 +NssS'summary_default' +p40524 +(dp40525 +S'editable' +p40526 +I01 +sS'value' +p40527 +S'none' +p40528 +ssS'valid_types' +p40529 +(dp40530 +S'editable' +p40531 +I01 +sS'value' +p40532 +(lp40533 +S'HumanUser' +p40534 +aS'ApiUser' +p40535 +asssS'description' +p40536 +(dp40537 +S'editable' +p40538 +I01 +sS'value' +p40539 +g47 +sssS'sg_status' +p40540 +(dp40541 +S'mandatory' +p40542 +(dp40543 +S'editable' +p40544 +I00 +sS'value' +p40545 +I00 +ssS'name' +p40546 +(dp40547 +S'editable' +p40548 +I01 +sS'value' +p40549 +S'Status' +p40550 +ssS'data_type' +p40551 +(dp40552 +S'editable' +p40553 +I00 +sS'value' +p40554 +S'list' +p40555 +ssS'entity_type' +p40556 +(dp40557 +S'editable' +p40558 +I00 +sS'value' +p40559 +S'Project' +p40560 +ssS'editable' +p40561 +(dp40562 +S'editable' +p40563 +I00 +sS'value' +p40564 +I01 +ssS'unique' +p40565 +(dp40566 +S'editable' +p40567 +I00 +sS'value' +p40568 +I00 +ssS'properties' +p40569 +(dp40570 +S'default_value' +p40571 +(dp40572 +S'editable' +p40573 +I00 +sS'value' +p40574 +NssS'valid_values' +p40575 +(dp40576 +S'editable' +p40577 +I01 +sS'value' +p40578 +(lp40579 +S'Bidding' +p40580 +aS'Active' +p40581 +aS'Lost' +p40582 +aS'Hold' +p40583 +assS'summary_default' +p40584 +(dp40585 +S'editable' +p40586 +I01 +sS'value' +p40587 +S'none' +p40588 +sssS'description' +p40589 +(dp40590 +S'editable' +p40591 +I01 +sS'value' +p40592 +g47 +sssS'current_user_favorite' +p40593 +(dp40594 +S'mandatory' +p40595 +(dp40596 +S'editable' +p40597 +I00 +sS'value' +p40598 +I00 +ssS'name' +p40599 +(dp40600 +S'editable' +p40601 +I01 +sS'value' +p40602 +S'Favorite' +p40603 +ssS'data_type' +p40604 +(dp40605 +S'editable' +p40606 +I00 +sS'value' +p40607 +S'checkbox' +p40608 +ssS'entity_type' +p40609 +(dp40610 +S'editable' +p40611 +I00 +sS'value' +p40612 +S'Project' +p40613 +ssS'editable' +p40614 +(dp40615 +S'editable' +p40616 +I00 +sS'value' +p40617 +I01 +ssS'unique' +p40618 +(dp40619 +S'editable' +p40620 +I00 +sS'value' +p40621 +I00 +ssS'properties' +p40622 +(dp40623 +S'default_value' +p40624 +(dp40625 +S'editable' +p40626 +I00 +sS'value' +p40627 +NssS'summary_default' +p40628 +(dp40629 +S'editable' +p40630 +I01 +sS'value' +p40631 +S'none' +p40632 +sssS'description' +p40633 +(dp40634 +S'editable' +p40635 +I01 +sS'value' +p40636 +g47 +sssS'last_accessed_by_current_user' +p40637 +(dp40638 +S'mandatory' +p40639 +(dp40640 +S'editable' +p40641 +I00 +sS'value' +p40642 +I00 +ssS'name' +p40643 +(dp40644 +S'editable' +p40645 +I01 +sS'value' +p40646 +S'Last Accessed' +p40647 +ssS'data_type' +p40648 +(dp40649 +S'editable' +p40650 +I00 +sS'value' +p40651 +S'date_time' +p40652 +ssS'entity_type' +p40653 +(dp40654 +S'editable' +p40655 +I00 +sS'value' +p40656 +S'Project' +p40657 +ssS'editable' +p40658 +(dp40659 +S'editable' +p40660 +I00 +sS'value' +p40661 +I01 +ssS'unique' +p40662 +(dp40663 +S'editable' +p40664 +I00 +sS'value' +p40665 +I00 +ssS'properties' +p40666 +(dp40667 +S'default_value' +p40668 +(dp40669 +S'editable' +p40670 +I00 +sS'value' +p40671 +NssS'summary_default' +p40672 +(dp40673 +S'editable' +p40674 +I01 +sS'value' +p40675 +S'none' +p40676 +sssS'description' +p40677 +(dp40678 +S'editable' +p40679 +I01 +sS'value' +p40680 +g47 +sssS'start_date' +p40681 +(dp40682 +S'mandatory' +p40683 +(dp40684 +S'editable' +p40685 +I00 +sS'value' +p40686 +I00 +ssS'name' +p40687 +(dp40688 +S'editable' +p40689 +I01 +sS'value' +p40690 +S'Start Date' +p40691 +ssS'data_type' +p40692 +(dp40693 +S'editable' +p40694 +I00 +sS'value' +p40695 +S'date' +p40696 +ssS'entity_type' +p40697 +(dp40698 +S'editable' +p40699 +I00 +sS'value' +p40700 +S'Project' +p40701 +ssS'editable' +p40702 +(dp40703 +S'editable' +p40704 +I00 +sS'value' +p40705 +I00 +ssS'unique' +p40706 +(dp40707 +S'editable' +p40708 +I00 +sS'value' +p40709 +I00 +ssS'properties' +p40710 +(dp40711 +S'default_value' +p40712 +(dp40713 +S'editable' +p40714 +I00 +sS'value' +p40715 +NssS'summary_default' +p40716 +(dp40717 +S'editable' +p40718 +I01 +sS'value' +p40719 +S'none' +p40720 +sssS'description' +p40721 +(dp40722 +S'editable' +p40723 +I01 +sS'value' +p40724 +g47 +sssS'sg_description' +p40725 +(dp40726 +S'mandatory' +p40727 +(dp40728 +S'editable' +p40729 +I00 +sS'value' +p40730 +I00 +ssS'name' +p40731 +(dp40732 +S'editable' +p40733 +I01 +sS'value' +p40734 +S'Description' +p40735 +ssS'data_type' +p40736 +(dp40737 +S'editable' +p40738 +I00 +sS'value' +p40739 +S'text' +p40740 +ssS'entity_type' +p40741 +(dp40742 +S'editable' +p40743 +I00 +sS'value' +p40744 +S'Project' +p40745 +ssS'editable' +p40746 +(dp40747 +S'editable' +p40748 +I00 +sS'value' +p40749 +I01 +ssS'unique' +p40750 +(dp40751 +S'editable' +p40752 +I00 +sS'value' +p40753 +I00 +ssS'properties' +p40754 +(dp40755 +S'default_value' +p40756 +(dp40757 +S'editable' +p40758 +I00 +sS'value' +p40759 +NssS'summary_default' +p40760 +(dp40761 +S'editable' +p40762 +I01 +sS'value' +p40763 +S'none' +p40764 +sssS'description' +p40765 +(dp40766 +S'editable' +p40767 +I01 +sS'value' +p40768 +g47 +sssS'users' +p40769 +(dp40770 +S'mandatory' +p40771 +(dp40772 +S'editable' +p40773 +I00 +sS'value' +p40774 +I00 +ssS'name' +p40775 +(dp40776 +S'editable' +p40777 +I01 +sS'value' +p40778 +S'Users' +p40779 +ssS'data_type' +p40780 +(dp40781 +S'editable' +p40782 +I00 +sS'value' +p40783 +S'multi_entity' +p40784 +ssS'entity_type' +p40785 +(dp40786 +S'editable' +p40787 +I00 +sS'value' +p40788 +S'Project' +p40789 +ssS'editable' +p40790 +(dp40791 +S'editable' +p40792 +I00 +sS'value' +p40793 +I01 +ssS'unique' +p40794 +(dp40795 +S'editable' +p40796 +I00 +sS'value' +p40797 +I00 +ssS'properties' +p40798 +(dp40799 +S'default_value' +p40800 +(dp40801 +S'editable' +p40802 +I00 +sS'value' +p40803 +NssS'summary_default' +p40804 +(dp40805 +S'editable' +p40806 +I01 +sS'value' +p40807 +S'none' +p40808 +ssS'valid_types' +p40809 +(dp40810 +S'editable' +p40811 +I01 +sS'value' +p40812 +(lp40813 +S'HumanUser' +p40814 +asssS'description' +p40815 +(dp40816 +S'editable' +p40817 +I01 +sS'value' +p40818 +g47 +sssS'end_date' +p40819 +(dp40820 +S'mandatory' +p40821 +(dp40822 +S'editable' +p40823 +I00 +sS'value' +p40824 +I00 +ssS'name' +p40825 +(dp40826 +S'editable' +p40827 +I01 +sS'value' +p40828 +S'End Date' +p40829 +ssS'data_type' +p40830 +(dp40831 +S'editable' +p40832 +I00 +sS'value' +p40833 +S'date' +p40834 +ssS'entity_type' +p40835 +(dp40836 +S'editable' +p40837 +I00 +sS'value' +p40838 +S'Project' +p40839 +ssS'editable' +p40840 +(dp40841 +S'editable' +p40842 +I00 +sS'value' +p40843 +I00 +ssS'unique' +p40844 +(dp40845 +S'editable' +p40846 +I00 +sS'value' +p40847 +I00 +ssS'properties' +p40848 +(dp40849 +S'default_value' +p40850 +(dp40851 +S'editable' +p40852 +I00 +sS'value' +p40853 +NssS'summary_default' +p40854 +(dp40855 +S'editable' +p40856 +I01 +sS'value' +p40857 +S'none' +p40858 +sssS'description' +p40859 +(dp40860 +S'editable' +p40861 +I01 +sS'value' +p40862 +g47 +sssS'archived' +p40863 +(dp40864 +S'mandatory' +p40865 +(dp40866 +S'editable' +p40867 +I00 +sS'value' +p40868 +I00 +ssS'name' +p40869 +(dp40870 +S'editable' +p40871 +I01 +sS'value' +p40872 +S'Archived' +p40873 +ssS'data_type' +p40874 +(dp40875 +S'editable' +p40876 +I00 +sS'value' +p40877 +S'checkbox' +p40878 +ssS'entity_type' +p40879 +(dp40880 +S'editable' +p40881 +I00 +sS'value' +p40882 +S'Project' +p40883 +ssS'editable' +p40884 +(dp40885 +S'editable' +p40886 +I00 +sS'value' +p40887 +I01 +ssS'unique' +p40888 +(dp40889 +S'editable' +p40890 +I00 +sS'value' +p40891 +I00 +ssS'properties' +p40892 +(dp40893 +S'default_value' +p40894 +(dp40895 +S'editable' +p40896 +I00 +sS'value' +p40897 +I00 +ssS'summary_default' +p40898 +(dp40899 +S'editable' +p40900 +I00 +sS'value' +p40901 +S'none' +p40902 +sssS'description' +p40903 +(dp40904 +S'editable' +p40905 +I01 +sS'value' +p40906 +g47 +sssS'step_0' +p40907 +(dp40908 +S'mandatory' +p40909 +(dp40910 +S'editable' +p40911 +I00 +sS'value' +p40912 +I00 +ssS'name' +p40913 +(dp40914 +S'editable' +p40915 +I01 +sS'value' +p40916 +S'ALL TASKS' +p40917 +ssS'data_type' +p40918 +(dp40919 +S'editable' +p40920 +I00 +sS'value' +p40921 +S'pivot_column' +p40922 +ssS'entity_type' +p40923 +(dp40924 +S'editable' +p40925 +I00 +sS'value' +p40926 +S'Project' +p40927 +ssS'editable' +p40928 +(dp40929 +S'editable' +p40930 +I00 +sS'value' +p40931 +I00 +ssS'unique' +p40932 +(dp40933 +S'editable' +p40934 +I00 +sS'value' +p40935 +I00 +ssS'properties' +p40936 +(dp40937 +S'default_value' +p40938 +(dp40939 +S'editable' +p40940 +I00 +sS'value' +p40941 +NssS'summary_default' +p40942 +(dp40943 +S'editable' +p40944 +I00 +sS'value' +p40945 +S'none' +p40946 +sssS'description' +p40947 +(dp40948 +S'editable' +p40949 +I01 +sS'value' +p40950 +g47 +sssS'name' +p40951 +(dp40952 +S'mandatory' +p40953 +(dp40954 +S'editable' +p40955 +I00 +sS'value' +p40956 +I01 +ssS'name' +p40957 +(dp40958 +S'editable' +p40959 +I01 +sS'value' +p40960 +S'Project Name' +p40961 +ssS'data_type' +p40962 +(dp40963 +S'editable' +p40964 +I00 +sS'value' +p40965 +S'text' +p40966 +ssS'entity_type' +p40967 +(dp40968 +S'editable' +p40969 +I00 +sS'value' +p40970 +S'Project' +p40971 +ssS'editable' +p40972 +(dp40973 +S'editable' +p40974 +I00 +sS'value' +p40975 +I01 +ssS'unique' +p40976 +(dp40977 +S'editable' +p40978 +I00 +sS'value' +p40979 +I01 +ssS'properties' +p40980 +(dp40981 +S'default_value' +p40982 +(dp40983 +S'editable' +p40984 +I00 +sS'value' +p40985 +NssS'summary_default' +p40986 +(dp40987 +S'editable' +p40988 +I01 +sS'value' +p40989 +S'none' +p40990 +sssS'description' +p40991 +(dp40992 +S'editable' +p40993 +I01 +sS'value' +p40994 +g47 +sssS'created_at' +p40995 +(dp40996 +S'mandatory' +p40997 +(dp40998 +S'editable' +p40999 +I00 +sS'value' +p41000 +I00 +ssS'name' +p41001 +(dp41002 +S'editable' +p41003 +I01 +sS'value' +p41004 +S'Date Created' +p41005 +ssS'data_type' +p41006 +(dp41007 +S'editable' +p41008 +I00 +sS'value' +p41009 +S'date_time' +p41010 +ssS'entity_type' +p41011 +(dp41012 +S'editable' +p41013 +I00 +sS'value' +p41014 +S'Project' +p41015 +ssS'editable' +p41016 +(dp41017 +S'editable' +p41018 +I00 +sS'value' +p41019 +I00 +ssS'unique' +p41020 +(dp41021 +S'editable' +p41022 +I00 +sS'value' +p41023 +I00 +ssS'properties' +p41024 +(dp41025 +S'default_value' +p41026 +(dp41027 +S'editable' +p41028 +I00 +sS'value' +p41029 +NssS'summary_default' +p41030 +(dp41031 +S'editable' +p41032 +I01 +sS'value' +p41033 +S'none' +p41034 +sssS'description' +p41035 +(dp41036 +S'editable' +p41037 +I01 +sS'value' +p41038 +g47 +sssS'filmstrip_image' +p41039 +(dp41040 +S'mandatory' +p41041 +(dp41042 +S'editable' +p41043 +I00 +sS'value' +p41044 +I00 +ssS'name' +p41045 +(dp41046 +S'editable' +p41047 +I01 +sS'value' +p41048 +S'Filmstrip Thumbnail' +p41049 +ssS'data_type' +p41050 +(dp41051 +S'editable' +p41052 +I00 +sS'value' +p41053 +S'image' +p41054 +ssS'entity_type' +p41055 +(dp41056 +S'editable' +p41057 +I00 +sS'value' +p41058 +S'Project' +p41059 +ssS'editable' +p41060 +(dp41061 +S'editable' +p41062 +I00 +sS'value' +p41063 +I01 +ssS'unique' +p41064 +(dp41065 +S'editable' +p41066 +I00 +sS'value' +p41067 +I00 +ssS'properties' +p41068 +(dp41069 +S'default_value' +p41070 +(dp41071 +S'editable' +p41072 +I00 +sS'value' +p41073 +NssS'summary_default' +p41074 +(dp41075 +S'editable' +p41076 +I01 +sS'value' +p41077 +S'none' +p41078 +sssS'description' +p41079 +(dp41080 +S'editable' +p41081 +I01 +sS'value' +p41082 +g47 +sssS'layout_project' +p41083 +(dp41084 +S'mandatory' +p41085 +(dp41086 +S'editable' +p41087 +I00 +sS'value' +p41088 +I00 +ssS'name' +p41089 +(dp41090 +S'editable' +p41091 +I01 +sS'value' +p41092 +S'Layout Template' +p41093 +ssS'data_type' +p41094 +(dp41095 +S'editable' +p41096 +I00 +sS'value' +p41097 +S'entity' +p41098 +ssS'entity_type' +p41099 +(dp41100 +S'editable' +p41101 +I00 +sS'value' +p41102 +S'Project' +p41103 +ssS'editable' +p41104 +(dp41105 +S'editable' +p41106 +I00 +sS'value' +p41107 +I00 +ssS'unique' +p41108 +(dp41109 +S'editable' +p41110 +I00 +sS'value' +p41111 +I00 +ssS'properties' +p41112 +(dp41113 +S'default_value' +p41114 +(dp41115 +S'editable' +p41116 +I00 +sS'value' +p41117 +NssS'summary_default' +p41118 +(dp41119 +S'editable' +p41120 +I00 +sS'value' +p41121 +S'none' +p41122 +ssS'valid_types' +p41123 +(dp41124 +S'editable' +p41125 +I00 +sS'value' +p41126 +(lp41127 +S'Project' +p41128 +asssS'description' +p41129 +(dp41130 +S'editable' +p41131 +I01 +sS'value' +p41132 +g47 +sssS'sg_type' +p41133 +(dp41134 +S'mandatory' +p41135 +(dp41136 +S'editable' +p41137 +I00 +sS'value' +p41138 +I00 +ssS'name' +p41139 +(dp41140 +S'editable' +p41141 +I01 +sS'value' +p41142 +S'Type' +p41143 +ssS'data_type' +p41144 +(dp41145 +S'editable' +p41146 +I00 +sS'value' +p41147 +S'list' +p41148 +ssS'entity_type' +p41149 +(dp41150 +S'editable' +p41151 +I00 +sS'value' +p41152 +S'Project' +p41153 +ssS'editable' +p41154 +(dp41155 +S'editable' +p41156 +I00 +sS'value' +p41157 +I01 +ssS'unique' +p41158 +(dp41159 +S'editable' +p41160 +I00 +sS'value' +p41161 +I00 +ssS'properties' +p41162 +(dp41163 +S'default_value' +p41164 +(dp41165 +S'editable' +p41166 +I00 +sS'value' +p41167 +NssS'valid_values' +p41168 +(dp41169 +S'editable' +p41170 +I01 +sS'value' +p41171 +(lp41172 +S'Short Film' +p41173 +aS'Feature Film' +p41174 +aS'Commercial' +p41175 +aS'Effects' +p41176 +aS'Game Cinematic' +p41177 +aS'Other' +p41178 +aS'(this list can be customized)' +p41179 +assS'summary_default' +p41180 +(dp41181 +S'editable' +p41182 +I01 +sS'value' +p41183 +S'none' +p41184 +sssS'description' +p41185 +(dp41186 +S'editable' +p41187 +I01 +sS'value' +p41188 +g47 +sssS'tag_list' +p41189 +(dp41190 +S'mandatory' +p41191 +(dp41192 +S'editable' +p41193 +I00 +sS'value' +p41194 +I00 +ssS'name' +p41195 +(dp41196 +S'editable' +p41197 +I01 +sS'value' +p41198 +S'Tags' +p41199 +ssS'data_type' +p41200 +(dp41201 +S'editable' +p41202 +I00 +sS'value' +p41203 +S'tag_list' +p41204 +ssS'entity_type' +p41205 +(dp41206 +S'editable' +p41207 +I00 +sS'value' +p41208 +S'Project' +p41209 +ssS'editable' +p41210 +(dp41211 +S'editable' +p41212 +I00 +sS'value' +p41213 +I01 +ssS'unique' +p41214 +(dp41215 +S'editable' +p41216 +I00 +sS'value' +p41217 +I00 +ssS'properties' +p41218 +(dp41219 +S'default_value' +p41220 +(dp41221 +S'editable' +p41222 +I00 +sS'value' +p41223 +NssS'summary_default' +p41224 +(dp41225 +S'editable' +p41226 +I01 +sS'value' +p41227 +S'none' +p41228 +ssS'valid_types' +p41229 +(dp41230 +S'editable' +p41231 +I01 +sS'value' +p41232 +(lp41233 +S'Tag' +p41234 +asssS'description' +p41235 +(dp41236 +S'editable' +p41237 +I01 +sS'value' +p41238 +g47 +ssssS'Version' +p41239 +(dp41240 +S'sg_version_type' +p41241 +(dp41242 +S'mandatory' +p41243 +(dp41244 +S'editable' +p41245 +I00 +sS'value' +p41246 +I00 +ssS'name' +p41247 +(dp41248 +S'editable' +p41249 +I01 +sS'value' +p41250 +S'Type' +p41251 +ssS'data_type' +p41252 +(dp41253 +S'editable' +p41254 +I00 +sS'value' +p41255 +S'list' +p41256 +ssS'entity_type' +p41257 +(dp41258 +S'editable' +p41259 +I00 +sS'value' +p41260 +S'Version' +p41261 +ssS'editable' +p41262 +(dp41263 +S'editable' +p41264 +I00 +sS'value' +p41265 +I01 +ssS'unique' +p41266 +(dp41267 +S'editable' +p41268 +I00 +sS'value' +p41269 +I00 +ssS'properties' +p41270 +(dp41271 +S'default_value' +p41272 +(dp41273 +S'editable' +p41274 +I00 +sS'value' +p41275 +NssS'valid_values' +p41276 +(dp41277 +S'editable' +p41278 +I01 +sS'value' +p41279 +(lp41280 +ssS'summary_default' +p41281 +(dp41282 +S'editable' +p41283 +I01 +sS'value' +p41284 +S'none' +p41285 +sssS'description' +p41286 +(dp41287 +S'editable' +p41288 +I01 +sS'value' +p41289 +g47 +sssS'open_notes_count' +p41290 +(dp41291 +S'mandatory' +p41292 +(dp41293 +S'editable' +p41294 +I00 +sS'value' +p41295 +I00 +ssS'name' +p41296 +(dp41297 +S'editable' +p41298 +I01 +sS'value' +p41299 +S'Open Notes Count' +p41300 +ssS'data_type' +p41301 +(dp41302 +S'editable' +p41303 +I00 +sS'value' +p41304 +S'text' +p41305 +ssS'entity_type' +p41306 +(dp41307 +S'editable' +p41308 +I00 +sS'value' +p41309 +S'Version' +p41310 +ssS'editable' +p41311 +(dp41312 +S'editable' +p41313 +I00 +sS'value' +p41314 +I00 +ssS'unique' +p41315 +(dp41316 +S'editable' +p41317 +I00 +sS'value' +p41318 +I00 +ssS'properties' +p41319 +(dp41320 +S'default_value' +p41321 +(dp41322 +S'editable' +p41323 +I00 +sS'value' +p41324 +NssS'summary_default' +p41325 +(dp41326 +S'editable' +p41327 +I01 +sS'value' +p41328 +S'none' +p41329 +sssS'description' +p41330 +(dp41331 +S'editable' +p41332 +I01 +sS'value' +p41333 +g47 +sssS'code' +p41334 +(dp41335 +S'mandatory' +p41336 +(dp41337 +S'editable' +p41338 +I00 +sS'value' +p41339 +I01 +ssS'name' +p41340 +(dp41341 +S'editable' +p41342 +I01 +sS'value' +p41343 +S'Version Name' +p41344 +ssS'data_type' +p41345 +(dp41346 +S'editable' +p41347 +I00 +sS'value' +p41348 +S'text' +p41349 +ssS'entity_type' +p41350 +(dp41351 +S'editable' +p41352 +I00 +sS'value' +p41353 +S'Version' +p41354 +ssS'editable' +p41355 +(dp41356 +S'editable' +p41357 +I00 +sS'value' +p41358 +I01 +ssS'unique' +p41359 +(dp41360 +S'editable' +p41361 +I00 +sS'value' +p41362 +I00 +ssS'properties' +p41363 +(dp41364 +S'default_value' +p41365 +(dp41366 +S'editable' +p41367 +I00 +sS'value' +p41368 +NssS'summary_default' +p41369 +(dp41370 +S'editable' +p41371 +I01 +sS'value' +p41372 +S'none' +p41373 +sssS'description' +p41374 +(dp41375 +S'editable' +p41376 +I01 +sS'value' +p41377 +g47 +sssS'playlists' +p41378 +(dp41379 +S'mandatory' +p41380 +(dp41381 +S'editable' +p41382 +I00 +sS'value' +p41383 +I00 +ssS'name' +p41384 +(dp41385 +S'editable' +p41386 +I01 +sS'value' +p41387 +S'Playlists' +p41388 +ssS'data_type' +p41389 +(dp41390 +S'editable' +p41391 +I00 +sS'value' +p41392 +S'multi_entity' +p41393 +ssS'entity_type' +p41394 +(dp41395 +S'editable' +p41396 +I00 +sS'value' +p41397 +S'Version' +p41398 +ssS'editable' +p41399 +(dp41400 +S'editable' +p41401 +I00 +sS'value' +p41402 +I01 +ssS'unique' +p41403 +(dp41404 +S'editable' +p41405 +I00 +sS'value' +p41406 +I00 +ssS'properties' +p41407 +(dp41408 +S'default_value' +p41409 +(dp41410 +S'editable' +p41411 +I00 +sS'value' +p41412 +NssS'summary_default' +p41413 +(dp41414 +S'editable' +p41415 +I01 +sS'value' +p41416 +S'none' +p41417 +ssS'valid_types' +p41418 +(dp41419 +S'editable' +p41420 +I01 +sS'value' +p41421 +(lp41422 +S'Playlist' +p41423 +asssS'description' +p41424 +(dp41425 +S'editable' +p41426 +I01 +sS'value' +p41427 +g47 +sssS'sg_task' +p41428 +(dp41429 +S'mandatory' +p41430 +(dp41431 +S'editable' +p41432 +I00 +sS'value' +p41433 +I00 +ssS'name' +p41434 +(dp41435 +S'editable' +p41436 +I01 +sS'value' +p41437 +S'Task' +p41438 +ssS'data_type' +p41439 +(dp41440 +S'editable' +p41441 +I00 +sS'value' +p41442 +S'entity' +p41443 +ssS'entity_type' +p41444 +(dp41445 +S'editable' +p41446 +I00 +sS'value' +p41447 +S'Version' +p41448 +ssS'editable' +p41449 +(dp41450 +S'editable' +p41451 +I00 +sS'value' +p41452 +I01 +ssS'unique' +p41453 +(dp41454 +S'editable' +p41455 +I00 +sS'value' +p41456 +I00 +ssS'properties' +p41457 +(dp41458 +S'default_value' +p41459 +(dp41460 +S'editable' +p41461 +I00 +sS'value' +p41462 +NssS'summary_default' +p41463 +(dp41464 +S'editable' +p41465 +I01 +sS'value' +p41466 +S'none' +p41467 +ssS'valid_types' +p41468 +(dp41469 +S'editable' +p41470 +I01 +sS'value' +p41471 +(lp41472 +S'Task' +p41473 +asssS'description' +p41474 +(dp41475 +S'editable' +p41476 +I01 +sS'value' +p41477 +g47 +sssS'image' +p41478 +(dp41479 +S'mandatory' +p41480 +(dp41481 +S'editable' +p41482 +I00 +sS'value' +p41483 +I00 +ssS'name' +p41484 +(dp41485 +S'editable' +p41486 +I01 +sS'value' +p41487 +S'Thumbnail' +p41488 +ssS'data_type' +p41489 +(dp41490 +S'editable' +p41491 +I00 +sS'value' +p41492 +S'image' +p41493 +ssS'entity_type' +p41494 +(dp41495 +S'editable' +p41496 +I00 +sS'value' +p41497 +S'Version' +p41498 +ssS'editable' +p41499 +(dp41500 +S'editable' +p41501 +I00 +sS'value' +p41502 +I01 +ssS'unique' +p41503 +(dp41504 +S'editable' +p41505 +I00 +sS'value' +p41506 +I00 +ssS'properties' +p41507 +(dp41508 +S'default_value' +p41509 +(dp41510 +S'editable' +p41511 +I00 +sS'value' +p41512 +NssS'summary_default' +p41513 +(dp41514 +S'editable' +p41515 +I01 +sS'value' +p41516 +S'none' +p41517 +sssS'description' +p41518 +(dp41519 +S'editable' +p41520 +I01 +sS'value' +p41521 +g47 +sssS'updated_at' +p41522 +(dp41523 +S'mandatory' +p41524 +(dp41525 +S'editable' +p41526 +I00 +sS'value' +p41527 +I00 +ssS'name' +p41528 +(dp41529 +S'editable' +p41530 +I01 +sS'value' +p41531 +S'Date Updated' +p41532 +ssS'data_type' +p41533 +(dp41534 +S'editable' +p41535 +I00 +sS'value' +p41536 +S'date_time' +p41537 +ssS'entity_type' +p41538 +(dp41539 +S'editable' +p41540 +I00 +sS'value' +p41541 +S'Version' +p41542 +ssS'editable' +p41543 +(dp41544 +S'editable' +p41545 +I00 +sS'value' +p41546 +I00 +ssS'unique' +p41547 +(dp41548 +S'editable' +p41549 +I00 +sS'value' +p41550 +I00 +ssS'properties' +p41551 +(dp41552 +S'default_value' +p41553 +(dp41554 +S'editable' +p41555 +I00 +sS'value' +p41556 +NssS'summary_default' +p41557 +(dp41558 +S'editable' +p41559 +I01 +sS'value' +p41560 +S'none' +p41561 +sssS'description' +p41562 +(dp41563 +S'editable' +p41564 +I01 +sS'value' +p41565 +g47 +sssS'sg_uploaded_movie_frame_rate' +p41566 +(dp41567 +S'mandatory' +p41568 +(dp41569 +S'editable' +p41570 +I00 +sS'value' +p41571 +I00 +ssS'name' +p41572 +(dp41573 +S'editable' +p41574 +I01 +sS'value' +p41575 +S'Uploaded Movie Frame Rate' +p41576 +ssS'data_type' +p41577 +(dp41578 +S'editable' +p41579 +I00 +sS'value' +p41580 +S'float' +p41581 +ssS'entity_type' +p41582 +(dp41583 +S'editable' +p41584 +I00 +sS'value' +p41585 +S'Version' +p41586 +ssS'editable' +p41587 +(dp41588 +S'editable' +p41589 +I00 +sS'value' +p41590 +I01 +ssS'unique' +p41591 +(dp41592 +S'editable' +p41593 +I00 +sS'value' +p41594 +I00 +ssS'properties' +p41595 +(dp41596 +S'default_value' +p41597 +(dp41598 +S'editable' +p41599 +I00 +sS'value' +p41600 +NssS'summary_default' +p41601 +(dp41602 +S'editable' +p41603 +I00 +sS'value' +p41604 +S'none' +p41605 +sssS'description' +p41606 +(dp41607 +S'editable' +p41608 +I01 +sS'value' +p41609 +g47 +sssS'sg_path_to_frames' +p41610 +(dp41611 +S'mandatory' +p41612 +(dp41613 +S'editable' +p41614 +I00 +sS'value' +p41615 +I00 +ssS'name' +p41616 +(dp41617 +S'editable' +p41618 +I01 +sS'value' +p41619 +S'Path to Frames' +p41620 +ssS'data_type' +p41621 +(dp41622 +S'editable' +p41623 +I00 +sS'value' +p41624 +S'text' +p41625 +ssS'entity_type' +p41626 +(dp41627 +S'editable' +p41628 +I00 +sS'value' +p41629 +S'Version' +p41630 +ssS'editable' +p41631 +(dp41632 +S'editable' +p41633 +I00 +sS'value' +p41634 +I01 +ssS'unique' +p41635 +(dp41636 +S'editable' +p41637 +I00 +sS'value' +p41638 +I00 +ssS'properties' +p41639 +(dp41640 +S'default_value' +p41641 +(dp41642 +S'editable' +p41643 +I00 +sS'value' +p41644 +NssS'summary_default' +p41645 +(dp41646 +S'editable' +p41647 +I01 +sS'value' +p41648 +S'none' +p41649 +sssS'description' +p41650 +(dp41651 +S'editable' +p41652 +I01 +sS'value' +p41653 +S'Location of the high res frames on your local filesystem. Used for playback of high resolution frames.' +p41654 +sssS'tasks' +p41655 +(dp41656 +S'mandatory' +p41657 +(dp41658 +S'editable' +p41659 +I00 +sS'value' +p41660 +I00 +ssS'name' +p41661 +(dp41662 +S'editable' +p41663 +I01 +sS'value' +p41664 +S'Tasks' +p41665 +ssS'data_type' +p41666 +(dp41667 +S'editable' +p41668 +I00 +sS'value' +p41669 +S'multi_entity' +p41670 +ssS'entity_type' +p41671 +(dp41672 +S'editable' +p41673 +I00 +sS'value' +p41674 +S'Version' +p41675 +ssS'editable' +p41676 +(dp41677 +S'editable' +p41678 +I00 +sS'value' +p41679 +I01 +ssS'unique' +p41680 +(dp41681 +S'editable' +p41682 +I00 +sS'value' +p41683 +I00 +ssS'properties' +p41684 +(dp41685 +S'default_value' +p41686 +(dp41687 +S'editable' +p41688 +I00 +sS'value' +p41689 +NssS'summary_default' +p41690 +(dp41691 +S'editable' +p41692 +I01 +sS'value' +p41693 +S'none' +p41694 +ssS'valid_types' +p41695 +(dp41696 +S'editable' +p41697 +I01 +sS'value' +p41698 +(lp41699 +S'Task' +p41700 +asssS'description' +p41701 +(dp41702 +S'editable' +p41703 +I01 +sS'value' +p41704 +g47 +sssS'sg_department' +p41705 +(dp41706 +S'mandatory' +p41707 +(dp41708 +S'editable' +p41709 +I00 +sS'value' +p41710 +I00 +ssS'name' +p41711 +(dp41712 +S'editable' +p41713 +I01 +sS'value' +p41714 +S'Department' +p41715 +ssS'data_type' +p41716 +(dp41717 +S'editable' +p41718 +I00 +sS'value' +p41719 +S'text' +p41720 +ssS'entity_type' +p41721 +(dp41722 +S'editable' +p41723 +I00 +sS'value' +p41724 +S'Version' +p41725 +ssS'editable' +p41726 +(dp41727 +S'editable' +p41728 +I00 +sS'value' +p41729 +I01 +ssS'unique' +p41730 +(dp41731 +S'editable' +p41732 +I00 +sS'value' +p41733 +I00 +ssS'properties' +p41734 +(dp41735 +S'default_value' +p41736 +(dp41737 +S'editable' +p41738 +I00 +sS'value' +p41739 +NssS'summary_default' +p41740 +(dp41741 +S'editable' +p41742 +I01 +sS'value' +p41743 +S'none' +p41744 +sssS'description' +p41745 +(dp41746 +S'editable' +p41747 +I01 +sS'value' +p41748 +S'The department the Version was submitted from. This is used to find the latest Version from the same department.' +p41749 +sssS'cached_display_name' +p41750 +(dp41751 +S'mandatory' +p41752 +(dp41753 +S'editable' +p41754 +I00 +sS'value' +p41755 +I00 +ssS'name' +p41756 +(dp41757 +S'editable' +p41758 +I01 +sS'value' +p41759 +S'Cached Display Name' +p41760 +ssS'data_type' +p41761 +(dp41762 +S'editable' +p41763 +I00 +sS'value' +p41764 +S'text' +p41765 +ssS'entity_type' +p41766 +(dp41767 +S'editable' +p41768 +I00 +sS'value' +p41769 +S'Version' +p41770 +ssS'editable' +p41771 +(dp41772 +S'editable' +p41773 +I00 +sS'value' +p41774 +I01 +ssS'unique' +p41775 +(dp41776 +S'editable' +p41777 +I00 +sS'value' +p41778 +I00 +ssS'properties' +p41779 +(dp41780 +S'default_value' +p41781 +(dp41782 +S'editable' +p41783 +I00 +sS'value' +p41784 +NssS'summary_default' +p41785 +(dp41786 +S'editable' +p41787 +I00 +sS'value' +p41788 +S'none' +p41789 +sssS'description' +p41790 +(dp41791 +S'editable' +p41792 +I01 +sS'value' +p41793 +g47 +sssS'frame_range' +p41794 +(dp41795 +S'mandatory' +p41796 +(dp41797 +S'editable' +p41798 +I00 +sS'value' +p41799 +I00 +ssS'name' +p41800 +(dp41801 +S'editable' +p41802 +I01 +sS'value' +p41803 +S'Frame Range' +p41804 +ssS'data_type' +p41805 +(dp41806 +S'editable' +p41807 +I00 +sS'value' +p41808 +S'text' +p41809 +ssS'entity_type' +p41810 +(dp41811 +S'editable' +p41812 +I00 +sS'value' +p41813 +S'Version' +p41814 +ssS'editable' +p41815 +(dp41816 +S'editable' +p41817 +I00 +sS'value' +p41818 +I01 +ssS'unique' +p41819 +(dp41820 +S'editable' +p41821 +I00 +sS'value' +p41822 +I00 +ssS'properties' +p41823 +(dp41824 +S'default_value' +p41825 +(dp41826 +S'editable' +p41827 +I00 +sS'value' +p41828 +NssS'summary_default' +p41829 +(dp41830 +S'editable' +p41831 +I01 +sS'value' +p41832 +S'none' +p41833 +sssS'description' +p41834 +(dp41835 +S'editable' +p41836 +I01 +sS'value' +p41837 +g47 +sssS'updated_by' +p41838 +(dp41839 +S'mandatory' +p41840 +(dp41841 +S'editable' +p41842 +I00 +sS'value' +p41843 +I00 +ssS'name' +p41844 +(dp41845 +S'editable' +p41846 +I01 +sS'value' +p41847 +S'Updated by' +p41848 +ssS'data_type' +p41849 +(dp41850 +S'editable' +p41851 +I00 +sS'value' +p41852 +S'entity' +p41853 +ssS'entity_type' +p41854 +(dp41855 +S'editable' +p41856 +I00 +sS'value' +p41857 +S'Version' +p41858 +ssS'editable' +p41859 +(dp41860 +S'editable' +p41861 +I00 +sS'value' +p41862 +I00 +ssS'unique' +p41863 +(dp41864 +S'editable' +p41865 +I00 +sS'value' +p41866 +I00 +ssS'properties' +p41867 +(dp41868 +S'default_value' +p41869 +(dp41870 +S'editable' +p41871 +I00 +sS'value' +p41872 +NssS'summary_default' +p41873 +(dp41874 +S'editable' +p41875 +I01 +sS'value' +p41876 +S'none' +p41877 +ssS'valid_types' +p41878 +(dp41879 +S'editable' +p41880 +I01 +sS'value' +p41881 +(lp41882 +S'HumanUser' +p41883 +aS'ApiUser' +p41884 +asssS'description' +p41885 +(dp41886 +S'editable' +p41887 +I01 +sS'value' +p41888 +g47 +sssS'sg_path_to_movie' +p41889 +(dp41890 +S'mandatory' +p41891 +(dp41892 +S'editable' +p41893 +I00 +sS'value' +p41894 +I00 +ssS'name' +p41895 +(dp41896 +S'editable' +p41897 +I01 +sS'value' +p41898 +S'Path to Movie' +p41899 +ssS'data_type' +p41900 +(dp41901 +S'editable' +p41902 +I00 +sS'value' +p41903 +S'text' +p41904 +ssS'entity_type' +p41905 +(dp41906 +S'editable' +p41907 +I00 +sS'value' +p41908 +S'Version' +p41909 +ssS'editable' +p41910 +(dp41911 +S'editable' +p41912 +I00 +sS'value' +p41913 +I01 +ssS'unique' +p41914 +(dp41915 +S'editable' +p41916 +I00 +sS'value' +p41917 +I00 +ssS'properties' +p41918 +(dp41919 +S'default_value' +p41920 +(dp41921 +S'editable' +p41922 +I00 +sS'value' +p41923 +NssS'summary_default' +p41924 +(dp41925 +S'editable' +p41926 +I01 +sS'value' +p41927 +S'none' +p41928 +sssS'description' +p41929 +(dp41930 +S'editable' +p41931 +I01 +sS'value' +p41932 +S'Location of the movie on your local filesystem (not uploaded). Used for playback of lower resolution movie media stored locally.' +p41933 +sssS'sg_uploaded_movie_webm' +p41934 +(dp41935 +S'mandatory' +p41936 +(dp41937 +S'editable' +p41938 +I00 +sS'value' +p41939 +I00 +ssS'name' +p41940 +(dp41941 +S'editable' +p41942 +I01 +sS'value' +p41943 +S'Uploaded Movie WebM' +p41944 +ssS'data_type' +p41945 +(dp41946 +S'editable' +p41947 +I00 +sS'value' +p41948 +S'url' +p41949 +ssS'entity_type' +p41950 +(dp41951 +S'editable' +p41952 +I00 +sS'value' +p41953 +S'Version' +p41954 +ssS'editable' +p41955 +(dp41956 +S'editable' +p41957 +I00 +sS'value' +p41958 +I01 +ssS'unique' +p41959 +(dp41960 +S'editable' +p41961 +I00 +sS'value' +p41962 +I00 +ssS'properties' +p41963 +(dp41964 +S'default_value' +p41965 +(dp41966 +S'editable' +p41967 +I00 +sS'value' +p41968 +NssS'open_in_new_window' +p41969 +(dp41970 +S'editable' +p41971 +I00 +sS'value' +p41972 +I01 +ssS'summary_default' +p41973 +(dp41974 +S'editable' +p41975 +I00 +sS'value' +p41976 +S'none' +p41977 +sssS'description' +p41978 +(dp41979 +S'editable' +p41980 +I01 +sS'value' +p41981 +g47 +sssS'open_notes' +p41982 +(dp41983 +S'mandatory' +p41984 +(dp41985 +S'editable' +p41986 +I00 +sS'value' +p41987 +I00 +ssS'name' +p41988 +(dp41989 +S'editable' +p41990 +I01 +sS'value' +p41991 +S'Open Notes' +p41992 +ssS'data_type' +p41993 +(dp41994 +S'editable' +p41995 +I00 +sS'value' +p41996 +S'multi_entity' +p41997 +ssS'entity_type' +p41998 +(dp41999 +S'editable' +p42000 +I00 +sS'value' +p42001 +S'Version' +p42002 +ssS'editable' +p42003 +(dp42004 +S'editable' +p42005 +I00 +sS'value' +p42006 +I00 +ssS'unique' +p42007 +(dp42008 +S'editable' +p42009 +I00 +sS'value' +p42010 +I00 +ssS'properties' +p42011 +(dp42012 +S'default_value' +p42013 +(dp42014 +S'editable' +p42015 +I00 +sS'value' +p42016 +NssS'summary_default' +p42017 +(dp42018 +S'editable' +p42019 +I01 +sS'value' +p42020 +S'none' +p42021 +ssS'valid_types' +p42022 +(dp42023 +S'editable' +p42024 +I01 +sS'value' +p42025 +(lp42026 +S'Note' +p42027 +asssS'description' +p42028 +(dp42029 +S'editable' +p42030 +I01 +sS'value' +p42031 +g47 +sssS'tank_published_file' +p42032 +(dp42033 +S'mandatory' +p42034 +(dp42035 +S'editable' +p42036 +I00 +sS'value' +p42037 +I00 +ssS'name' +p42038 +(dp42039 +S'editable' +p42040 +I01 +sS'value' +p42041 +S'Tank Published File' +p42042 +ssS'data_type' +p42043 +(dp42044 +S'editable' +p42045 +I00 +sS'value' +p42046 +S'entity' +p42047 +ssS'entity_type' +p42048 +(dp42049 +S'editable' +p42050 +I00 +sS'value' +p42051 +S'Version' +p42052 +ssS'editable' +p42053 +(dp42054 +S'editable' +p42055 +I00 +sS'value' +p42056 +I01 +ssS'unique' +p42057 +(dp42058 +S'editable' +p42059 +I00 +sS'value' +p42060 +I00 +ssS'properties' +p42061 +(dp42062 +S'default_value' +p42063 +(dp42064 +S'editable' +p42065 +I00 +sS'value' +p42066 +NssS'summary_default' +p42067 +(dp42068 +S'editable' +p42069 +I01 +sS'value' +p42070 +S'none' +p42071 +ssS'valid_types' +p42072 +(dp42073 +S'editable' +p42074 +I01 +sS'value' +p42075 +(lp42076 +S'TankPublishedFile' +p42077 +asssS'description' +p42078 +(dp42079 +S'editable' +p42080 +I01 +sS'value' +p42081 +g47 +sssS'task_template' +p42082 +(dp42083 +S'mandatory' +p42084 +(dp42085 +S'editable' +p42086 +I00 +sS'value' +p42087 +I00 +ssS'name' +p42088 +(dp42089 +S'editable' +p42090 +I01 +sS'value' +p42091 +S'Task Template' +p42092 +ssS'data_type' +p42093 +(dp42094 +S'editable' +p42095 +I00 +sS'value' +p42096 +S'entity' +p42097 +ssS'entity_type' +p42098 +(dp42099 +S'editable' +p42100 +I00 +sS'value' +p42101 +S'Version' +p42102 +ssS'editable' +p42103 +(dp42104 +S'editable' +p42105 +I00 +sS'value' +p42106 +I01 +ssS'unique' +p42107 +(dp42108 +S'editable' +p42109 +I00 +sS'value' +p42110 +I00 +ssS'properties' +p42111 +(dp42112 +S'default_value' +p42113 +(dp42114 +S'editable' +p42115 +I00 +sS'value' +p42116 +NssS'summary_default' +p42117 +(dp42118 +S'editable' +p42119 +I01 +sS'value' +p42120 +S'none' +p42121 +ssS'valid_types' +p42122 +(dp42123 +S'editable' +p42124 +I01 +sS'value' +p42125 +(lp42126 +S'TaskTemplate' +p42127 +asssS'description' +p42128 +(dp42129 +S'editable' +p42130 +I01 +sS'value' +p42131 +g47 +sssS'created_by' +p42132 +(dp42133 +S'mandatory' +p42134 +(dp42135 +S'editable' +p42136 +I00 +sS'value' +p42137 +I00 +ssS'name' +p42138 +(dp42139 +S'editable' +p42140 +I01 +sS'value' +p42141 +S'Created by' +p42142 +ssS'data_type' +p42143 +(dp42144 +S'editable' +p42145 +I00 +sS'value' +p42146 +S'entity' +p42147 +ssS'entity_type' +p42148 +(dp42149 +S'editable' +p42150 +I00 +sS'value' +p42151 +S'Version' +p42152 +ssS'editable' +p42153 +(dp42154 +S'editable' +p42155 +I00 +sS'value' +p42156 +I00 +ssS'unique' +p42157 +(dp42158 +S'editable' +p42159 +I00 +sS'value' +p42160 +I00 +ssS'properties' +p42161 +(dp42162 +S'default_value' +p42163 +(dp42164 +S'editable' +p42165 +I00 +sS'value' +p42166 +NssS'summary_default' +p42167 +(dp42168 +S'editable' +p42169 +I01 +sS'value' +p42170 +S'none' +p42171 +ssS'valid_types' +p42172 +(dp42173 +S'editable' +p42174 +I01 +sS'value' +p42175 +(lp42176 +S'HumanUser' +p42177 +aS'ApiUser' +p42178 +asssS'description' +p42179 +(dp42180 +S'editable' +p42181 +I01 +sS'value' +p42182 +g47 +sssS'id' +p42183 +(dp42184 +S'mandatory' +p42185 +(dp42186 +S'editable' +p42187 +I00 +sS'value' +p42188 +I00 +ssS'name' +p42189 +(dp42190 +S'editable' +p42191 +I01 +sS'value' +p42192 +S'Id' +p42193 +ssS'data_type' +p42194 +(dp42195 +S'editable' +p42196 +I00 +sS'value' +p42197 +S'number' +p42198 +ssS'entity_type' +p42199 +(dp42200 +S'editable' +p42201 +I00 +sS'value' +p42202 +S'Version' +p42203 +ssS'editable' +p42204 +(dp42205 +S'editable' +p42206 +I00 +sS'value' +p42207 +I00 +ssS'unique' +p42208 +(dp42209 +S'editable' +p42210 +I00 +sS'value' +p42211 +I00 +ssS'properties' +p42212 +(dp42213 +S'default_value' +p42214 +(dp42215 +S'editable' +p42216 +I00 +sS'value' +p42217 +NssS'summary_default' +p42218 +(dp42219 +S'editable' +p42220 +I01 +sS'value' +p42221 +S'none' +p42222 +sssS'description' +p42223 +(dp42224 +S'editable' +p42225 +I01 +sS'value' +p42226 +g47 +sssS'sg_status_list' +p42227 +(dp42228 +S'mandatory' +p42229 +(dp42230 +S'editable' +p42231 +I00 +sS'value' +p42232 +I00 +ssS'name' +p42233 +(dp42234 +S'editable' +p42235 +I01 +sS'value' +p42236 +S'Status' +p42237 +ssS'data_type' +p42238 +(dp42239 +S'editable' +p42240 +I00 +sS'value' +p42241 +S'status_list' +p42242 +ssS'entity_type' +p42243 +(dp42244 +S'editable' +p42245 +I00 +sS'value' +p42246 +S'Version' +p42247 +ssS'editable' +p42248 +(dp42249 +S'editable' +p42250 +I00 +sS'value' +p42251 +I01 +ssS'unique' +p42252 +(dp42253 +S'editable' +p42254 +I00 +sS'value' +p42255 +I00 +ssS'properties' +p42256 +(dp42257 +S'default_value' +p42258 +(dp42259 +S'editable' +p42260 +I01 +sS'value' +p42261 +S'rev' +p42262 +ssS'valid_values' +p42263 +(dp42264 +S'editable' +p42265 +I01 +sS'value' +p42266 +(lp42267 +S'na' +p42268 +aS'rev' +p42269 +aS'vwd' +p42270 +assS'summary_default' +p42271 +(dp42272 +S'editable' +p42273 +I01 +sS'value' +p42274 +S'status_list' +p42275 +sssS'description' +p42276 +(dp42277 +S'editable' +p42278 +I01 +sS'value' +p42279 +g47 +sssS'created_at' +p42280 +(dp42281 +S'mandatory' +p42282 +(dp42283 +S'editable' +p42284 +I00 +sS'value' +p42285 +I00 +ssS'name' +p42286 +(dp42287 +S'editable' +p42288 +I01 +sS'value' +p42289 +S'Date Created' +p42290 +ssS'data_type' +p42291 +(dp42292 +S'editable' +p42293 +I00 +sS'value' +p42294 +S'date_time' +p42295 +ssS'entity_type' +p42296 +(dp42297 +S'editable' +p42298 +I00 +sS'value' +p42299 +S'Version' +p42300 +ssS'editable' +p42301 +(dp42302 +S'editable' +p42303 +I00 +sS'value' +p42304 +I00 +ssS'unique' +p42305 +(dp42306 +S'editable' +p42307 +I00 +sS'value' +p42308 +I00 +ssS'properties' +p42309 +(dp42310 +S'default_value' +p42311 +(dp42312 +S'editable' +p42313 +I00 +sS'value' +p42314 +NssS'summary_default' +p42315 +(dp42316 +S'editable' +p42317 +I01 +sS'value' +p42318 +S'none' +p42319 +sssS'description' +p42320 +(dp42321 +S'editable' +p42322 +I01 +sS'value' +p42323 +g47 +sssS'sg_frames_aspect_ratio' +p42324 +(dp42325 +S'mandatory' +p42326 +(dp42327 +S'editable' +p42328 +I00 +sS'value' +p42329 +I00 +ssS'name' +p42330 +(dp42331 +S'editable' +p42332 +I01 +sS'value' +p42333 +S'Frames Aspect Ratio' +p42334 +ssS'data_type' +p42335 +(dp42336 +S'editable' +p42337 +I00 +sS'value' +p42338 +S'float' +p42339 +ssS'entity_type' +p42340 +(dp42341 +S'editable' +p42342 +I00 +sS'value' +p42343 +S'Version' +p42344 +ssS'editable' +p42345 +(dp42346 +S'editable' +p42347 +I00 +sS'value' +p42348 +I01 +ssS'unique' +p42349 +(dp42350 +S'editable' +p42351 +I00 +sS'value' +p42352 +I00 +ssS'properties' +p42353 +(dp42354 +S'default_value' +p42355 +(dp42356 +S'editable' +p42357 +I00 +sS'value' +p42358 +NssS'summary_default' +p42359 +(dp42360 +S'editable' +p42361 +I01 +sS'value' +p42362 +S'none' +p42363 +sssS'description' +p42364 +(dp42365 +S'editable' +p42366 +I01 +sS'value' +p42367 +S'Aspect ratio of the high res frames. Used to format the image correctly for viewing.' +p42368 +sssS'sg_first_frame' +p42369 +(dp42370 +S'mandatory' +p42371 +(dp42372 +S'editable' +p42373 +I00 +sS'value' +p42374 +I00 +ssS'name' +p42375 +(dp42376 +S'editable' +p42377 +I01 +sS'value' +p42378 +S'First Frame' +p42379 +ssS'data_type' +p42380 +(dp42381 +S'editable' +p42382 +I00 +sS'value' +p42383 +S'number' +p42384 +ssS'entity_type' +p42385 +(dp42386 +S'editable' +p42387 +I00 +sS'value' +p42388 +S'Version' +p42389 +ssS'editable' +p42390 +(dp42391 +S'editable' +p42392 +I00 +sS'value' +p42393 +I01 +ssS'unique' +p42394 +(dp42395 +S'editable' +p42396 +I00 +sS'value' +p42397 +I00 +ssS'properties' +p42398 +(dp42399 +S'default_value' +p42400 +(dp42401 +S'editable' +p42402 +I00 +sS'value' +p42403 +NssS'summary_default' +p42404 +(dp42405 +S'editable' +p42406 +I01 +sS'value' +p42407 +S'none' +p42408 +sssS'description' +p42409 +(dp42410 +S'editable' +p42411 +I01 +sS'value' +p42412 +S'The first frame number contained in the Version. Used in playback of the movie or frames to calculate the first frame available in the Version.' +p42413 +sssS'sg_frames_have_slate' +p42414 +(dp42415 +S'mandatory' +p42416 +(dp42417 +S'editable' +p42418 +I00 +sS'value' +p42419 +I00 +ssS'name' +p42420 +(dp42421 +S'editable' +p42422 +I01 +sS'value' +p42423 +S'Frames Have Slate' +p42424 +ssS'data_type' +p42425 +(dp42426 +S'editable' +p42427 +I00 +sS'value' +p42428 +S'checkbox' +p42429 +ssS'entity_type' +p42430 +(dp42431 +S'editable' +p42432 +I00 +sS'value' +p42433 +S'Version' +p42434 +ssS'editable' +p42435 +(dp42436 +S'editable' +p42437 +I00 +sS'value' +p42438 +I01 +ssS'unique' +p42439 +(dp42440 +S'editable' +p42441 +I00 +sS'value' +p42442 +I00 +ssS'properties' +p42443 +(dp42444 +S'default_value' +p42445 +(dp42446 +S'editable' +p42447 +I00 +sS'value' +p42448 +I00 +ssS'summary_default' +p42449 +(dp42450 +S'editable' +p42451 +I01 +sS'value' +p42452 +S'none' +p42453 +sssS'description' +p42454 +(dp42455 +S'editable' +p42456 +I01 +sS'value' +p42457 +S'Indicates whether the frames have a slate or not. This is used to include or omit the slate from playback.' +p42458 +sssS'sg_uploaded_movie_mp4' +p42459 +(dp42460 +S'mandatory' +p42461 +(dp42462 +S'editable' +p42463 +I00 +sS'value' +p42464 +I00 +ssS'name' +p42465 +(dp42466 +S'editable' +p42467 +I01 +sS'value' +p42468 +S'Uploaded Movie MP4' +p42469 +ssS'data_type' +p42470 +(dp42471 +S'editable' +p42472 +I00 +sS'value' +p42473 +S'url' +p42474 +ssS'entity_type' +p42475 +(dp42476 +S'editable' +p42477 +I00 +sS'value' +p42478 +S'Version' +p42479 +ssS'editable' +p42480 +(dp42481 +S'editable' +p42482 +I00 +sS'value' +p42483 +I01 +ssS'unique' +p42484 +(dp42485 +S'editable' +p42486 +I00 +sS'value' +p42487 +I00 +ssS'properties' +p42488 +(dp42489 +S'default_value' +p42490 +(dp42491 +S'editable' +p42492 +I00 +sS'value' +p42493 +NssS'open_in_new_window' +p42494 +(dp42495 +S'editable' +p42496 +I00 +sS'value' +p42497 +I01 +ssS'summary_default' +p42498 +(dp42499 +S'editable' +p42500 +I00 +sS'value' +p42501 +S'none' +p42502 +sssS'description' +p42503 +(dp42504 +S'editable' +p42505 +I01 +sS'value' +p42506 +g47 +sssS'description' +p42507 +(dp42508 +S'mandatory' +p42509 +(dp42510 +S'editable' +p42511 +I00 +sS'value' +p42512 +I00 +ssS'name' +p42513 +(dp42514 +S'editable' +p42515 +I01 +sS'value' +p42516 +S'Description' +p42517 +ssS'data_type' +p42518 +(dp42519 +S'editable' +p42520 +I00 +sS'value' +p42521 +S'text' +p42522 +ssS'entity_type' +p42523 +(dp42524 +S'editable' +p42525 +I00 +sS'value' +p42526 +S'Version' +p42527 +ssS'editable' +p42528 +(dp42529 +S'editable' +p42530 +I00 +sS'value' +p42531 +I01 +ssS'unique' +p42532 +(dp42533 +S'editable' +p42534 +I00 +sS'value' +p42535 +I00 +ssS'properties' +p42536 +(dp42537 +S'default_value' +p42538 +(dp42539 +S'editable' +p42540 +I00 +sS'value' +p42541 +NssS'summary_default' +p42542 +(dp42543 +S'editable' +p42544 +I01 +sS'value' +p42545 +S'none' +p42546 +sssS'description' +p42547 +(dp42548 +S'editable' +p42549 +I01 +sS'value' +p42550 +g47 +sssS'media_center_import_time' +p42551 +(dp42552 +S'mandatory' +p42553 +(dp42554 +S'editable' +p42555 +I00 +sS'value' +p42556 +I00 +ssS'name' +p42557 +(dp42558 +S'editable' +p42559 +I01 +sS'value' +p42560 +S'Media Center Import Time' +p42561 +ssS'data_type' +p42562 +(dp42563 +S'editable' +p42564 +I00 +sS'value' +p42565 +S'date_time' +p42566 +ssS'entity_type' +p42567 +(dp42568 +S'editable' +p42569 +I00 +sS'value' +p42570 +S'Version' +p42571 +ssS'editable' +p42572 +(dp42573 +S'editable' +p42574 +I00 +sS'value' +p42575 +I01 +ssS'unique' +p42576 +(dp42577 +S'editable' +p42578 +I00 +sS'value' +p42579 +I00 +ssS'properties' +p42580 +(dp42581 +S'default_value' +p42582 +(dp42583 +S'editable' +p42584 +I00 +sS'value' +p42585 +NssS'summary_default' +p42586 +(dp42587 +S'editable' +p42588 +I00 +sS'value' +p42589 +S'none' +p42590 +sssS'description' +p42591 +(dp42592 +S'editable' +p42593 +I01 +sS'value' +p42594 +g47 +sssS'viewed_by_current_user_at' +p42595 +(dp42596 +S'mandatory' +p42597 +(dp42598 +S'editable' +p42599 +I00 +sS'value' +p42600 +I00 +ssS'name' +p42601 +(dp42602 +S'editable' +p42603 +I01 +sS'value' +p42604 +S'Date Viewed' +p42605 +ssS'data_type' +p42606 +(dp42607 +S'editable' +p42608 +I00 +sS'value' +p42609 +S'date_time' +p42610 +ssS'entity_type' +p42611 +(dp42612 +S'editable' +p42613 +I00 +sS'value' +p42614 +S'Version' +p42615 +ssS'editable' +p42616 +(dp42617 +S'editable' +p42618 +I00 +sS'value' +p42619 +I00 +ssS'unique' +p42620 +(dp42621 +S'editable' +p42622 +I00 +sS'value' +p42623 +I00 +ssS'properties' +p42624 +(dp42625 +S'default_value' +p42626 +(dp42627 +S'editable' +p42628 +I00 +sS'value' +p42629 +NssS'summary_default' +p42630 +(dp42631 +S'editable' +p42632 +I00 +sS'value' +p42633 +S'none' +p42634 +sssS'description' +p42635 +(dp42636 +S'editable' +p42637 +I01 +sS'value' +p42638 +g47 +sssS'sg_movie_has_slate' +p42639 +(dp42640 +S'mandatory' +p42641 +(dp42642 +S'editable' +p42643 +I00 +sS'value' +p42644 +I00 +ssS'name' +p42645 +(dp42646 +S'editable' +p42647 +I01 +sS'value' +p42648 +S'Movie Has Slate' +p42649 +ssS'data_type' +p42650 +(dp42651 +S'editable' +p42652 +I00 +sS'value' +p42653 +S'checkbox' +p42654 +ssS'entity_type' +p42655 +(dp42656 +S'editable' +p42657 +I00 +sS'value' +p42658 +S'Version' +p42659 +ssS'editable' +p42660 +(dp42661 +S'editable' +p42662 +I00 +sS'value' +p42663 +I01 +ssS'unique' +p42664 +(dp42665 +S'editable' +p42666 +I00 +sS'value' +p42667 +I00 +ssS'properties' +p42668 +(dp42669 +S'default_value' +p42670 +(dp42671 +S'editable' +p42672 +I00 +sS'value' +p42673 +I00 +ssS'summary_default' +p42674 +(dp42675 +S'editable' +p42676 +I01 +sS'value' +p42677 +S'none' +p42678 +sssS'description' +p42679 +(dp42680 +S'editable' +p42681 +I01 +sS'value' +p42682 +S'Indicates whether the movie file has a slate or not. This is used to include or omit the slate from playback.' +p42683 +sssS'sg_uploaded_movie' +p42684 +(dp42685 +S'mandatory' +p42686 +(dp42687 +S'editable' +p42688 +I00 +sS'value' +p42689 +I00 +ssS'name' +p42690 +(dp42691 +S'editable' +p42692 +I01 +sS'value' +p42693 +S'Uploaded Movie' +p42694 +ssS'data_type' +p42695 +(dp42696 +S'editable' +p42697 +I00 +sS'value' +p42698 +S'url' +p42699 +ssS'entity_type' +p42700 +(dp42701 +S'editable' +p42702 +I00 +sS'value' +p42703 +S'Version' +p42704 +ssS'editable' +p42705 +(dp42706 +S'editable' +p42707 +I00 +sS'value' +p42708 +I01 +ssS'unique' +p42709 +(dp42710 +S'editable' +p42711 +I00 +sS'value' +p42712 +I00 +ssS'properties' +p42713 +(dp42714 +S'default_value' +p42715 +(dp42716 +S'editable' +p42717 +I00 +sS'value' +p42718 +NssS'open_in_new_window' +p42719 +(dp42720 +S'editable' +p42721 +I01 +sS'value' +p42722 +I01 +ssS'summary_default' +p42723 +(dp42724 +S'editable' +p42725 +I01 +sS'value' +p42726 +S'none' +p42727 +sssS'description' +p42728 +(dp42729 +S'editable' +p42730 +I01 +sS'value' +p42731 +S'File field to contain the uploaded movie file. Used for playback of lower resolution movie media stored in Shotgun.' +p42732 +sssS'user' +p42733 +(dp42734 +S'mandatory' +p42735 +(dp42736 +S'editable' +p42737 +I00 +sS'value' +p42738 +I00 +ssS'name' +p42739 +(dp42740 +S'editable' +p42741 +I01 +sS'value' +p42742 +S'Artist' +p42743 +ssS'data_type' +p42744 +(dp42745 +S'editable' +p42746 +I00 +sS'value' +p42747 +S'entity' +p42748 +ssS'entity_type' +p42749 +(dp42750 +S'editable' +p42751 +I00 +sS'value' +p42752 +S'Version' +p42753 +ssS'editable' +p42754 +(dp42755 +S'editable' +p42756 +I00 +sS'value' +p42757 +I01 +ssS'unique' +p42758 +(dp42759 +S'editable' +p42760 +I00 +sS'value' +p42761 +I00 +ssS'properties' +p42762 +(dp42763 +S'default_value' +p42764 +(dp42765 +S'editable' +p42766 +I00 +sS'value' +p42767 +NssS'summary_default' +p42768 +(dp42769 +S'editable' +p42770 +I01 +sS'value' +p42771 +S'none' +p42772 +ssS'valid_types' +p42773 +(dp42774 +S'editable' +p42775 +I01 +sS'value' +p42776 +(lp42777 +S'HumanUser' +p42778 +aS'ApiUser' +p42779 +asssS'description' +p42780 +(dp42781 +S'editable' +p42782 +I01 +sS'value' +p42783 +g47 +sssS'entity' +p42784 +(dp42785 +S'mandatory' +p42786 +(dp42787 +S'editable' +p42788 +I00 +sS'value' +p42789 +I00 +ssS'name' +p42790 +(dp42791 +S'editable' +p42792 +I01 +sS'value' +p42793 +S'Link' +p42794 +ssS'data_type' +p42795 +(dp42796 +S'editable' +p42797 +I00 +sS'value' +p42798 +S'entity' +p42799 +ssS'entity_type' +p42800 +(dp42801 +S'editable' +p42802 +I00 +sS'value' +p42803 +S'Version' +p42804 +ssS'editable' +p42805 +(dp42806 +S'editable' +p42807 +I00 +sS'value' +p42808 +I01 +ssS'unique' +p42809 +(dp42810 +S'editable' +p42811 +I00 +sS'value' +p42812 +I00 +ssS'properties' +p42813 +(dp42814 +S'default_value' +p42815 +(dp42816 +S'editable' +p42817 +I00 +sS'value' +p42818 +NssS'summary_default' +p42819 +(dp42820 +S'editable' +p42821 +I01 +sS'value' +p42822 +S'none' +p42823 +ssS'valid_types' +p42824 +(dp42825 +S'editable' +p42826 +I01 +sS'value' +p42827 +(lp42828 +S'Asset' +p42829 +aS'Shot' +p42830 +aS'Sequence' +p42831 +aS'Scene' +p42832 +aS'Project' +p42833 +asssS'description' +p42834 +(dp42835 +S'editable' +p42836 +I01 +sS'value' +p42837 +g47 +sssS'published_files' +p42838 +(dp42839 +S'mandatory' +p42840 +(dp42841 +S'editable' +p42842 +I00 +sS'value' +p42843 +I00 +ssS'name' +p42844 +(dp42845 +S'editable' +p42846 +I01 +sS'value' +p42847 +S'Published Files' +p42848 +ssS'data_type' +p42849 +(dp42850 +S'editable' +p42851 +I00 +sS'value' +p42852 +S'multi_entity' +p42853 +ssS'entity_type' +p42854 +(dp42855 +S'editable' +p42856 +I00 +sS'value' +p42857 +S'Version' +p42858 +ssS'editable' +p42859 +(dp42860 +S'editable' +p42861 +I00 +sS'value' +p42862 +I01 +ssS'unique' +p42863 +(dp42864 +S'editable' +p42865 +I00 +sS'value' +p42866 +I00 +ssS'properties' +p42867 +(dp42868 +S'default_value' +p42869 +(dp42870 +S'editable' +p42871 +I00 +sS'value' +p42872 +NssS'summary_default' +p42873 +(dp42874 +S'editable' +p42875 +I01 +sS'value' +p42876 +S'none' +p42877 +ssS'valid_types' +p42878 +(dp42879 +S'editable' +p42880 +I01 +sS'value' +p42881 +(lp42882 +S'PublishedFile' +p42883 +asssS'description' +p42884 +(dp42885 +S'editable' +p42886 +I01 +sS'value' +p42887 +g47 +sssS'step_0' +p42888 +(dp42889 +S'mandatory' +p42890 +(dp42891 +S'editable' +p42892 +I00 +sS'value' +p42893 +I00 +ssS'name' +p42894 +(dp42895 +S'editable' +p42896 +I01 +sS'value' +p42897 +S'ALL TASKS' +p42898 +ssS'data_type' +p42899 +(dp42900 +S'editable' +p42901 +I00 +sS'value' +p42902 +S'pivot_column' +p42903 +ssS'entity_type' +p42904 +(dp42905 +S'editable' +p42906 +I00 +sS'value' +p42907 +S'Version' +p42908 +ssS'editable' +p42909 +(dp42910 +S'editable' +p42911 +I00 +sS'value' +p42912 +I00 +ssS'unique' +p42913 +(dp42914 +S'editable' +p42915 +I00 +sS'value' +p42916 +I00 +ssS'properties' +p42917 +(dp42918 +S'default_value' +p42919 +(dp42920 +S'editable' +p42921 +I00 +sS'value' +p42922 +NssS'summary_default' +p42923 +(dp42924 +S'editable' +p42925 +I00 +sS'value' +p42926 +S'none' +p42927 +sssS'description' +p42928 +(dp42929 +S'editable' +p42930 +I01 +sS'value' +p42931 +g47 +sssS'sg_last_frame' +p42932 +(dp42933 +S'mandatory' +p42934 +(dp42935 +S'editable' +p42936 +I00 +sS'value' +p42937 +I00 +ssS'name' +p42938 +(dp42939 +S'editable' +p42940 +I01 +sS'value' +p42941 +S'Last Frame' +p42942 +ssS'data_type' +p42943 +(dp42944 +S'editable' +p42945 +I00 +sS'value' +p42946 +S'number' +p42947 +ssS'entity_type' +p42948 +(dp42949 +S'editable' +p42950 +I00 +sS'value' +p42951 +S'Version' +p42952 +ssS'editable' +p42953 +(dp42954 +S'editable' +p42955 +I00 +sS'value' +p42956 +I01 +ssS'unique' +p42957 +(dp42958 +S'editable' +p42959 +I00 +sS'value' +p42960 +I00 +ssS'properties' +p42961 +(dp42962 +S'default_value' +p42963 +(dp42964 +S'editable' +p42965 +I00 +sS'value' +p42966 +NssS'summary_default' +p42967 +(dp42968 +S'editable' +p42969 +I01 +sS'value' +p42970 +S'none' +p42971 +sssS'description' +p42972 +(dp42973 +S'editable' +p42974 +I01 +sS'value' +p42975 +S'The last frame number contained in the Version. Used in playback of the movie or frames to calculate the last frame available in the Version.' +p42976 +sssS'viewed_by_current_user' +p42977 +(dp42978 +S'mandatory' +p42979 +(dp42980 +S'editable' +p42981 +I00 +sS'value' +p42982 +I00 +ssS'name' +p42983 +(dp42984 +S'editable' +p42985 +I01 +sS'value' +p42986 +S'Viewed/Unviewed' +p42987 +ssS'data_type' +p42988 +(dp42989 +S'editable' +p42990 +I00 +sS'value' +p42991 +S'list' +p42992 +ssS'entity_type' +p42993 +(dp42994 +S'editable' +p42995 +I00 +sS'value' +p42996 +S'Version' +p42997 +ssS'editable' +p42998 +(dp42999 +S'editable' +p43000 +I00 +sS'value' +p43001 +I01 +ssS'unique' +p43002 +(dp43003 +S'editable' +p43004 +I00 +sS'value' +p43005 +I00 +ssS'properties' +p43006 +(dp43007 +S'default_value' +p43008 +(dp43009 +S'editable' +p43010 +I00 +sS'value' +p43011 +NssS'valid_values' +p43012 +(dp43013 +S'editable' +p43014 +I00 +sS'value' +p43015 +(lp43016 +S'read' +p43017 +aS'unread' +p43018 +assS'summary_default' +p43019 +(dp43020 +S'editable' +p43021 +I00 +sS'value' +p43022 +S'none' +p43023 +sssS'description' +p43024 +(dp43025 +S'editable' +p43026 +I01 +sS'value' +p43027 +g47 +sssS'sg_uploaded_movie_transcoding_status' +p43028 +(dp43029 +S'mandatory' +p43030 +(dp43031 +S'editable' +p43032 +I00 +sS'value' +p43033 +I00 +ssS'name' +p43034 +(dp43035 +S'editable' +p43036 +I01 +sS'value' +p43037 +S'Uploaded Movie Transcoding Status' +p43038 +ssS'data_type' +p43039 +(dp43040 +S'editable' +p43041 +I00 +sS'value' +p43042 +S'number' +p43043 +ssS'entity_type' +p43044 +(dp43045 +S'editable' +p43046 +I00 +sS'value' +p43047 +S'Version' +p43048 +ssS'editable' +p43049 +(dp43050 +S'editable' +p43051 +I00 +sS'value' +p43052 +I01 +ssS'unique' +p43053 +(dp43054 +S'editable' +p43055 +I00 +sS'value' +p43056 +I00 +ssS'properties' +p43057 +(dp43058 +S'default_value' +p43059 +(dp43060 +S'editable' +p43061 +I00 +sS'value' +p43062 +NssS'summary_default' +p43063 +(dp43064 +S'editable' +p43065 +I00 +sS'value' +p43066 +S'none' +p43067 +sssS'description' +p43068 +(dp43069 +S'editable' +p43070 +I01 +sS'value' +p43071 +g47 +sssS'sg_movie_aspect_ratio' +p43072 +(dp43073 +S'mandatory' +p43074 +(dp43075 +S'editable' +p43076 +I00 +sS'value' +p43077 +I00 +ssS'name' +p43078 +(dp43079 +S'editable' +p43080 +I01 +sS'value' +p43081 +S'Movie Aspect Ratio' +p43082 +ssS'data_type' +p43083 +(dp43084 +S'editable' +p43085 +I00 +sS'value' +p43086 +S'float' +p43087 +ssS'entity_type' +p43088 +(dp43089 +S'editable' +p43090 +I00 +sS'value' +p43091 +S'Version' +p43092 +ssS'editable' +p43093 +(dp43094 +S'editable' +p43095 +I00 +sS'value' +p43096 +I01 +ssS'unique' +p43097 +(dp43098 +S'editable' +p43099 +I00 +sS'value' +p43100 +I00 +ssS'properties' +p43101 +(dp43102 +S'default_value' +p43103 +(dp43104 +S'editable' +p43105 +I00 +sS'value' +p43106 +NssS'summary_default' +p43107 +(dp43108 +S'editable' +p43109 +I01 +sS'value' +p43110 +S'none' +p43111 +sssS'description' +p43112 +(dp43113 +S'editable' +p43114 +I01 +sS'value' +p43115 +S'Aspect ratio of the the movie. Used to format the image correctly for viewing.' +p43116 +sssS'notes' +p43117 +(dp43118 +S'mandatory' +p43119 +(dp43120 +S'editable' +p43121 +I00 +sS'value' +p43122 +I00 +ssS'name' +p43123 +(dp43124 +S'editable' +p43125 +I01 +sS'value' +p43126 +S'Notes' +p43127 +ssS'data_type' +p43128 +(dp43129 +S'editable' +p43130 +I00 +sS'value' +p43131 +S'multi_entity' +p43132 +ssS'entity_type' +p43133 +(dp43134 +S'editable' +p43135 +I00 +sS'value' +p43136 +S'Version' +p43137 +ssS'editable' +p43138 +(dp43139 +S'editable' +p43140 +I00 +sS'value' +p43141 +I01 +ssS'unique' +p43142 +(dp43143 +S'editable' +p43144 +I00 +sS'value' +p43145 +I00 +ssS'properties' +p43146 +(dp43147 +S'default_value' +p43148 +(dp43149 +S'editable' +p43150 +I00 +sS'value' +p43151 +NssS'summary_default' +p43152 +(dp43153 +S'editable' +p43154 +I01 +sS'value' +p43155 +S'none' +p43156 +ssS'valid_types' +p43157 +(dp43158 +S'editable' +p43159 +I01 +sS'value' +p43160 +(lp43161 +S'Note' +p43162 +asssS'description' +p43163 +(dp43164 +S'editable' +p43165 +I01 +sS'value' +p43166 +g47 +sssS'project' +p43167 +(dp43168 +S'mandatory' +p43169 +(dp43170 +S'editable' +p43171 +I00 +sS'value' +p43172 +I00 +ssS'name' +p43173 +(dp43174 +S'editable' +p43175 +I01 +sS'value' +p43176 +S'Project' +p43177 +ssS'data_type' +p43178 +(dp43179 +S'editable' +p43180 +I00 +sS'value' +p43181 +S'entity' +p43182 +ssS'entity_type' +p43183 +(dp43184 +S'editable' +p43185 +I00 +sS'value' +p43186 +S'Version' +p43187 +ssS'editable' +p43188 +(dp43189 +S'editable' +p43190 +I00 +sS'value' +p43191 +I01 +ssS'unique' +p43192 +(dp43193 +S'editable' +p43194 +I00 +sS'value' +p43195 +I00 +ssS'properties' +p43196 +(dp43197 +S'default_value' +p43198 +(dp43199 +S'editable' +p43200 +I00 +sS'value' +p43201 +NssS'summary_default' +p43202 +(dp43203 +S'editable' +p43204 +I01 +sS'value' +p43205 +S'none' +p43206 +ssS'valid_types' +p43207 +(dp43208 +S'editable' +p43209 +I01 +sS'value' +p43210 +(lp43211 +S'Project' +p43212 +asssS'description' +p43213 +(dp43214 +S'editable' +p43215 +I01 +sS'value' +p43216 +g47 +sssS'filmstrip_image' +p43217 +(dp43218 +S'mandatory' +p43219 +(dp43220 +S'editable' +p43221 +I00 +sS'value' +p43222 +I00 +ssS'name' +p43223 +(dp43224 +S'editable' +p43225 +I01 +sS'value' +p43226 +S'Filmstrip Thumbnail' +p43227 +ssS'data_type' +p43228 +(dp43229 +S'editable' +p43230 +I00 +sS'value' +p43231 +S'image' +p43232 +ssS'entity_type' +p43233 +(dp43234 +S'editable' +p43235 +I00 +sS'value' +p43236 +S'Version' +p43237 +ssS'editable' +p43238 +(dp43239 +S'editable' +p43240 +I00 +sS'value' +p43241 +I01 +ssS'unique' +p43242 +(dp43243 +S'editable' +p43244 +I00 +sS'value' +p43245 +I00 +ssS'properties' +p43246 +(dp43247 +S'default_value' +p43248 +(dp43249 +S'editable' +p43250 +I00 +sS'value' +p43251 +NssS'summary_default' +p43252 +(dp43253 +S'editable' +p43254 +I01 +sS'value' +p43255 +S'none' +p43256 +sssS'description' +p43257 +(dp43258 +S'editable' +p43259 +I01 +sS'value' +p43260 +g47 +sssS'tag_list' +p43261 +(dp43262 +S'mandatory' +p43263 +(dp43264 +S'editable' +p43265 +I00 +sS'value' +p43266 +I00 +ssS'name' +p43267 +(dp43268 +S'editable' +p43269 +I01 +sS'value' +p43270 +S'Tags' +p43271 +ssS'data_type' +p43272 +(dp43273 +S'editable' +p43274 +I00 +sS'value' +p43275 +S'tag_list' +p43276 +ssS'entity_type' +p43277 +(dp43278 +S'editable' +p43279 +I00 +sS'value' +p43280 +S'Version' +p43281 +ssS'editable' +p43282 +(dp43283 +S'editable' +p43284 +I00 +sS'value' +p43285 +I01 +ssS'unique' +p43286 +(dp43287 +S'editable' +p43288 +I00 +sS'value' +p43289 +I00 +ssS'properties' +p43290 +(dp43291 +S'default_value' +p43292 +(dp43293 +S'editable' +p43294 +I00 +sS'value' +p43295 +NssS'summary_default' +p43296 +(dp43297 +S'editable' +p43298 +I01 +sS'value' +p43299 +S'none' +p43300 +ssS'valid_types' +p43301 +(dp43302 +S'editable' +p43303 +I01 +sS'value' +p43304 +(lp43305 +S'Tag' +p43306 +asssS'description' +p43307 +(dp43308 +S'editable' +p43309 +I01 +sS'value' +p43310 +g47 +sssS'frame_count' +p43311 +(dp43312 +S'mandatory' +p43313 +(dp43314 +S'editable' +p43315 +I00 +sS'value' +p43316 +I00 +ssS'name' +p43317 +(dp43318 +S'editable' +p43319 +I01 +sS'value' +p43320 +S'Frame Count' +p43321 +ssS'data_type' +p43322 +(dp43323 +S'editable' +p43324 +I00 +sS'value' +p43325 +S'number' +p43326 +ssS'entity_type' +p43327 +(dp43328 +S'editable' +p43329 +I00 +sS'value' +p43330 +S'Version' +p43331 +ssS'editable' +p43332 +(dp43333 +S'editable' +p43334 +I00 +sS'value' +p43335 +I01 +ssS'unique' +p43336 +(dp43337 +S'editable' +p43338 +I00 +sS'value' +p43339 +I00 +ssS'properties' +p43340 +(dp43341 +S'default_value' +p43342 +(dp43343 +S'editable' +p43344 +I00 +sS'value' +p43345 +NssS'summary_default' +p43346 +(dp43347 +S'editable' +p43348 +I01 +sS'value' +p43349 +S'none' +p43350 +sssS'description' +p43351 +(dp43352 +S'editable' +p43353 +I01 +sS'value' +p43354 +g47 +sssS'flagged' +p43355 +(dp43356 +S'mandatory' +p43357 +(dp43358 +S'editable' +p43359 +I00 +sS'value' +p43360 +I00 +ssS'name' +p43361 +(dp43362 +S'editable' +p43363 +I01 +sS'value' +p43364 +S'Flagged' +p43365 +ssS'data_type' +p43366 +(dp43367 +S'editable' +p43368 +I00 +sS'value' +p43369 +S'checkbox' +p43370 +ssS'entity_type' +p43371 +(dp43372 +S'editable' +p43373 +I00 +sS'value' +p43374 +S'Version' +p43375 +ssS'editable' +p43376 +(dp43377 +S'editable' +p43378 +I00 +sS'value' +p43379 +I01 +ssS'unique' +p43380 +(dp43381 +S'editable' +p43382 +I00 +sS'value' +p43383 +I00 +ssS'properties' +p43384 +(dp43385 +S'default_value' +p43386 +(dp43387 +S'editable' +p43388 +I00 +sS'value' +p43389 +I00 +ssS'summary_default' +p43390 +(dp43391 +S'editable' +p43392 +I00 +sS'value' +p43393 +S'none' +p43394 +sssS'description' +p43395 +(dp43396 +S'editable' +p43397 +I01 +sS'value' +p43398 +g47 +ssssS'ElementShotConnection' +p43399 +(dp43400 +S'cached_display_name' +p43401 +(dp43402 +S'mandatory' +p43403 +(dp43404 +S'editable' +p43405 +I00 +sS'value' +p43406 +I00 +ssS'name' +p43407 +(dp43408 +S'editable' +p43409 +I01 +sS'value' +p43410 +S'Cached Display Name' +p43411 +ssS'data_type' +p43412 +(dp43413 +S'editable' +p43414 +I00 +sS'value' +p43415 +S'text' +p43416 +ssS'entity_type' +p43417 +(dp43418 +S'editable' +p43419 +I00 +sS'value' +p43420 +S'ElementShotConnection' +p43421 +ssS'editable' +p43422 +(dp43423 +S'editable' +p43424 +I00 +sS'value' +p43425 +I01 +ssS'unique' +p43426 +(dp43427 +S'editable' +p43428 +I00 +sS'value' +p43429 +I00 +ssS'properties' +p43430 +(dp43431 +S'default_value' +p43432 +(dp43433 +S'editable' +p43434 +I00 +sS'value' +p43435 +NssS'summary_default' +p43436 +(dp43437 +S'editable' +p43438 +I00 +sS'value' +p43439 +S'none' +p43440 +sssS'description' +p43441 +(dp43442 +S'editable' +p43443 +I01 +sS'value' +p43444 +g47 +sssS'shot' +p43445 +(dp43446 +S'mandatory' +p43447 +(dp43448 +S'editable' +p43449 +I00 +sS'value' +p43450 +I00 +ssS'name' +p43451 +(dp43452 +S'editable' +p43453 +I01 +sS'value' +p43454 +S'Shot' +p43455 +ssS'data_type' +p43456 +(dp43457 +S'editable' +p43458 +I00 +sS'value' +p43459 +S'entity' +p43460 +ssS'entity_type' +p43461 +(dp43462 +S'editable' +p43463 +I00 +sS'value' +p43464 +S'ElementShotConnection' +p43465 +ssS'editable' +p43466 +(dp43467 +S'editable' +p43468 +I00 +sS'value' +p43469 +I00 +ssS'unique' +p43470 +(dp43471 +S'editable' +p43472 +I00 +sS'value' +p43473 +I00 +ssS'properties' +p43474 +(dp43475 +S'default_value' +p43476 +(dp43477 +S'editable' +p43478 +I00 +sS'value' +p43479 +NssS'summary_default' +p43480 +(dp43481 +S'editable' +p43482 +I00 +sS'value' +p43483 +S'none' +p43484 +ssS'valid_types' +p43485 +(dp43486 +S'editable' +p43487 +I00 +sS'value' +p43488 +(lp43489 +S'Shot' +p43490 +asssS'description' +p43491 +(dp43492 +S'editable' +p43493 +I01 +sS'value' +p43494 +g47 +sssS'id' +p43495 +(dp43496 +S'mandatory' +p43497 +(dp43498 +S'editable' +p43499 +I00 +sS'value' +p43500 +I01 +ssS'name' +p43501 +(dp43502 +S'editable' +p43503 +I01 +sS'value' +p43504 +S'Id' +p43505 +ssS'data_type' +p43506 +(dp43507 +S'editable' +p43508 +I00 +sS'value' +p43509 +S'number' +p43510 +ssS'entity_type' +p43511 +(dp43512 +S'editable' +p43513 +I00 +sS'value' +p43514 +S'ElementShotConnection' +p43515 +ssS'editable' +p43516 +(dp43517 +S'editable' +p43518 +I00 +sS'value' +p43519 +I00 +ssS'unique' +p43520 +(dp43521 +S'editable' +p43522 +I00 +sS'value' +p43523 +I00 +ssS'properties' +p43524 +(dp43525 +S'default_value' +p43526 +(dp43527 +S'editable' +p43528 +I00 +sS'value' +p43529 +NssS'summary_default' +p43530 +(dp43531 +S'editable' +p43532 +I00 +sS'value' +p43533 +S'none' +p43534 +sssS'description' +p43535 +(dp43536 +S'editable' +p43537 +I01 +sS'value' +p43538 +g47 +sssS'element' +p43539 +(dp43540 +S'mandatory' +p43541 +(dp43542 +S'editable' +p43543 +I00 +sS'value' +p43544 +I00 +ssS'name' +p43545 +(dp43546 +S'editable' +p43547 +I01 +sS'value' +p43548 +S'Element' +p43549 +ssS'data_type' +p43550 +(dp43551 +S'editable' +p43552 +I00 +sS'value' +p43553 +S'entity' +p43554 +ssS'entity_type' +p43555 +(dp43556 +S'editable' +p43557 +I00 +sS'value' +p43558 +S'ElementShotConnection' +p43559 +ssS'editable' +p43560 +(dp43561 +S'editable' +p43562 +I00 +sS'value' +p43563 +I00 +ssS'unique' +p43564 +(dp43565 +S'editable' +p43566 +I00 +sS'value' +p43567 +I00 +ssS'properties' +p43568 +(dp43569 +S'default_value' +p43570 +(dp43571 +S'editable' +p43572 +I00 +sS'value' +p43573 +NssS'summary_default' +p43574 +(dp43575 +S'editable' +p43576 +I00 +sS'value' +p43577 +S'none' +p43578 +ssS'valid_types' +p43579 +(dp43580 +S'editable' +p43581 +I00 +sS'value' +p43582 +(lp43583 +S'Element' +p43584 +asssS'description' +p43585 +(dp43586 +S'editable' +p43587 +I01 +sS'value' +p43588 +g47 +ssssS'HumanUser' +p43589 +(dp43590 +S'file_access' +p43591 +(dp43592 +S'mandatory' +p43593 +(dp43594 +S'editable' +p43595 +I00 +sS'value' +p43596 +I00 +ssS'name' +p43597 +(dp43598 +S'editable' +p43599 +I01 +sS'value' +p43600 +S'File Access' +p43601 +ssS'data_type' +p43602 +(dp43603 +S'editable' +p43604 +I00 +sS'value' +p43605 +S'checkbox' +p43606 +ssS'entity_type' +p43607 +(dp43608 +S'editable' +p43609 +I00 +sS'value' +p43610 +S'HumanUser' +p43611 +ssS'editable' +p43612 +(dp43613 +S'editable' +p43614 +I00 +sS'value' +p43615 +I01 +ssS'unique' +p43616 +(dp43617 +S'editable' +p43618 +I00 +sS'value' +p43619 +I00 +ssS'properties' +p43620 +(dp43621 +S'default_value' +p43622 +(dp43623 +S'editable' +p43624 +I00 +sS'value' +p43625 +I01 +ssS'summary_default' +p43626 +(dp43627 +S'editable' +p43628 +I01 +sS'value' +p43629 +S'none' +p43630 +sssS'description' +p43631 +(dp43632 +S'editable' +p43633 +I01 +sS'value' +p43634 +g47 +sssS'email_all_deliveries' +p43635 +(dp43636 +S'mandatory' +p43637 +(dp43638 +S'editable' +p43639 +I00 +sS'value' +p43640 +I00 +ssS'name' +p43641 +(dp43642 +S'editable' +p43643 +I01 +sS'value' +p43644 +S'Subscribe to All Delivery Emails' +p43645 +ssS'data_type' +p43646 +(dp43647 +S'editable' +p43648 +I00 +sS'value' +p43649 +S'checkbox' +p43650 +ssS'entity_type' +p43651 +(dp43652 +S'editable' +p43653 +I00 +sS'value' +p43654 +S'HumanUser' +p43655 +ssS'editable' +p43656 +(dp43657 +S'editable' +p43658 +I00 +sS'value' +p43659 +I01 +ssS'unique' +p43660 +(dp43661 +S'editable' +p43662 +I00 +sS'value' +p43663 +I00 +ssS'properties' +p43664 +(dp43665 +S'default_value' +p43666 +(dp43667 +S'editable' +p43668 +I00 +sS'value' +p43669 +I00 +ssS'summary_default' +p43670 +(dp43671 +S'editable' +p43672 +I01 +sS'value' +p43673 +S'none' +p43674 +sssS'description' +p43675 +(dp43676 +S'editable' +p43677 +I01 +sS'value' +p43678 +g47 +sssS'email_notes' +p43679 +(dp43680 +S'mandatory' +p43681 +(dp43682 +S'editable' +p43683 +I00 +sS'value' +p43684 +I00 +ssS'name' +p43685 +(dp43686 +S'editable' +p43687 +I01 +sS'value' +p43688 +S'Subscribe to My Notes Emails' +p43689 +ssS'data_type' +p43690 +(dp43691 +S'editable' +p43692 +I00 +sS'value' +p43693 +S'checkbox' +p43694 +ssS'entity_type' +p43695 +(dp43696 +S'editable' +p43697 +I00 +sS'value' +p43698 +S'HumanUser' +p43699 +ssS'editable' +p43700 +(dp43701 +S'editable' +p43702 +I00 +sS'value' +p43703 +I01 +ssS'unique' +p43704 +(dp43705 +S'editable' +p43706 +I00 +sS'value' +p43707 +I00 +ssS'properties' +p43708 +(dp43709 +S'default_value' +p43710 +(dp43711 +S'editable' +p43712 +I00 +sS'value' +p43713 +I00 +ssS'summary_default' +p43714 +(dp43715 +S'editable' +p43716 +I01 +sS'value' +p43717 +S'none' +p43718 +sssS'description' +p43719 +(dp43720 +S'editable' +p43721 +I01 +sS'value' +p43722 +g47 +sssS'image' +p43723 +(dp43724 +S'mandatory' +p43725 +(dp43726 +S'editable' +p43727 +I00 +sS'value' +p43728 +I00 +ssS'name' +p43729 +(dp43730 +S'editable' +p43731 +I01 +sS'value' +p43732 +S'Thumbnail' +p43733 +ssS'data_type' +p43734 +(dp43735 +S'editable' +p43736 +I00 +sS'value' +p43737 +S'image' +p43738 +ssS'entity_type' +p43739 +(dp43740 +S'editable' +p43741 +I00 +sS'value' +p43742 +S'HumanUser' +p43743 +ssS'editable' +p43744 +(dp43745 +S'editable' +p43746 +I00 +sS'value' +p43747 +I01 +ssS'unique' +p43748 +(dp43749 +S'editable' +p43750 +I00 +sS'value' +p43751 +I00 +ssS'properties' +p43752 +(dp43753 +S'default_value' +p43754 +(dp43755 +S'editable' +p43756 +I00 +sS'value' +p43757 +NssS'summary_default' +p43758 +(dp43759 +S'editable' +p43760 +I01 +sS'value' +p43761 +S'none' +p43762 +sssS'description' +p43763 +(dp43764 +S'editable' +p43765 +I01 +sS'value' +p43766 +g47 +sssS'updated_at' +p43767 +(dp43768 +S'mandatory' +p43769 +(dp43770 +S'editable' +p43771 +I00 +sS'value' +p43772 +I00 +ssS'name' +p43773 +(dp43774 +S'editable' +p43775 +I01 +sS'value' +p43776 +S'Date Updated' +p43777 +ssS'data_type' +p43778 +(dp43779 +S'editable' +p43780 +I00 +sS'value' +p43781 +S'date_time' +p43782 +ssS'entity_type' +p43783 +(dp43784 +S'editable' +p43785 +I00 +sS'value' +p43786 +S'HumanUser' +p43787 +ssS'editable' +p43788 +(dp43789 +S'editable' +p43790 +I00 +sS'value' +p43791 +I00 +ssS'unique' +p43792 +(dp43793 +S'editable' +p43794 +I00 +sS'value' +p43795 +I00 +ssS'properties' +p43796 +(dp43797 +S'default_value' +p43798 +(dp43799 +S'editable' +p43800 +I00 +sS'value' +p43801 +NssS'summary_default' +p43802 +(dp43803 +S'editable' +p43804 +I01 +sS'value' +p43805 +S'none' +p43806 +sssS'description' +p43807 +(dp43808 +S'editable' +p43809 +I01 +sS'value' +p43810 +g47 +sssS'password_change_next_login' +p43811 +(dp43812 +S'mandatory' +p43813 +(dp43814 +S'editable' +p43815 +I00 +sS'value' +p43816 +I00 +ssS'name' +p43817 +(dp43818 +S'editable' +p43819 +I01 +sS'value' +p43820 +S'Require a change of password at the next sign in' +p43821 +ssS'data_type' +p43822 +(dp43823 +S'editable' +p43824 +I00 +sS'value' +p43825 +S'checkbox' +p43826 +ssS'entity_type' +p43827 +(dp43828 +S'editable' +p43829 +I00 +sS'value' +p43830 +S'HumanUser' +p43831 +ssS'editable' +p43832 +(dp43833 +S'editable' +p43834 +I00 +sS'value' +p43835 +I01 +ssS'unique' +p43836 +(dp43837 +S'editable' +p43838 +I00 +sS'value' +p43839 +I00 +ssS'properties' +p43840 +(dp43841 +S'default_value' +p43842 +(dp43843 +S'editable' +p43844 +I00 +sS'value' +p43845 +I00 +ssS'summary_default' +p43846 +(dp43847 +S'editable' +p43848 +I00 +sS'value' +p43849 +S'none' +p43850 +sssS'description' +p43851 +(dp43852 +S'editable' +p43853 +I01 +sS'value' +p43854 +g47 +sssS'email_inbox_general' +p43855 +(dp43856 +S'mandatory' +p43857 +(dp43858 +S'editable' +p43859 +I00 +sS'value' +p43860 +I00 +ssS'name' +p43861 +(dp43862 +S'editable' +p43863 +I01 +sS'value' +p43864 +S'Subscribe to My Inbox Update Emails' +p43865 +ssS'data_type' +p43866 +(dp43867 +S'editable' +p43868 +I00 +sS'value' +p43869 +S'checkbox' +p43870 +ssS'entity_type' +p43871 +(dp43872 +S'editable' +p43873 +I00 +sS'value' +p43874 +S'HumanUser' +p43875 +ssS'editable' +p43876 +(dp43877 +S'editable' +p43878 +I00 +sS'value' +p43879 +I01 +ssS'unique' +p43880 +(dp43881 +S'editable' +p43882 +I00 +sS'value' +p43883 +I00 +ssS'properties' +p43884 +(dp43885 +S'default_value' +p43886 +(dp43887 +S'editable' +p43888 +I00 +sS'value' +p43889 +NssS'summary_default' +p43890 +(dp43891 +S'editable' +p43892 +I01 +sS'value' +p43893 +S'none' +p43894 +sssS'description' +p43895 +(dp43896 +S'editable' +p43897 +I01 +sS'value' +p43898 +g47 +sssS'bookings' +p43899 +(dp43900 +S'mandatory' +p43901 +(dp43902 +S'editable' +p43903 +I00 +sS'value' +p43904 +I00 +ssS'name' +p43905 +(dp43906 +S'editable' +p43907 +I01 +sS'value' +p43908 +S'Bookings' +p43909 +ssS'data_type' +p43910 +(dp43911 +S'editable' +p43912 +I00 +sS'value' +p43913 +S'multi_entity' +p43914 +ssS'entity_type' +p43915 +(dp43916 +S'editable' +p43917 +I00 +sS'value' +p43918 +S'HumanUser' +p43919 +ssS'editable' +p43920 +(dp43921 +S'editable' +p43922 +I00 +sS'value' +p43923 +I00 +ssS'unique' +p43924 +(dp43925 +S'editable' +p43926 +I00 +sS'value' +p43927 +I00 +ssS'properties' +p43928 +(dp43929 +S'default_value' +p43930 +(dp43931 +S'editable' +p43932 +I00 +sS'value' +p43933 +NssS'summary_default' +p43934 +(dp43935 +S'editable' +p43936 +I00 +sS'value' +p43937 +S'none' +p43938 +ssS'valid_types' +p43939 +(dp43940 +S'editable' +p43941 +I00 +sS'value' +p43942 +(lp43943 +S'Booking' +p43944 +asssS'description' +p43945 +(dp43946 +S'editable' +p43947 +I01 +sS'value' +p43948 +g47 +sssS'banners' +p43949 +(dp43950 +S'mandatory' +p43951 +(dp43952 +S'editable' +p43953 +I00 +sS'value' +p43954 +I00 +ssS'name' +p43955 +(dp43956 +S'editable' +p43957 +I01 +sS'value' +p43958 +S'Banners' +p43959 +ssS'data_type' +p43960 +(dp43961 +S'editable' +p43962 +I00 +sS'value' +p43963 +S'multi_entity' +p43964 +ssS'entity_type' +p43965 +(dp43966 +S'editable' +p43967 +I00 +sS'value' +p43968 +S'HumanUser' +p43969 +ssS'editable' +p43970 +(dp43971 +S'editable' +p43972 +I00 +sS'value' +p43973 +I01 +ssS'unique' +p43974 +(dp43975 +S'editable' +p43976 +I00 +sS'value' +p43977 +I00 +ssS'properties' +p43978 +(dp43979 +S'default_value' +p43980 +(dp43981 +S'editable' +p43982 +I00 +sS'value' +p43983 +NssS'summary_default' +p43984 +(dp43985 +S'editable' +p43986 +I00 +sS'value' +p43987 +S'none' +p43988 +ssS'valid_types' +p43989 +(dp43990 +S'editable' +p43991 +I00 +sS'value' +p43992 +(lp43993 +S'Banners' +p43994 +asssS'description' +p43995 +(dp43996 +S'editable' +p43997 +I01 +sS'value' +p43998 +g47 +sssS'locked_until' +p43999 +(dp44000 +S'mandatory' +p44001 +(dp44002 +S'editable' +p44003 +I00 +sS'value' +p44004 +I00 +ssS'name' +p44005 +(dp44006 +S'editable' +p44007 +I01 +sS'value' +p44008 +S'Locked Until' +p44009 +ssS'data_type' +p44010 +(dp44011 +S'editable' +p44012 +I00 +sS'value' +p44013 +S'date_time' +p44014 +ssS'entity_type' +p44015 +(dp44016 +S'editable' +p44017 +I00 +sS'value' +p44018 +S'HumanUser' +p44019 +ssS'editable' +p44020 +(dp44021 +S'editable' +p44022 +I00 +sS'value' +p44023 +I01 +ssS'unique' +p44024 +(dp44025 +S'editable' +p44026 +I00 +sS'value' +p44027 +I00 +ssS'properties' +p44028 +(dp44029 +S'default_value' +p44030 +(dp44031 +S'editable' +p44032 +I00 +sS'value' +p44033 +NssS'summary_default' +p44034 +(dp44035 +S'editable' +p44036 +I00 +sS'value' +p44037 +S'none' +p44038 +sssS'description' +p44039 +(dp44040 +S'editable' +p44041 +I01 +sS'value' +p44042 +g47 +sssS'password_proxy' +p44043 +(dp44044 +S'mandatory' +p44045 +(dp44046 +S'editable' +p44047 +I00 +sS'value' +p44048 +I00 +ssS'name' +p44049 +(dp44050 +S'editable' +p44051 +I01 +sS'value' +p44052 +S'Password' +p44053 +ssS'data_type' +p44054 +(dp44055 +S'editable' +p44056 +I00 +sS'value' +p44057 +S'password' +p44058 +ssS'entity_type' +p44059 +(dp44060 +S'editable' +p44061 +I00 +sS'value' +p44062 +S'HumanUser' +p44063 +ssS'editable' +p44064 +(dp44065 +S'editable' +p44066 +I00 +sS'value' +p44067 +I00 +ssS'unique' +p44068 +(dp44069 +S'editable' +p44070 +I00 +sS'value' +p44071 +I00 +ssS'properties' +p44072 +(dp44073 +S'default_value' +p44074 +(dp44075 +S'editable' +p44076 +I00 +sS'value' +p44077 +NssS'summary_default' +p44078 +(dp44079 +S'editable' +p44080 +I01 +sS'value' +p44081 +S'none' +p44082 +sssS'description' +p44083 +(dp44084 +S'editable' +p44085 +I01 +sS'value' +p44086 +g47 +sssS'cached_display_name' +p44087 +(dp44088 +S'mandatory' +p44089 +(dp44090 +S'editable' +p44091 +I00 +sS'value' +p44092 +I00 +ssS'name' +p44093 +(dp44094 +S'editable' +p44095 +I01 +sS'value' +p44096 +S'Cached Display Name' +p44097 +ssS'data_type' +p44098 +(dp44099 +S'editable' +p44100 +I00 +sS'value' +p44101 +S'text' +p44102 +ssS'entity_type' +p44103 +(dp44104 +S'editable' +p44105 +I00 +sS'value' +p44106 +S'HumanUser' +p44107 +ssS'editable' +p44108 +(dp44109 +S'editable' +p44110 +I00 +sS'value' +p44111 +I01 +ssS'unique' +p44112 +(dp44113 +S'editable' +p44114 +I00 +sS'value' +p44115 +I00 +ssS'properties' +p44116 +(dp44117 +S'default_value' +p44118 +(dp44119 +S'editable' +p44120 +I00 +sS'value' +p44121 +NssS'summary_default' +p44122 +(dp44123 +S'editable' +p44124 +I00 +sS'value' +p44125 +S'none' +p44126 +sssS'description' +p44127 +(dp44128 +S'editable' +p44129 +I01 +sS'value' +p44130 +g47 +sssS'id' +p44131 +(dp44132 +S'mandatory' +p44133 +(dp44134 +S'editable' +p44135 +I00 +sS'value' +p44136 +I00 +ssS'name' +p44137 +(dp44138 +S'editable' +p44139 +I01 +sS'value' +p44140 +S'Id' +p44141 +ssS'data_type' +p44142 +(dp44143 +S'editable' +p44144 +I00 +sS'value' +p44145 +S'number' +p44146 +ssS'entity_type' +p44147 +(dp44148 +S'editable' +p44149 +I00 +sS'value' +p44150 +S'HumanUser' +p44151 +ssS'editable' +p44152 +(dp44153 +S'editable' +p44154 +I00 +sS'value' +p44155 +I00 +ssS'unique' +p44156 +(dp44157 +S'editable' +p44158 +I00 +sS'value' +p44159 +I00 +ssS'properties' +p44160 +(dp44161 +S'default_value' +p44162 +(dp44163 +S'editable' +p44164 +I00 +sS'value' +p44165 +NssS'summary_default' +p44166 +(dp44167 +S'editable' +p44168 +I01 +sS'value' +p44169 +S'none' +p44170 +sssS'description' +p44171 +(dp44172 +S'editable' +p44173 +I01 +sS'value' +p44174 +g47 +sssS'email_version_link_cc' +p44175 +(dp44176 +S'mandatory' +p44177 +(dp44178 +S'editable' +p44179 +I00 +sS'value' +p44180 +I00 +ssS'name' +p44181 +(dp44182 +S'editable' +p44183 +I01 +sS'value' +p44184 +S"Subscribe to Version Emails for CC'd Link" +p44185 +ssS'data_type' +p44186 +(dp44187 +S'editable' +p44188 +I00 +sS'value' +p44189 +S'checkbox' +p44190 +ssS'entity_type' +p44191 +(dp44192 +S'editable' +p44193 +I00 +sS'value' +p44194 +S'HumanUser' +p44195 +ssS'editable' +p44196 +(dp44197 +S'editable' +p44198 +I00 +sS'value' +p44199 +I01 +ssS'unique' +p44200 +(dp44201 +S'editable' +p44202 +I00 +sS'value' +p44203 +I00 +ssS'properties' +p44204 +(dp44205 +S'default_value' +p44206 +(dp44207 +S'editable' +p44208 +I00 +sS'value' +p44209 +I00 +ssS'summary_default' +p44210 +(dp44211 +S'editable' +p44212 +I01 +sS'value' +p44213 +S'none' +p44214 +sssS'description' +p44215 +(dp44216 +S'editable' +p44217 +I01 +sS'value' +p44218 +g47 +sssS'home_page' +p44219 +(dp44220 +S'mandatory' +p44221 +(dp44222 +S'editable' +p44223 +I00 +sS'value' +p44224 +I00 +ssS'name' +p44225 +(dp44226 +S'editable' +p44227 +I01 +sS'value' +p44228 +S'Home Page' +p44229 +ssS'data_type' +p44230 +(dp44231 +S'editable' +p44232 +I00 +sS'value' +p44233 +S'list' +p44234 +ssS'entity_type' +p44235 +(dp44236 +S'editable' +p44237 +I00 +sS'value' +p44238 +S'HumanUser' +p44239 +ssS'editable' +p44240 +(dp44241 +S'editable' +p44242 +I00 +sS'value' +p44243 +I01 +ssS'unique' +p44244 +(dp44245 +S'editable' +p44246 +I00 +sS'value' +p44247 +I00 +ssS'properties' +p44248 +(dp44249 +S'default_value' +p44250 +(dp44251 +S'editable' +p44252 +I00 +sS'value' +p44253 +NssS'valid_values' +p44254 +(dp44255 +S'editable' +p44256 +I00 +sS'value' +p44257 +(lp44258 +S'home' +p44259 +aS'inbox' +p44260 +aS'my_tasks' +p44261 +aS'new_user_welcome' +p44262 +assS'summary_default' +p44263 +(dp44264 +S'editable' +p44265 +I00 +sS'value' +p44266 +S'none' +p44267 +sssS'description' +p44268 +(dp44269 +S'editable' +p44270 +I01 +sS'value' +p44271 +g47 +sssS'email_versions' +p44272 +(dp44273 +S'mandatory' +p44274 +(dp44275 +S'editable' +p44276 +I00 +sS'value' +p44277 +I00 +ssS'name' +p44278 +(dp44279 +S'editable' +p44280 +I01 +sS'value' +p44281 +S'Subscribe to My Version Emails' +p44282 +ssS'data_type' +p44283 +(dp44284 +S'editable' +p44285 +I00 +sS'value' +p44286 +S'checkbox' +p44287 +ssS'entity_type' +p44288 +(dp44289 +S'editable' +p44290 +I00 +sS'value' +p44291 +S'HumanUser' +p44292 +ssS'editable' +p44293 +(dp44294 +S'editable' +p44295 +I00 +sS'value' +p44296 +I01 +ssS'unique' +p44297 +(dp44298 +S'editable' +p44299 +I00 +sS'value' +p44300 +I00 +ssS'properties' +p44301 +(dp44302 +S'default_value' +p44303 +(dp44304 +S'editable' +p44305 +I00 +sS'value' +p44306 +I00 +ssS'summary_default' +p44307 +(dp44308 +S'editable' +p44309 +I01 +sS'value' +p44310 +S'none' +p44311 +sssS'description' +p44312 +(dp44313 +S'editable' +p44314 +I01 +sS'value' +p44315 +g47 +sssS'created_by' +p44316 +(dp44317 +S'mandatory' +p44318 +(dp44319 +S'editable' +p44320 +I00 +sS'value' +p44321 +I00 +ssS'name' +p44322 +(dp44323 +S'editable' +p44324 +I01 +sS'value' +p44325 +S'Created by' +p44326 +ssS'data_type' +p44327 +(dp44328 +S'editable' +p44329 +I00 +sS'value' +p44330 +S'entity' +p44331 +ssS'entity_type' +p44332 +(dp44333 +S'editable' +p44334 +I00 +sS'value' +p44335 +S'HumanUser' +p44336 +ssS'editable' +p44337 +(dp44338 +S'editable' +p44339 +I00 +sS'value' +p44340 +I00 +ssS'unique' +p44341 +(dp44342 +S'editable' +p44343 +I00 +sS'value' +p44344 +I00 +ssS'properties' +p44345 +(dp44346 +S'default_value' +p44347 +(dp44348 +S'editable' +p44349 +I00 +sS'value' +p44350 +NssS'summary_default' +p44351 +(dp44352 +S'editable' +p44353 +I01 +sS'value' +p44354 +S'none' +p44355 +ssS'valid_types' +p44356 +(dp44357 +S'editable' +p44358 +I01 +sS'value' +p44359 +(lp44360 +S'HumanUser' +p44361 +aS'ApiUser' +p44362 +asssS'description' +p44363 +(dp44364 +S'editable' +p44365 +I01 +sS'value' +p44366 +g47 +sssS'sg_status_list' +p44367 +(dp44368 +S'mandatory' +p44369 +(dp44370 +S'editable' +p44371 +I00 +sS'value' +p44372 +I00 +ssS'name' +p44373 +(dp44374 +S'editable' +p44375 +I01 +sS'value' +p44376 +S'Status' +p44377 +ssS'data_type' +p44378 +(dp44379 +S'editable' +p44380 +I00 +sS'value' +p44381 +S'status_list' +p44382 +ssS'entity_type' +p44383 +(dp44384 +S'editable' +p44385 +I00 +sS'value' +p44386 +S'HumanUser' +p44387 +ssS'editable' +p44388 +(dp44389 +S'editable' +p44390 +I00 +sS'value' +p44391 +I01 +ssS'unique' +p44392 +(dp44393 +S'editable' +p44394 +I00 +sS'value' +p44395 +I00 +ssS'properties' +p44396 +(dp44397 +S'default_value' +p44398 +(dp44399 +S'editable' +p44400 +I01 +sS'value' +p44401 +S'act' +p44402 +ssS'valid_values' +p44403 +(dp44404 +S'editable' +p44405 +I01 +sS'value' +p44406 +(lp44407 +S'act' +p44408 +aS'dis' +p44409 +assS'summary_default' +p44410 +(dp44411 +S'editable' +p44412 +I01 +sS'value' +p44413 +S'none' +p44414 +sssS'description' +p44415 +(dp44416 +S'editable' +p44417 +I01 +sS'value' +p44418 +g47 +sssS'department' +p44419 +(dp44420 +S'mandatory' +p44421 +(dp44422 +S'editable' +p44423 +I00 +sS'value' +p44424 +I00 +ssS'name' +p44425 +(dp44426 +S'editable' +p44427 +I01 +sS'value' +p44428 +S'Department' +p44429 +ssS'data_type' +p44430 +(dp44431 +S'editable' +p44432 +I00 +sS'value' +p44433 +S'entity' +p44434 +ssS'entity_type' +p44435 +(dp44436 +S'editable' +p44437 +I00 +sS'value' +p44438 +S'HumanUser' +p44439 +ssS'editable' +p44440 +(dp44441 +S'editable' +p44442 +I00 +sS'value' +p44443 +I01 +ssS'unique' +p44444 +(dp44445 +S'editable' +p44446 +I00 +sS'value' +p44447 +I00 +ssS'properties' +p44448 +(dp44449 +S'default_value' +p44450 +(dp44451 +S'editable' +p44452 +I00 +sS'value' +p44453 +NssS'summary_default' +p44454 +(dp44455 +S'editable' +p44456 +I01 +sS'value' +p44457 +S'none' +p44458 +ssS'valid_types' +p44459 +(dp44460 +S'editable' +p44461 +I01 +sS'value' +p44462 +(lp44463 +S'Department' +p44464 +asssS'description' +p44465 +(dp44466 +S'editable' +p44467 +I01 +sS'value' +p44468 +g47 +sssS'email_tickets' +p44469 +(dp44470 +S'mandatory' +p44471 +(dp44472 +S'editable' +p44473 +I00 +sS'value' +p44474 +I00 +ssS'name' +p44475 +(dp44476 +S'editable' +p44477 +I01 +sS'value' +p44478 +S'Subscribe to My Tickets Emails' +p44479 +ssS'data_type' +p44480 +(dp44481 +S'editable' +p44482 +I00 +sS'value' +p44483 +S'checkbox' +p44484 +ssS'entity_type' +p44485 +(dp44486 +S'editable' +p44487 +I00 +sS'value' +p44488 +S'HumanUser' +p44489 +ssS'editable' +p44490 +(dp44491 +S'editable' +p44492 +I00 +sS'value' +p44493 +I01 +ssS'unique' +p44494 +(dp44495 +S'editable' +p44496 +I00 +sS'value' +p44497 +I00 +ssS'properties' +p44498 +(dp44499 +S'default_value' +p44500 +(dp44501 +S'editable' +p44502 +I00 +sS'value' +p44503 +I00 +ssS'summary_default' +p44504 +(dp44505 +S'editable' +p44506 +I01 +sS'value' +p44507 +S'none' +p44508 +sssS'description' +p44509 +(dp44510 +S'editable' +p44511 +I01 +sS'value' +p44512 +g47 +sssS'email' +p44513 +(dp44514 +S'mandatory' +p44515 +(dp44516 +S'editable' +p44517 +I00 +sS'value' +p44518 +I00 +ssS'name' +p44519 +(dp44520 +S'editable' +p44521 +I01 +sS'value' +p44522 +S'Email' +p44523 +ssS'data_type' +p44524 +(dp44525 +S'editable' +p44526 +I00 +sS'value' +p44527 +S'text' +p44528 +ssS'entity_type' +p44529 +(dp44530 +S'editable' +p44531 +I00 +sS'value' +p44532 +S'HumanUser' +p44533 +ssS'editable' +p44534 +(dp44535 +S'editable' +p44536 +I00 +sS'value' +p44537 +I01 +ssS'unique' +p44538 +(dp44539 +S'editable' +p44540 +I00 +sS'value' +p44541 +I00 +ssS'properties' +p44542 +(dp44543 +S'default_value' +p44544 +(dp44545 +S'editable' +p44546 +I00 +sS'value' +p44547 +g47 +ssS'summary_default' +p44548 +(dp44549 +S'editable' +p44550 +I01 +sS'value' +p44551 +S'none' +p44552 +sssS'description' +p44553 +(dp44554 +S'editable' +p44555 +I01 +sS'value' +p44556 +g47 +sssS'pipeline_configurations' +p44557 +(dp44558 +S'mandatory' +p44559 +(dp44560 +S'editable' +p44561 +I00 +sS'value' +p44562 +I00 +ssS'name' +p44563 +(dp44564 +S'editable' +p44565 +I01 +sS'value' +p44566 +S'Pipeline Configurations' +p44567 +ssS'data_type' +p44568 +(dp44569 +S'editable' +p44570 +I00 +sS'value' +p44571 +S'multi_entity' +p44572 +ssS'entity_type' +p44573 +(dp44574 +S'editable' +p44575 +I00 +sS'value' +p44576 +S'HumanUser' +p44577 +ssS'editable' +p44578 +(dp44579 +S'editable' +p44580 +I00 +sS'value' +p44581 +I01 +ssS'unique' +p44582 +(dp44583 +S'editable' +p44584 +I00 +sS'value' +p44585 +I00 +ssS'properties' +p44586 +(dp44587 +S'default_value' +p44588 +(dp44589 +S'editable' +p44590 +I00 +sS'value' +p44591 +NssS'summary_default' +p44592 +(dp44593 +S'editable' +p44594 +I00 +sS'value' +p44595 +S'none' +p44596 +ssS'valid_types' +p44597 +(dp44598 +S'editable' +p44599 +I00 +sS'value' +p44600 +(lp44601 +S'PipelineConfiguration' +p44602 +asssS'description' +p44603 +(dp44604 +S'editable' +p44605 +I01 +sS'value' +p44606 +g47 +sssS'password_strength' +p44607 +(dp44608 +S'mandatory' +p44609 +(dp44610 +S'editable' +p44611 +I00 +sS'value' +p44612 +I00 +ssS'name' +p44613 +(dp44614 +S'editable' +p44615 +I01 +sS'value' +p44616 +S'Password Strength' +p44617 +ssS'data_type' +p44618 +(dp44619 +S'editable' +p44620 +I00 +sS'value' +p44621 +S'float' +p44622 +ssS'entity_type' +p44623 +(dp44624 +S'editable' +p44625 +I00 +sS'value' +p44626 +S'HumanUser' +p44627 +ssS'editable' +p44628 +(dp44629 +S'editable' +p44630 +I00 +sS'value' +p44631 +I01 +ssS'unique' +p44632 +(dp44633 +S'editable' +p44634 +I00 +sS'value' +p44635 +I00 +ssS'properties' +p44636 +(dp44637 +S'default_value' +p44638 +(dp44639 +S'editable' +p44640 +I00 +sS'value' +p44641 +NssS'summary_default' +p44642 +(dp44643 +S'editable' +p44644 +I00 +sS'value' +p44645 +S'none' +p44646 +sssS'description' +p44647 +(dp44648 +S'editable' +p44649 +I01 +sS'value' +p44650 +g47 +sssS'updated_by' +p44651 +(dp44652 +S'mandatory' +p44653 +(dp44654 +S'editable' +p44655 +I00 +sS'value' +p44656 +I00 +ssS'name' +p44657 +(dp44658 +S'editable' +p44659 +I01 +sS'value' +p44660 +S'Updated by' +p44661 +ssS'data_type' +p44662 +(dp44663 +S'editable' +p44664 +I00 +sS'value' +p44665 +S'entity' +p44666 +ssS'entity_type' +p44667 +(dp44668 +S'editable' +p44669 +I00 +sS'value' +p44670 +S'HumanUser' +p44671 +ssS'editable' +p44672 +(dp44673 +S'editable' +p44674 +I00 +sS'value' +p44675 +I00 +ssS'unique' +p44676 +(dp44677 +S'editable' +p44678 +I00 +sS'value' +p44679 +I00 +ssS'properties' +p44680 +(dp44681 +S'default_value' +p44682 +(dp44683 +S'editable' +p44684 +I00 +sS'value' +p44685 +NssS'summary_default' +p44686 +(dp44687 +S'editable' +p44688 +I01 +sS'value' +p44689 +S'none' +p44690 +ssS'valid_types' +p44691 +(dp44692 +S'editable' +p44693 +I01 +sS'value' +p44694 +(lp44695 +S'HumanUser' +p44696 +aS'ApiUser' +p44697 +asssS'description' +p44698 +(dp44699 +S'editable' +p44700 +I01 +sS'value' +p44701 +g47 +sssS'firstname' +p44702 +(dp44703 +S'mandatory' +p44704 +(dp44705 +S'editable' +p44706 +I00 +sS'value' +p44707 +I00 +ssS'name' +p44708 +(dp44709 +S'editable' +p44710 +I01 +sS'value' +p44711 +S'First Name' +p44712 +ssS'data_type' +p44713 +(dp44714 +S'editable' +p44715 +I00 +sS'value' +p44716 +S'text' +p44717 +ssS'entity_type' +p44718 +(dp44719 +S'editable' +p44720 +I00 +sS'value' +p44721 +S'HumanUser' +p44722 +ssS'editable' +p44723 +(dp44724 +S'editable' +p44725 +I00 +sS'value' +p44726 +I01 +ssS'unique' +p44727 +(dp44728 +S'editable' +p44729 +I00 +sS'value' +p44730 +I00 +ssS'properties' +p44731 +(dp44732 +S'default_value' +p44733 +(dp44734 +S'editable' +p44735 +I00 +sS'value' +p44736 +NssS'summary_default' +p44737 +(dp44738 +S'editable' +p44739 +I01 +sS'value' +p44740 +S'none' +p44741 +sssS'description' +p44742 +(dp44743 +S'editable' +p44744 +I01 +sS'value' +p44745 +g47 +sssS'app_welcomes' +p44746 +(dp44747 +S'mandatory' +p44748 +(dp44749 +S'editable' +p44750 +I00 +sS'value' +p44751 +I00 +ssS'name' +p44752 +(dp44753 +S'editable' +p44754 +I01 +sS'value' +p44755 +S'App Welcomes' +p44756 +ssS'data_type' +p44757 +(dp44758 +S'editable' +p44759 +I00 +sS'value' +p44760 +S'multi_entity' +p44761 +ssS'entity_type' +p44762 +(dp44763 +S'editable' +p44764 +I00 +sS'value' +p44765 +S'HumanUser' +p44766 +ssS'editable' +p44767 +(dp44768 +S'editable' +p44769 +I00 +sS'value' +p44770 +I01 +ssS'unique' +p44771 +(dp44772 +S'editable' +p44773 +I00 +sS'value' +p44774 +I00 +ssS'properties' +p44775 +(dp44776 +S'default_value' +p44777 +(dp44778 +S'editable' +p44779 +I00 +sS'value' +p44780 +NssS'summary_default' +p44781 +(dp44782 +S'editable' +p44783 +I00 +sS'value' +p44784 +S'none' +p44785 +ssS'valid_types' +p44786 +(dp44787 +S'editable' +p44788 +I00 +sS'value' +p44789 +(lp44790 +S'AppWelcome' +p44791 +asssS'description' +p44792 +(dp44793 +S'editable' +p44794 +I01 +sS'value' +p44795 +g47 +sssS'lastname' +p44796 +(dp44797 +S'mandatory' +p44798 +(dp44799 +S'editable' +p44800 +I00 +sS'value' +p44801 +I00 +ssS'name' +p44802 +(dp44803 +S'editable' +p44804 +I01 +sS'value' +p44805 +S'Last Name' +p44806 +ssS'data_type' +p44807 +(dp44808 +S'editable' +p44809 +I00 +sS'value' +p44810 +S'text' +p44811 +ssS'entity_type' +p44812 +(dp44813 +S'editable' +p44814 +I00 +sS'value' +p44815 +S'HumanUser' +p44816 +ssS'editable' +p44817 +(dp44818 +S'editable' +p44819 +I00 +sS'value' +p44820 +I01 +ssS'unique' +p44821 +(dp44822 +S'editable' +p44823 +I00 +sS'value' +p44824 +I00 +ssS'properties' +p44825 +(dp44826 +S'default_value' +p44827 +(dp44828 +S'editable' +p44829 +I00 +sS'value' +p44830 +NssS'summary_default' +p44831 +(dp44832 +S'editable' +p44833 +I01 +sS'value' +p44834 +S'none' +p44835 +sssS'description' +p44836 +(dp44837 +S'editable' +p44838 +I01 +sS'value' +p44839 +g47 +sssS'groups' +p44840 +(dp44841 +S'mandatory' +p44842 +(dp44843 +S'editable' +p44844 +I00 +sS'value' +p44845 +I00 +ssS'name' +p44846 +(dp44847 +S'editable' +p44848 +I01 +sS'value' +p44849 +S'Groups' +p44850 +ssS'data_type' +p44851 +(dp44852 +S'editable' +p44853 +I00 +sS'value' +p44854 +S'multi_entity' +p44855 +ssS'entity_type' +p44856 +(dp44857 +S'editable' +p44858 +I00 +sS'value' +p44859 +S'HumanUser' +p44860 +ssS'editable' +p44861 +(dp44862 +S'editable' +p44863 +I00 +sS'value' +p44864 +I01 +ssS'unique' +p44865 +(dp44866 +S'editable' +p44867 +I00 +sS'value' +p44868 +I00 +ssS'properties' +p44869 +(dp44870 +S'default_value' +p44871 +(dp44872 +S'editable' +p44873 +I00 +sS'value' +p44874 +NssS'summary_default' +p44875 +(dp44876 +S'editable' +p44877 +I01 +sS'value' +p44878 +S'none' +p44879 +ssS'valid_types' +p44880 +(dp44881 +S'editable' +p44882 +I01 +sS'value' +p44883 +(lp44884 +S'Group' +p44885 +asssS'description' +p44886 +(dp44887 +S'editable' +p44888 +I01 +sS'value' +p44889 +g47 +sssS'email_all_versions' +p44890 +(dp44891 +S'mandatory' +p44892 +(dp44893 +S'editable' +p44894 +I00 +sS'value' +p44895 +I00 +ssS'name' +p44896 +(dp44897 +S'editable' +p44898 +I01 +sS'value' +p44899 +S'Subscribe to All Version Emails' +p44900 +ssS'data_type' +p44901 +(dp44902 +S'editable' +p44903 +I00 +sS'value' +p44904 +S'checkbox' +p44905 +ssS'entity_type' +p44906 +(dp44907 +S'editable' +p44908 +I00 +sS'value' +p44909 +S'HumanUser' +p44910 +ssS'editable' +p44911 +(dp44912 +S'editable' +p44913 +I00 +sS'value' +p44914 +I01 +ssS'unique' +p44915 +(dp44916 +S'editable' +p44917 +I00 +sS'value' +p44918 +I00 +ssS'properties' +p44919 +(dp44920 +S'default_value' +p44921 +(dp44922 +S'editable' +p44923 +I00 +sS'value' +p44924 +I00 +ssS'summary_default' +p44925 +(dp44926 +S'editable' +p44927 +I01 +sS'value' +p44928 +S'none' +p44929 +sssS'description' +p44930 +(dp44931 +S'editable' +p44932 +I01 +sS'value' +p44933 +g47 +sssS'email_inbox_notes' +p44934 +(dp44935 +S'mandatory' +p44936 +(dp44937 +S'editable' +p44938 +I00 +sS'value' +p44939 +I00 +ssS'name' +p44940 +(dp44941 +S'editable' +p44942 +I01 +sS'value' +p44943 +S'Subscribe to My Inbox Note Emails' +p44944 +ssS'data_type' +p44945 +(dp44946 +S'editable' +p44947 +I00 +sS'value' +p44948 +S'checkbox' +p44949 +ssS'entity_type' +p44950 +(dp44951 +S'editable' +p44952 +I00 +sS'value' +p44953 +S'HumanUser' +p44954 +ssS'editable' +p44955 +(dp44956 +S'editable' +p44957 +I00 +sS'value' +p44958 +I01 +ssS'unique' +p44959 +(dp44960 +S'editable' +p44961 +I00 +sS'value' +p44962 +I00 +ssS'properties' +p44963 +(dp44964 +S'default_value' +p44965 +(dp44966 +S'editable' +p44967 +I00 +sS'value' +p44968 +NssS'summary_default' +p44969 +(dp44970 +S'editable' +p44971 +I01 +sS'value' +p44972 +S'none' +p44973 +sssS'description' +p44974 +(dp44975 +S'editable' +p44976 +I01 +sS'value' +p44977 +g47 +sssS'projects' +p44978 +(dp44979 +S'mandatory' +p44980 +(dp44981 +S'editable' +p44982 +I00 +sS'value' +p44983 +I00 +ssS'name' +p44984 +(dp44985 +S'editable' +p44986 +I01 +sS'value' +p44987 +S'Projects' +p44988 +ssS'data_type' +p44989 +(dp44990 +S'editable' +p44991 +I00 +sS'value' +p44992 +S'multi_entity' +p44993 +ssS'entity_type' +p44994 +(dp44995 +S'editable' +p44996 +I00 +sS'value' +p44997 +S'HumanUser' +p44998 +ssS'editable' +p44999 +(dp45000 +S'editable' +p45001 +I00 +sS'value' +p45002 +I01 +ssS'unique' +p45003 +(dp45004 +S'editable' +p45005 +I00 +sS'value' +p45006 +I00 +ssS'properties' +p45007 +(dp45008 +S'default_value' +p45009 +(dp45010 +S'editable' +p45011 +I00 +sS'value' +p45012 +NssS'summary_default' +p45013 +(dp45014 +S'editable' +p45015 +I01 +sS'value' +p45016 +S'none' +p45017 +ssS'valid_types' +p45018 +(dp45019 +S'editable' +p45020 +I01 +sS'value' +p45021 +(lp45022 +S'Project' +p45023 +asssS'description' +p45024 +(dp45025 +S'editable' +p45026 +I01 +sS'value' +p45027 +g47 +sssS'enable_tank_integration' +p45028 +(dp45029 +S'mandatory' +p45030 +(dp45031 +S'editable' +p45032 +I00 +sS'value' +p45033 +I00 +ssS'name' +p45034 +(dp45035 +S'editable' +p45036 +I01 +sS'value' +p45037 +S'Enable Tank Integration' +p45038 +ssS'data_type' +p45039 +(dp45040 +S'editable' +p45041 +I00 +sS'value' +p45042 +S'checkbox' +p45043 +ssS'entity_type' +p45044 +(dp45045 +S'editable' +p45046 +I00 +sS'value' +p45047 +S'HumanUser' +p45048 +ssS'editable' +p45049 +(dp45050 +S'editable' +p45051 +I00 +sS'value' +p45052 +I01 +ssS'unique' +p45053 +(dp45054 +S'editable' +p45055 +I00 +sS'value' +p45056 +I00 +ssS'properties' +p45057 +(dp45058 +S'default_value' +p45059 +(dp45060 +S'editable' +p45061 +I00 +sS'value' +p45062 +I01 +ssS'summary_default' +p45063 +(dp45064 +S'editable' +p45065 +I01 +sS'value' +p45066 +S'none' +p45067 +sssS'description' +p45068 +(dp45069 +S'editable' +p45070 +I01 +sS'value' +p45071 +g47 +sssS'email_deliveries' +p45072 +(dp45073 +S'mandatory' +p45074 +(dp45075 +S'editable' +p45076 +I00 +sS'value' +p45077 +I00 +ssS'name' +p45078 +(dp45079 +S'editable' +p45080 +I01 +sS'value' +p45081 +S'Subscribe to My Deliveries Emails' +p45082 +ssS'data_type' +p45083 +(dp45084 +S'editable' +p45085 +I00 +sS'value' +p45086 +S'checkbox' +p45087 +ssS'entity_type' +p45088 +(dp45089 +S'editable' +p45090 +I00 +sS'value' +p45091 +S'HumanUser' +p45092 +ssS'editable' +p45093 +(dp45094 +S'editable' +p45095 +I00 +sS'value' +p45096 +I01 +ssS'unique' +p45097 +(dp45098 +S'editable' +p45099 +I00 +sS'value' +p45100 +I00 +ssS'properties' +p45101 +(dp45102 +S'default_value' +p45103 +(dp45104 +S'editable' +p45105 +I00 +sS'value' +p45106 +I00 +ssS'summary_default' +p45107 +(dp45108 +S'editable' +p45109 +I01 +sS'value' +p45110 +S'none' +p45111 +sssS'description' +p45112 +(dp45113 +S'editable' +p45114 +I01 +sS'value' +p45115 +g47 +sssS'name' +p45116 +(dp45117 +S'mandatory' +p45118 +(dp45119 +S'editable' +p45120 +I00 +sS'value' +p45121 +I01 +ssS'name' +p45122 +(dp45123 +S'editable' +p45124 +I01 +sS'value' +p45125 +S'Name' +p45126 +ssS'data_type' +p45127 +(dp45128 +S'editable' +p45129 +I00 +sS'value' +p45130 +S'text' +p45131 +ssS'entity_type' +p45132 +(dp45133 +S'editable' +p45134 +I00 +sS'value' +p45135 +S'HumanUser' +p45136 +ssS'editable' +p45137 +(dp45138 +S'editable' +p45139 +I00 +sS'value' +p45140 +I01 +ssS'unique' +p45141 +(dp45142 +S'editable' +p45143 +I00 +sS'value' +p45144 +I00 +ssS'properties' +p45145 +(dp45146 +S'default_value' +p45147 +(dp45148 +S'editable' +p45149 +I00 +sS'value' +p45150 +NssS'summary_default' +p45151 +(dp45152 +S'editable' +p45153 +I01 +sS'value' +p45154 +S'none' +p45155 +sssS'description' +p45156 +(dp45157 +S'editable' +p45158 +I01 +sS'value' +p45159 +g47 +sssS'tag_list' +p45160 +(dp45161 +S'mandatory' +p45162 +(dp45163 +S'editable' +p45164 +I00 +sS'value' +p45165 +I00 +ssS'name' +p45166 +(dp45167 +S'editable' +p45168 +I01 +sS'value' +p45169 +S'Tags' +p45170 +ssS'data_type' +p45171 +(dp45172 +S'editable' +p45173 +I00 +sS'value' +p45174 +S'tag_list' +p45175 +ssS'entity_type' +p45176 +(dp45177 +S'editable' +p45178 +I00 +sS'value' +p45179 +S'HumanUser' +p45180 +ssS'editable' +p45181 +(dp45182 +S'editable' +p45183 +I00 +sS'value' +p45184 +I01 +ssS'unique' +p45185 +(dp45186 +S'editable' +p45187 +I00 +sS'value' +p45188 +I00 +ssS'properties' +p45189 +(dp45190 +S'default_value' +p45191 +(dp45192 +S'editable' +p45193 +I00 +sS'value' +p45194 +NssS'summary_default' +p45195 +(dp45196 +S'editable' +p45197 +I01 +sS'value' +p45198 +S'none' +p45199 +ssS'valid_types' +p45200 +(dp45201 +S'editable' +p45202 +I01 +sS'value' +p45203 +(lp45204 +S'Tag' +p45205 +asssS'description' +p45206 +(dp45207 +S'editable' +p45208 +I01 +sS'value' +p45209 +g47 +sssS'created_at' +p45210 +(dp45211 +S'mandatory' +p45212 +(dp45213 +S'editable' +p45214 +I00 +sS'value' +p45215 +I00 +ssS'name' +p45216 +(dp45217 +S'editable' +p45218 +I01 +sS'value' +p45219 +S'Date Created' +p45220 +ssS'data_type' +p45221 +(dp45222 +S'editable' +p45223 +I00 +sS'value' +p45224 +S'date_time' +p45225 +ssS'entity_type' +p45226 +(dp45227 +S'editable' +p45228 +I00 +sS'value' +p45229 +S'HumanUser' +p45230 +ssS'editable' +p45231 +(dp45232 +S'editable' +p45233 +I00 +sS'value' +p45234 +I00 +ssS'unique' +p45235 +(dp45236 +S'editable' +p45237 +I00 +sS'value' +p45238 +I00 +ssS'properties' +p45239 +(dp45240 +S'default_value' +p45241 +(dp45242 +S'editable' +p45243 +I00 +sS'value' +p45244 +NssS'summary_default' +p45245 +(dp45246 +S'editable' +p45247 +I01 +sS'value' +p45248 +S'none' +p45249 +sssS'description' +p45250 +(dp45251 +S'editable' +p45252 +I01 +sS'value' +p45253 +g47 +sssS'permission_rule_set' +p45254 +(dp45255 +S'mandatory' +p45256 +(dp45257 +S'editable' +p45258 +I00 +sS'value' +p45259 +I00 +ssS'name' +p45260 +(dp45261 +S'editable' +p45262 +I01 +sS'value' +p45263 +S'Permission Group' +p45264 +ssS'data_type' +p45265 +(dp45266 +S'editable' +p45267 +I00 +sS'value' +p45268 +S'entity' +p45269 +ssS'entity_type' +p45270 +(dp45271 +S'editable' +p45272 +I00 +sS'value' +p45273 +S'HumanUser' +p45274 +ssS'editable' +p45275 +(dp45276 +S'editable' +p45277 +I00 +sS'value' +p45278 +I00 +ssS'unique' +p45279 +(dp45280 +S'editable' +p45281 +I00 +sS'value' +p45282 +I00 +ssS'properties' +p45283 +(dp45284 +S'default_value' +p45285 +(dp45286 +S'editable' +p45287 +I00 +sS'value' +p45288 +NssS'summary_default' +p45289 +(dp45290 +S'editable' +p45291 +I01 +sS'value' +p45292 +S'none' +p45293 +ssS'valid_types' +p45294 +(dp45295 +S'editable' +p45296 +I01 +sS'value' +p45297 +(lp45298 +S'PermissionRuleSet' +p45299 +asssS'description' +p45300 +(dp45301 +S'editable' +p45302 +I01 +sS'value' +p45303 +g47 +sssS'filmstrip_image' +p45304 +(dp45305 +S'mandatory' +p45306 +(dp45307 +S'editable' +p45308 +I00 +sS'value' +p45309 +I00 +ssS'name' +p45310 +(dp45311 +S'editable' +p45312 +I01 +sS'value' +p45313 +S'Filmstrip Thumbnail' +p45314 +ssS'data_type' +p45315 +(dp45316 +S'editable' +p45317 +I00 +sS'value' +p45318 +S'image' +p45319 +ssS'entity_type' +p45320 +(dp45321 +S'editable' +p45322 +I00 +sS'value' +p45323 +S'HumanUser' +p45324 +ssS'editable' +p45325 +(dp45326 +S'editable' +p45327 +I00 +sS'value' +p45328 +I01 +ssS'unique' +p45329 +(dp45330 +S'editable' +p45331 +I00 +sS'value' +p45332 +I00 +ssS'properties' +p45333 +(dp45334 +S'default_value' +p45335 +(dp45336 +S'editable' +p45337 +I00 +sS'value' +p45338 +NssS'summary_default' +p45339 +(dp45340 +S'editable' +p45341 +I01 +sS'value' +p45342 +S'none' +p45343 +sssS'description' +p45344 +(dp45345 +S'editable' +p45346 +I01 +sS'value' +p45347 +g47 +sssS'email_all_notes' +p45348 +(dp45349 +S'mandatory' +p45350 +(dp45351 +S'editable' +p45352 +I00 +sS'value' +p45353 +I00 +ssS'name' +p45354 +(dp45355 +S'editable' +p45356 +I01 +sS'value' +p45357 +S'Subscribe to All Note Emails' +p45358 +ssS'data_type' +p45359 +(dp45360 +S'editable' +p45361 +I00 +sS'value' +p45362 +S'checkbox' +p45363 +ssS'entity_type' +p45364 +(dp45365 +S'editable' +p45366 +I00 +sS'value' +p45367 +S'HumanUser' +p45368 +ssS'editable' +p45369 +(dp45370 +S'editable' +p45371 +I00 +sS'value' +p45372 +I01 +ssS'unique' +p45373 +(dp45374 +S'editable' +p45375 +I00 +sS'value' +p45376 +I00 +ssS'properties' +p45377 +(dp45378 +S'default_value' +p45379 +(dp45380 +S'editable' +p45381 +I00 +sS'value' +p45382 +I00 +ssS'summary_default' +p45383 +(dp45384 +S'editable' +p45385 +I01 +sS'value' +p45386 +S'none' +p45387 +sssS'description' +p45388 +(dp45389 +S'editable' +p45390 +I01 +sS'value' +p45391 +g47 +sssS'email_tasks' +p45392 +(dp45393 +S'mandatory' +p45394 +(dp45395 +S'editable' +p45396 +I00 +sS'value' +p45397 +I00 +ssS'name' +p45398 +(dp45399 +S'editable' +p45400 +I01 +sS'value' +p45401 +S'Subscribe to My Task Emails' +p45402 +ssS'data_type' +p45403 +(dp45404 +S'editable' +p45405 +I00 +sS'value' +p45406 +S'checkbox' +p45407 +ssS'entity_type' +p45408 +(dp45409 +S'editable' +p45410 +I00 +sS'value' +p45411 +S'HumanUser' +p45412 +ssS'editable' +p45413 +(dp45414 +S'editable' +p45415 +I00 +sS'value' +p45416 +I01 +ssS'unique' +p45417 +(dp45418 +S'editable' +p45419 +I00 +sS'value' +p45420 +I00 +ssS'properties' +p45421 +(dp45422 +S'default_value' +p45423 +(dp45424 +S'editable' +p45425 +I00 +sS'value' +p45426 +I00 +ssS'summary_default' +p45427 +(dp45428 +S'editable' +p45429 +I00 +sS'value' +p45430 +S'none' +p45431 +sssS'description' +p45432 +(dp45433 +S'editable' +p45434 +I01 +sS'value' +p45435 +g47 +sssS'login' +p45436 +(dp45437 +S'mandatory' +p45438 +(dp45439 +S'editable' +p45440 +I00 +sS'value' +p45441 +I00 +ssS'name' +p45442 +(dp45443 +S'editable' +p45444 +I01 +sS'value' +p45445 +S'Login' +p45446 +ssS'data_type' +p45447 +(dp45448 +S'editable' +p45449 +I00 +sS'value' +p45450 +S'text' +p45451 +ssS'entity_type' +p45452 +(dp45453 +S'editable' +p45454 +I00 +sS'value' +p45455 +S'HumanUser' +p45456 +ssS'editable' +p45457 +(dp45458 +S'editable' +p45459 +I00 +sS'value' +p45460 +I01 +ssS'unique' +p45461 +(dp45462 +S'editable' +p45463 +I00 +sS'value' +p45464 +I01 +ssS'properties' +p45465 +(dp45466 +S'default_value' +p45467 +(dp45468 +S'editable' +p45469 +I00 +sS'value' +p45470 +g47 +ssS'summary_default' +p45471 +(dp45472 +S'editable' +p45473 +I01 +sS'value' +p45474 +S'none' +p45475 +sssS'description' +p45476 +(dp45477 +S'editable' +p45478 +I01 +sS'value' +p45479 +g47 +sssS'email_all_tickets' +p45480 +(dp45481 +S'mandatory' +p45482 +(dp45483 +S'editable' +p45484 +I00 +sS'value' +p45485 +I00 +ssS'name' +p45486 +(dp45487 +S'editable' +p45488 +I01 +sS'value' +p45489 +S'Subscribe to All Ticket Emails' +p45490 +ssS'data_type' +p45491 +(dp45492 +S'editable' +p45493 +I00 +sS'value' +p45494 +S'checkbox' +p45495 +ssS'entity_type' +p45496 +(dp45497 +S'editable' +p45498 +I00 +sS'value' +p45499 +S'HumanUser' +p45500 +ssS'editable' +p45501 +(dp45502 +S'editable' +p45503 +I00 +sS'value' +p45504 +I01 +ssS'unique' +p45505 +(dp45506 +S'editable' +p45507 +I00 +sS'value' +p45508 +I00 +ssS'properties' +p45509 +(dp45510 +S'default_value' +p45511 +(dp45512 +S'editable' +p45513 +I00 +sS'value' +p45514 +I00 +ssS'summary_default' +p45515 +(dp45516 +S'editable' +p45517 +I01 +sS'value' +p45518 +S'none' +p45519 +sssS'description' +p45520 +(dp45521 +S'editable' +p45522 +I01 +sS'value' +p45523 +g47 +sssS'email_all_tasks' +p45524 +(dp45525 +S'mandatory' +p45526 +(dp45527 +S'editable' +p45528 +I00 +sS'value' +p45529 +I00 +ssS'name' +p45530 +(dp45531 +S'editable' +p45532 +I01 +sS'value' +p45533 +S'Subscribe to All Task Emails' +p45534 +ssS'data_type' +p45535 +(dp45536 +S'editable' +p45537 +I00 +sS'value' +p45538 +S'checkbox' +p45539 +ssS'entity_type' +p45540 +(dp45541 +S'editable' +p45542 +I00 +sS'value' +p45543 +S'HumanUser' +p45544 +ssS'editable' +p45545 +(dp45546 +S'editable' +p45547 +I00 +sS'value' +p45548 +I01 +ssS'unique' +p45549 +(dp45550 +S'editable' +p45551 +I00 +sS'value' +p45552 +I00 +ssS'properties' +p45553 +(dp45554 +S'default_value' +p45555 +(dp45556 +S'editable' +p45557 +I00 +sS'value' +p45558 +I00 +ssS'summary_default' +p45559 +(dp45560 +S'editable' +p45561 +I00 +sS'value' +p45562 +S'none' +p45563 +sssS'description' +p45564 +(dp45565 +S'editable' +p45566 +I01 +sS'value' +p45567 +g47 +ssssS'PermissionRuleSet' +p45568 +(dp45569 +S'code' +p45570 +(dp45571 +S'mandatory' +p45572 +(dp45573 +S'editable' +p45574 +I00 +sS'value' +p45575 +I00 +ssS'name' +p45576 +(dp45577 +S'editable' +p45578 +I01 +sS'value' +p45579 +S'Code' +p45580 +ssS'data_type' +p45581 +(dp45582 +S'editable' +p45583 +I00 +sS'value' +p45584 +S'text' +p45585 +ssS'entity_type' +p45586 +(dp45587 +S'editable' +p45588 +I00 +sS'value' +p45589 +S'PermissionRuleSet' +p45590 +ssS'editable' +p45591 +(dp45592 +S'editable' +p45593 +I00 +sS'value' +p45594 +I00 +ssS'unique' +p45595 +(dp45596 +S'editable' +p45597 +I00 +sS'value' +p45598 +I00 +ssS'properties' +p45599 +(dp45600 +S'default_value' +p45601 +(dp45602 +S'editable' +p45603 +I00 +sS'value' +p45604 +NssS'summary_default' +p45605 +(dp45606 +S'editable' +p45607 +I01 +sS'value' +p45608 +S'none' +p45609 +sssS'description' +p45610 +(dp45611 +S'editable' +p45612 +I01 +sS'value' +p45613 +g47 +sssS'display_name' +p45614 +(dp45615 +S'mandatory' +p45616 +(dp45617 +S'editable' +p45618 +I00 +sS'value' +p45619 +I00 +ssS'name' +p45620 +(dp45621 +S'editable' +p45622 +I01 +sS'value' +p45623 +S'Display Name' +p45624 +ssS'data_type' +p45625 +(dp45626 +S'editable' +p45627 +I00 +sS'value' +p45628 +S'text' +p45629 +ssS'entity_type' +p45630 +(dp45631 +S'editable' +p45632 +I00 +sS'value' +p45633 +S'PermissionRuleSet' +p45634 +ssS'editable' +p45635 +(dp45636 +S'editable' +p45637 +I00 +sS'value' +p45638 +I00 +ssS'unique' +p45639 +(dp45640 +S'editable' +p45641 +I00 +sS'value' +p45642 +I00 +ssS'properties' +p45643 +(dp45644 +S'default_value' +p45645 +(dp45646 +S'editable' +p45647 +I00 +sS'value' +p45648 +NssS'summary_default' +p45649 +(dp45650 +S'editable' +p45651 +I01 +sS'value' +p45652 +S'none' +p45653 +sssS'description' +p45654 +(dp45655 +S'editable' +p45656 +I01 +sS'value' +p45657 +g47 +sssS'entity_type' +p45658 +(dp45659 +S'mandatory' +p45660 +(dp45661 +S'editable' +p45662 +I00 +sS'value' +p45663 +I00 +ssS'name' +p45664 +(dp45665 +S'editable' +p45666 +I01 +sS'value' +p45667 +S'Entity Type' +p45668 +ssS'data_type' +p45669 +(dp45670 +S'editable' +p45671 +I00 +sS'value' +p45672 +S'entity_type' +p45673 +ssS'entity_type' +p45674 +(dp45675 +S'editable' +p45676 +I00 +sS'value' +p45677 +S'PermissionRuleSet' +p45678 +ssS'editable' +p45679 +(dp45680 +S'editable' +p45681 +I00 +sS'value' +p45682 +I00 +ssS'unique' +p45683 +(dp45684 +S'editable' +p45685 +I00 +sS'value' +p45686 +I00 +ssS'properties' +p45687 +(dp45688 +S'default_value' +p45689 +(dp45690 +S'editable' +p45691 +I00 +sS'value' +p45692 +NssS'summary_default' +p45693 +(dp45694 +S'editable' +p45695 +I01 +sS'value' +p45696 +S'none' +p45697 +sssS'description' +p45698 +(dp45699 +S'editable' +p45700 +I01 +sS'value' +p45701 +g47 +sssS'parent_set' +p45702 +(dp45703 +S'mandatory' +p45704 +(dp45705 +S'editable' +p45706 +I00 +sS'value' +p45707 +I00 +ssS'name' +p45708 +(dp45709 +S'editable' +p45710 +I01 +sS'value' +p45711 +S'Parent Permission Role' +p45712 +ssS'data_type' +p45713 +(dp45714 +S'editable' +p45715 +I00 +sS'value' +p45716 +S'entity' +p45717 +ssS'entity_type' +p45718 +(dp45719 +S'editable' +p45720 +I00 +sS'value' +p45721 +S'PermissionRuleSet' +p45722 +ssS'editable' +p45723 +(dp45724 +S'editable' +p45725 +I00 +sS'value' +p45726 +I00 +ssS'unique' +p45727 +(dp45728 +S'editable' +p45729 +I00 +sS'value' +p45730 +I00 +ssS'properties' +p45731 +(dp45732 +S'default_value' +p45733 +(dp45734 +S'editable' +p45735 +I00 +sS'value' +p45736 +NssS'summary_default' +p45737 +(dp45738 +S'editable' +p45739 +I01 +sS'value' +p45740 +S'none' +p45741 +ssS'valid_types' +p45742 +(dp45743 +S'editable' +p45744 +I01 +sS'value' +p45745 +(lp45746 +S'PermissionRuleSet' +p45747 +asssS'description' +p45748 +(dp45749 +S'editable' +p45750 +I01 +sS'value' +p45751 +g47 +sssS'cached_display_name' +p45752 +(dp45753 +S'mandatory' +p45754 +(dp45755 +S'editable' +p45756 +I00 +sS'value' +p45757 +I00 +ssS'name' +p45758 +(dp45759 +S'editable' +p45760 +I01 +sS'value' +p45761 +S'Cached Display Name' +p45762 +ssS'data_type' +p45763 +(dp45764 +S'editable' +p45765 +I00 +sS'value' +p45766 +S'text' +p45767 +ssS'entity_type' +p45768 +(dp45769 +S'editable' +p45770 +I00 +sS'value' +p45771 +S'PermissionRuleSet' +p45772 +ssS'editable' +p45773 +(dp45774 +S'editable' +p45775 +I00 +sS'value' +p45776 +I00 +ssS'unique' +p45777 +(dp45778 +S'editable' +p45779 +I00 +sS'value' +p45780 +I00 +ssS'properties' +p45781 +(dp45782 +S'default_value' +p45783 +(dp45784 +S'editable' +p45785 +I00 +sS'value' +p45786 +NssS'summary_default' +p45787 +(dp45788 +S'editable' +p45789 +I00 +sS'value' +p45790 +S'none' +p45791 +sssS'description' +p45792 +(dp45793 +S'editable' +p45794 +I01 +sS'value' +p45795 +g47 +sssS'id' +p45796 +(dp45797 +S'mandatory' +p45798 +(dp45799 +S'editable' +p45800 +I00 +sS'value' +p45801 +I00 +ssS'name' +p45802 +(dp45803 +S'editable' +p45804 +I01 +sS'value' +p45805 +S'ID' +p45806 +ssS'data_type' +p45807 +(dp45808 +S'editable' +p45809 +I00 +sS'value' +p45810 +S'number' +p45811 +ssS'entity_type' +p45812 +(dp45813 +S'editable' +p45814 +I00 +sS'value' +p45815 +S'PermissionRuleSet' +p45816 +ssS'editable' +p45817 +(dp45818 +S'editable' +p45819 +I00 +sS'value' +p45820 +I00 +ssS'unique' +p45821 +(dp45822 +S'editable' +p45823 +I00 +sS'value' +p45824 +I00 +ssS'properties' +p45825 +(dp45826 +S'default_value' +p45827 +(dp45828 +S'editable' +p45829 +I00 +sS'value' +p45830 +NssS'summary_default' +p45831 +(dp45832 +S'editable' +p45833 +I00 +sS'value' +p45834 +S'none' +p45835 +sssS'description' +p45836 +(dp45837 +S'editable' +p45838 +I01 +sS'value' +p45839 +g47 +ssssS'EventLogEntry' +p45840 +(dp45841 +S'attribute_name' +p45842 +(dp45843 +S'mandatory' +p45844 +(dp45845 +S'editable' +p45846 +I00 +sS'value' +p45847 +I00 +ssS'name' +p45848 +(dp45849 +S'editable' +p45850 +I01 +sS'value' +p45851 +S'Attribute Name' +p45852 +ssS'data_type' +p45853 +(dp45854 +S'editable' +p45855 +I00 +sS'value' +p45856 +S'text' +p45857 +ssS'entity_type' +p45858 +(dp45859 +S'editable' +p45860 +I00 +sS'value' +p45861 +S'EventLogEntry' +p45862 +ssS'editable' +p45863 +(dp45864 +S'editable' +p45865 +I00 +sS'value' +p45866 +I00 +ssS'unique' +p45867 +(dp45868 +S'editable' +p45869 +I00 +sS'value' +p45870 +I00 +ssS'properties' +p45871 +(dp45872 +S'default_value' +p45873 +(dp45874 +S'editable' +p45875 +I00 +sS'value' +p45876 +NssS'summary_default' +p45877 +(dp45878 +S'editable' +p45879 +I01 +sS'value' +p45880 +S'none' +p45881 +sssS'description' +p45882 +(dp45883 +S'editable' +p45884 +I01 +sS'value' +p45885 +g47 +sssS'description' +p45886 +(dp45887 +S'mandatory' +p45888 +(dp45889 +S'editable' +p45890 +I00 +sS'value' +p45891 +I01 +ssS'name' +p45892 +(dp45893 +S'editable' +p45894 +I01 +sS'value' +p45895 +S'Event Summary' +p45896 +ssS'data_type' +p45897 +(dp45898 +S'editable' +p45899 +I00 +sS'value' +p45900 +S'text' +p45901 +ssS'entity_type' +p45902 +(dp45903 +S'editable' +p45904 +I00 +sS'value' +p45905 +S'EventLogEntry' +p45906 +ssS'editable' +p45907 +(dp45908 +S'editable' +p45909 +I00 +sS'value' +p45910 +I00 +ssS'unique' +p45911 +(dp45912 +S'editable' +p45913 +I00 +sS'value' +p45914 +I00 +ssS'properties' +p45915 +(dp45916 +S'default_value' +p45917 +(dp45918 +S'editable' +p45919 +I00 +sS'value' +p45920 +NssS'summary_default' +p45921 +(dp45922 +S'editable' +p45923 +I01 +sS'value' +p45924 +S'none' +p45925 +sssS'description' +p45926 +(dp45927 +S'editable' +p45928 +I01 +sS'value' +p45929 +g47 +sssS'created_at' +p45930 +(dp45931 +S'mandatory' +p45932 +(dp45933 +S'editable' +p45934 +I00 +sS'value' +p45935 +I00 +ssS'name' +p45936 +(dp45937 +S'editable' +p45938 +I01 +sS'value' +p45939 +S'Date Created' +p45940 +ssS'data_type' +p45941 +(dp45942 +S'editable' +p45943 +I00 +sS'value' +p45944 +S'date_time' +p45945 +ssS'entity_type' +p45946 +(dp45947 +S'editable' +p45948 +I00 +sS'value' +p45949 +S'EventLogEntry' +p45950 +ssS'editable' +p45951 +(dp45952 +S'editable' +p45953 +I00 +sS'value' +p45954 +I00 +ssS'unique' +p45955 +(dp45956 +S'editable' +p45957 +I00 +sS'value' +p45958 +I00 +ssS'properties' +p45959 +(dp45960 +S'default_value' +p45961 +(dp45962 +S'editable' +p45963 +I00 +sS'value' +p45964 +NssS'summary_default' +p45965 +(dp45966 +S'editable' +p45967 +I01 +sS'value' +p45968 +S'latest' +p45969 +sssS'description' +p45970 +(dp45971 +S'editable' +p45972 +I01 +sS'value' +p45973 +g47 +sssS'entity' +p45974 +(dp45975 +S'mandatory' +p45976 +(dp45977 +S'editable' +p45978 +I00 +sS'value' +p45979 +I00 +ssS'name' +p45980 +(dp45981 +S'editable' +p45982 +I01 +sS'value' +p45983 +S'Link' +p45984 +ssS'data_type' +p45985 +(dp45986 +S'editable' +p45987 +I00 +sS'value' +p45988 +S'entity' +p45989 +ssS'entity_type' +p45990 +(dp45991 +S'editable' +p45992 +I00 +sS'value' +p45993 +S'EventLogEntry' +p45994 +ssS'editable' +p45995 +(dp45996 +S'editable' +p45997 +I00 +sS'value' +p45998 +I00 +ssS'unique' +p45999 +(dp46000 +S'editable' +p46001 +I00 +sS'value' +p46002 +I00 +ssS'properties' +p46003 +(dp46004 +S'default_value' +p46005 +(dp46006 +S'editable' +p46007 +I00 +sS'value' +p46008 +NssS'summary_default' +p46009 +(dp46010 +S'editable' +p46011 +I01 +sS'value' +p46012 +S'none' +p46013 +ssS'valid_types' +p46014 +(dp46015 +S'editable' +p46016 +I01 +sS'value' +p46017 +(lp46018 +S'ApiUser' +p46019 +aS'AppWelcome' +p46020 +aS'Asset' +p46021 +aS'AssetLibrary' +p46022 +aS'Attachment' +p46023 +aS'Banner' +p46024 +aS'Booking' +p46025 +aS'CustomEntity01' +p46026 +aS'CustomEntity02' +p46027 +aS'CustomEntity03' +p46028 +aS'CustomEntity04' +p46029 +aS'CustomEntity05' +p46030 +aS'CustomNonProjectEntity01' +p46031 +aS'CustomNonProjectEntity02' +p46032 +aS'CustomNonProjectEntity03' +p46033 +aS'Department' +p46034 +aS'Element' +p46035 +aS'Group' +p46036 +aS'HumanUser' +p46037 +aS'Icon' +p46038 +aS'LocalStorage' +p46039 +aS'Note' +p46040 +aS'Page' +p46041 +aS'PermissionRuleSet' +p46042 +aS'Phase' +p46043 +aS'PipelineConfiguration' +p46044 +aS'Playlist' +p46045 +aS'Project' +p46046 +aS'PublishedFile' +p46047 +aS'PublishedFileDependency' +p46048 +aS'PublishedFileType' +p46049 +aS'Scene' +p46050 +aS'Sequence' +p46051 +aS'Shot' +p46052 +aS'Status' +p46053 +aS'Step' +p46054 +aS'Tag' +p46055 +aS'TankDependency' +p46056 +aS'TankPublishedFile' +p46057 +aS'TankType' +p46058 +aS'Task' +p46059 +aS'TaskTemplate' +p46060 +aS'Version' +p46061 +asssS'description' +p46062 +(dp46063 +S'editable' +p46064 +I01 +sS'value' +p46065 +g47 +sssS'project' +p46066 +(dp46067 +S'mandatory' +p46068 +(dp46069 +S'editable' +p46070 +I00 +sS'value' +p46071 +I00 +ssS'name' +p46072 +(dp46073 +S'editable' +p46074 +I01 +sS'value' +p46075 +S'Project' +p46076 +ssS'data_type' +p46077 +(dp46078 +S'editable' +p46079 +I00 +sS'value' +p46080 +S'entity' +p46081 +ssS'entity_type' +p46082 +(dp46083 +S'editable' +p46084 +I00 +sS'value' +p46085 +S'EventLogEntry' +p46086 +ssS'editable' +p46087 +(dp46088 +S'editable' +p46089 +I00 +sS'value' +p46090 +I00 +ssS'unique' +p46091 +(dp46092 +S'editable' +p46093 +I00 +sS'value' +p46094 +I00 +ssS'properties' +p46095 +(dp46096 +S'default_value' +p46097 +(dp46098 +S'editable' +p46099 +I00 +sS'value' +p46100 +NssS'summary_default' +p46101 +(dp46102 +S'editable' +p46103 +I01 +sS'value' +p46104 +S'none' +p46105 +ssS'valid_types' +p46106 +(dp46107 +S'editable' +p46108 +I01 +sS'value' +p46109 +(lp46110 +S'Project' +p46111 +asssS'description' +p46112 +(dp46113 +S'editable' +p46114 +I01 +sS'value' +p46115 +g47 +sssS'filmstrip_image' +p46116 +(dp46117 +S'mandatory' +p46118 +(dp46119 +S'editable' +p46120 +I00 +sS'value' +p46121 +I00 +ssS'name' +p46122 +(dp46123 +S'editable' +p46124 +I01 +sS'value' +p46125 +S'Filmstrip Thumbnail' +p46126 +ssS'data_type' +p46127 +(dp46128 +S'editable' +p46129 +I00 +sS'value' +p46130 +S'image' +p46131 +ssS'entity_type' +p46132 +(dp46133 +S'editable' +p46134 +I00 +sS'value' +p46135 +S'EventLogEntry' +p46136 +ssS'editable' +p46137 +(dp46138 +S'editable' +p46139 +I00 +sS'value' +p46140 +I01 +ssS'unique' +p46141 +(dp46142 +S'editable' +p46143 +I00 +sS'value' +p46144 +I00 +ssS'properties' +p46145 +(dp46146 +S'default_value' +p46147 +(dp46148 +S'editable' +p46149 +I00 +sS'value' +p46150 +NssS'summary_default' +p46151 +(dp46152 +S'editable' +p46153 +I01 +sS'value' +p46154 +S'none' +p46155 +sssS'description' +p46156 +(dp46157 +S'editable' +p46158 +I01 +sS'value' +p46159 +g47 +sssS'meta' +p46160 +(dp46161 +S'mandatory' +p46162 +(dp46163 +S'editable' +p46164 +I00 +sS'value' +p46165 +I00 +ssS'name' +p46166 +(dp46167 +S'editable' +p46168 +I01 +sS'value' +p46169 +S'Meta Data' +p46170 +ssS'data_type' +p46171 +(dp46172 +S'editable' +p46173 +I00 +sS'value' +p46174 +S'serializable' +p46175 +ssS'entity_type' +p46176 +(dp46177 +S'editable' +p46178 +I00 +sS'value' +p46179 +S'EventLogEntry' +p46180 +ssS'editable' +p46181 +(dp46182 +S'editable' +p46183 +I00 +sS'value' +p46184 +I00 +ssS'unique' +p46185 +(dp46186 +S'editable' +p46187 +I00 +sS'value' +p46188 +I00 +ssS'properties' +p46189 +(dp46190 +S'default_value' +p46191 +(dp46192 +S'editable' +p46193 +I00 +sS'value' +p46194 +NssS'summary_default' +p46195 +(dp46196 +S'editable' +p46197 +I01 +sS'value' +p46198 +S'none' +p46199 +sssS'description' +p46200 +(dp46201 +S'editable' +p46202 +I01 +sS'value' +p46203 +g47 +sssS'user' +p46204 +(dp46205 +S'mandatory' +p46206 +(dp46207 +S'editable' +p46208 +I00 +sS'value' +p46209 +I00 +ssS'name' +p46210 +(dp46211 +S'editable' +p46212 +I01 +sS'value' +p46213 +S'Who' +p46214 +ssS'data_type' +p46215 +(dp46216 +S'editable' +p46217 +I00 +sS'value' +p46218 +S'entity' +p46219 +ssS'entity_type' +p46220 +(dp46221 +S'editable' +p46222 +I00 +sS'value' +p46223 +S'EventLogEntry' +p46224 +ssS'editable' +p46225 +(dp46226 +S'editable' +p46227 +I00 +sS'value' +p46228 +I00 +ssS'unique' +p46229 +(dp46230 +S'editable' +p46231 +I00 +sS'value' +p46232 +I00 +ssS'properties' +p46233 +(dp46234 +S'default_value' +p46235 +(dp46236 +S'editable' +p46237 +I00 +sS'value' +p46238 +NssS'summary_default' +p46239 +(dp46240 +S'editable' +p46241 +I01 +sS'value' +p46242 +S'none' +p46243 +ssS'valid_types' +p46244 +(dp46245 +S'editable' +p46246 +I01 +sS'value' +p46247 +(lp46248 +S'HumanUser' +p46249 +aS'ApiUser' +p46250 +asssS'description' +p46251 +(dp46252 +S'editable' +p46253 +I01 +sS'value' +p46254 +g47 +sssS'session_uuid' +p46255 +(dp46256 +S'mandatory' +p46257 +(dp46258 +S'editable' +p46259 +I00 +sS'value' +p46260 +I00 +ssS'name' +p46261 +(dp46262 +S'editable' +p46263 +I01 +sS'value' +p46264 +S'Session UUID' +p46265 +ssS'data_type' +p46266 +(dp46267 +S'editable' +p46268 +I00 +sS'value' +p46269 +S'uuid' +p46270 +ssS'entity_type' +p46271 +(dp46272 +S'editable' +p46273 +I00 +sS'value' +p46274 +S'EventLogEntry' +p46275 +ssS'editable' +p46276 +(dp46277 +S'editable' +p46278 +I00 +sS'value' +p46279 +I00 +ssS'unique' +p46280 +(dp46281 +S'editable' +p46282 +I00 +sS'value' +p46283 +I00 +ssS'properties' +p46284 +(dp46285 +S'default_value' +p46286 +(dp46287 +S'editable' +p46288 +I00 +sS'value' +p46289 +NssS'summary_default' +p46290 +(dp46291 +S'editable' +p46292 +I00 +sS'value' +p46293 +S'none' +p46294 +sssS'description' +p46295 +(dp46296 +S'editable' +p46297 +I01 +sS'value' +p46298 +g47 +sssS'cached_display_name' +p46299 +(dp46300 +S'mandatory' +p46301 +(dp46302 +S'editable' +p46303 +I00 +sS'value' +p46304 +I00 +ssS'name' +p46305 +(dp46306 +S'editable' +p46307 +I01 +sS'value' +p46308 +S'Cached Display Name' +p46309 +ssS'data_type' +p46310 +(dp46311 +S'editable' +p46312 +I00 +sS'value' +p46313 +S'text' +p46314 +ssS'entity_type' +p46315 +(dp46316 +S'editable' +p46317 +I00 +sS'value' +p46318 +S'EventLogEntry' +p46319 +ssS'editable' +p46320 +(dp46321 +S'editable' +p46322 +I00 +sS'value' +p46323 +I01 +ssS'unique' +p46324 +(dp46325 +S'editable' +p46326 +I00 +sS'value' +p46327 +I00 +ssS'properties' +p46328 +(dp46329 +S'default_value' +p46330 +(dp46331 +S'editable' +p46332 +I00 +sS'value' +p46333 +NssS'summary_default' +p46334 +(dp46335 +S'editable' +p46336 +I00 +sS'value' +p46337 +S'none' +p46338 +sssS'description' +p46339 +(dp46340 +S'editable' +p46341 +I01 +sS'value' +p46342 +g47 +sssS'image' +p46343 +(dp46344 +S'mandatory' +p46345 +(dp46346 +S'editable' +p46347 +I00 +sS'value' +p46348 +I00 +ssS'name' +p46349 +(dp46350 +S'editable' +p46351 +I01 +sS'value' +p46352 +S'Thumbnail' +p46353 +ssS'data_type' +p46354 +(dp46355 +S'editable' +p46356 +I00 +sS'value' +p46357 +S'image' +p46358 +ssS'entity_type' +p46359 +(dp46360 +S'editable' +p46361 +I00 +sS'value' +p46362 +S'EventLogEntry' +p46363 +ssS'editable' +p46364 +(dp46365 +S'editable' +p46366 +I00 +sS'value' +p46367 +I01 +ssS'unique' +p46368 +(dp46369 +S'editable' +p46370 +I00 +sS'value' +p46371 +I00 +ssS'properties' +p46372 +(dp46373 +S'default_value' +p46374 +(dp46375 +S'editable' +p46376 +I00 +sS'value' +p46377 +NssS'summary_default' +p46378 +(dp46379 +S'editable' +p46380 +I01 +sS'value' +p46381 +S'none' +p46382 +sssS'description' +p46383 +(dp46384 +S'editable' +p46385 +I01 +sS'value' +p46386 +g47 +sssS'id' +p46387 +(dp46388 +S'mandatory' +p46389 +(dp46390 +S'editable' +p46391 +I00 +sS'value' +p46392 +I00 +ssS'name' +p46393 +(dp46394 +S'editable' +p46395 +I01 +sS'value' +p46396 +S'Id' +p46397 +ssS'data_type' +p46398 +(dp46399 +S'editable' +p46400 +I00 +sS'value' +p46401 +S'number' +p46402 +ssS'entity_type' +p46403 +(dp46404 +S'editable' +p46405 +I00 +sS'value' +p46406 +S'EventLogEntry' +p46407 +ssS'editable' +p46408 +(dp46409 +S'editable' +p46410 +I00 +sS'value' +p46411 +I00 +ssS'unique' +p46412 +(dp46413 +S'editable' +p46414 +I00 +sS'value' +p46415 +I00 +ssS'properties' +p46416 +(dp46417 +S'default_value' +p46418 +(dp46419 +S'editable' +p46420 +I00 +sS'value' +p46421 +NssS'summary_default' +p46422 +(dp46423 +S'editable' +p46424 +I01 +sS'value' +p46425 +S'none' +p46426 +sssS'description' +p46427 +(dp46428 +S'editable' +p46429 +I01 +sS'value' +p46430 +g47 +sssS'event_type' +p46431 +(dp46432 +S'mandatory' +p46433 +(dp46434 +S'editable' +p46435 +I00 +sS'value' +p46436 +I00 +ssS'name' +p46437 +(dp46438 +S'editable' +p46439 +I01 +sS'value' +p46440 +S'Event Type' +p46441 +ssS'data_type' +p46442 +(dp46443 +S'editable' +p46444 +I00 +sS'value' +p46445 +S'text' +p46446 +ssS'entity_type' +p46447 +(dp46448 +S'editable' +p46449 +I00 +sS'value' +p46450 +S'EventLogEntry' +p46451 +ssS'editable' +p46452 +(dp46453 +S'editable' +p46454 +I00 +sS'value' +p46455 +I00 +ssS'unique' +p46456 +(dp46457 +S'editable' +p46458 +I00 +sS'value' +p46459 +I00 +ssS'properties' +p46460 +(dp46461 +S'default_value' +p46462 +(dp46463 +S'editable' +p46464 +I00 +sS'value' +p46465 +NssS'summary_default' +p46466 +(dp46467 +S'editable' +p46468 +I01 +sS'value' +p46469 +S'none' +p46470 +sssS'description' +p46471 +(dp46472 +S'editable' +p46473 +I01 +sS'value' +p46474 +g47 +ssssS'TankDependency' +p46475 +(dp46476 +S'id' +p46477 +(dp46478 +S'mandatory' +p46479 +(dp46480 +S'editable' +p46481 +I00 +sS'value' +p46482 +I00 +ssS'name' +p46483 +(dp46484 +S'editable' +p46485 +I01 +sS'value' +p46486 +S'Id' +p46487 +ssS'data_type' +p46488 +(dp46489 +S'editable' +p46490 +I00 +sS'value' +p46491 +S'number' +p46492 +ssS'entity_type' +p46493 +(dp46494 +S'editable' +p46495 +I00 +sS'value' +p46496 +S'TankDependency' +p46497 +ssS'editable' +p46498 +(dp46499 +S'editable' +p46500 +I00 +sS'value' +p46501 +I00 +ssS'unique' +p46502 +(dp46503 +S'editable' +p46504 +I00 +sS'value' +p46505 +I00 +ssS'properties' +p46506 +(dp46507 +S'default_value' +p46508 +(dp46509 +S'editable' +p46510 +I00 +sS'value' +p46511 +NssS'summary_default' +p46512 +(dp46513 +S'editable' +p46514 +I00 +sS'value' +p46515 +S'none' +p46516 +sssS'description' +p46517 +(dp46518 +S'editable' +p46519 +I01 +sS'value' +p46520 +g47 +sssS'cached_display_name' +p46521 +(dp46522 +S'mandatory' +p46523 +(dp46524 +S'editable' +p46525 +I00 +sS'value' +p46526 +I00 +ssS'name' +p46527 +(dp46528 +S'editable' +p46529 +I01 +sS'value' +p46530 +S'Cached Display Name' +p46531 +ssS'data_type' +p46532 +(dp46533 +S'editable' +p46534 +I00 +sS'value' +p46535 +S'text' +p46536 +ssS'entity_type' +p46537 +(dp46538 +S'editable' +p46539 +I00 +sS'value' +p46540 +S'TankDependency' +p46541 +ssS'editable' +p46542 +(dp46543 +S'editable' +p46544 +I00 +sS'value' +p46545 +I01 +ssS'unique' +p46546 +(dp46547 +S'editable' +p46548 +I00 +sS'value' +p46549 +I00 +ssS'properties' +p46550 +(dp46551 +S'default_value' +p46552 +(dp46553 +S'editable' +p46554 +I00 +sS'value' +p46555 +NssS'summary_default' +p46556 +(dp46557 +S'editable' +p46558 +I00 +sS'value' +p46559 +S'none' +p46560 +sssS'description' +p46561 +(dp46562 +S'editable' +p46563 +I01 +sS'value' +p46564 +g47 +sssS'dependent_tank_published_file' +p46565 +(dp46566 +S'mandatory' +p46567 +(dp46568 +S'editable' +p46569 +I00 +sS'value' +p46570 +I00 +ssS'name' +p46571 +(dp46572 +S'editable' +p46573 +I01 +sS'value' +p46574 +S'Dependent Tank Published File' +p46575 +ssS'data_type' +p46576 +(dp46577 +S'editable' +p46578 +I00 +sS'value' +p46579 +S'entity' +p46580 +ssS'entity_type' +p46581 +(dp46582 +S'editable' +p46583 +I00 +sS'value' +p46584 +S'TankDependency' +p46585 +ssS'editable' +p46586 +(dp46587 +S'editable' +p46588 +I00 +sS'value' +p46589 +I00 +ssS'unique' +p46590 +(dp46591 +S'editable' +p46592 +I00 +sS'value' +p46593 +I00 +ssS'properties' +p46594 +(dp46595 +S'default_value' +p46596 +(dp46597 +S'editable' +p46598 +I00 +sS'value' +p46599 +NssS'summary_default' +p46600 +(dp46601 +S'editable' +p46602 +I00 +sS'value' +p46603 +S'none' +p46604 +ssS'valid_types' +p46605 +(dp46606 +S'editable' +p46607 +I00 +sS'value' +p46608 +(lp46609 +S'TankPublishedFile' +p46610 +asssS'description' +p46611 +(dp46612 +S'editable' +p46613 +I01 +sS'value' +p46614 +g47 +sssS'tank_published_file' +p46615 +(dp46616 +S'mandatory' +p46617 +(dp46618 +S'editable' +p46619 +I00 +sS'value' +p46620 +I00 +ssS'name' +p46621 +(dp46622 +S'editable' +p46623 +I01 +sS'value' +p46624 +S'Tank Published File' +p46625 +ssS'data_type' +p46626 +(dp46627 +S'editable' +p46628 +I00 +sS'value' +p46629 +S'entity' +p46630 +ssS'entity_type' +p46631 +(dp46632 +S'editable' +p46633 +I00 +sS'value' +p46634 +S'TankDependency' +p46635 +ssS'editable' +p46636 +(dp46637 +S'editable' +p46638 +I00 +sS'value' +p46639 +I00 +ssS'unique' +p46640 +(dp46641 +S'editable' +p46642 +I00 +sS'value' +p46643 +I00 +ssS'properties' +p46644 +(dp46645 +S'default_value' +p46646 +(dp46647 +S'editable' +p46648 +I00 +sS'value' +p46649 +NssS'summary_default' +p46650 +(dp46651 +S'editable' +p46652 +I00 +sS'value' +p46653 +S'none' +p46654 +ssS'valid_types' +p46655 +(dp46656 +S'editable' +p46657 +I00 +sS'value' +p46658 +(lp46659 +S'TankPublishedFile' +p46660 +asssS'description' +p46661 +(dp46662 +S'editable' +p46663 +I01 +sS'value' +p46664 +g47 +ssssS'AssetShootDayConnection' +p46665 +(dp46666 +S'cached_display_name' +p46667 +(dp46668 +S'mandatory' +p46669 +(dp46670 +S'editable' +p46671 +I00 +sS'value' +p46672 +I00 +ssS'name' +p46673 +(dp46674 +S'editable' +p46675 +I01 +sS'value' +p46676 +S'Cached Display Name' +p46677 +ssS'data_type' +p46678 +(dp46679 +S'editable' +p46680 +I00 +sS'value' +p46681 +S'text' +p46682 +ssS'entity_type' +p46683 +(dp46684 +S'editable' +p46685 +I00 +sS'value' +p46686 +S'AssetShootDayConnection' +p46687 +ssS'editable' +p46688 +(dp46689 +S'editable' +p46690 +I00 +sS'value' +p46691 +I01 +ssS'unique' +p46692 +(dp46693 +S'editable' +p46694 +I00 +sS'value' +p46695 +I00 +ssS'properties' +p46696 +(dp46697 +S'default_value' +p46698 +(dp46699 +S'editable' +p46700 +I00 +sS'value' +p46701 +NssS'summary_default' +p46702 +(dp46703 +S'editable' +p46704 +I00 +sS'value' +p46705 +S'none' +p46706 +sssS'description' +p46707 +(dp46708 +S'editable' +p46709 +I01 +sS'value' +p46710 +g47 +sssS'asset' +p46711 +(dp46712 +S'mandatory' +p46713 +(dp46714 +S'editable' +p46715 +I00 +sS'value' +p46716 +I00 +ssS'name' +p46717 +(dp46718 +S'editable' +p46719 +I01 +sS'value' +p46720 +S'Asset' +p46721 +ssS'data_type' +p46722 +(dp46723 +S'editable' +p46724 +I00 +sS'value' +p46725 +S'entity' +p46726 +ssS'entity_type' +p46727 +(dp46728 +S'editable' +p46729 +I00 +sS'value' +p46730 +S'AssetShootDayConnection' +p46731 +ssS'editable' +p46732 +(dp46733 +S'editable' +p46734 +I00 +sS'value' +p46735 +I00 +ssS'unique' +p46736 +(dp46737 +S'editable' +p46738 +I00 +sS'value' +p46739 +I00 +ssS'properties' +p46740 +(dp46741 +S'default_value' +p46742 +(dp46743 +S'editable' +p46744 +I00 +sS'value' +p46745 +NssS'summary_default' +p46746 +(dp46747 +S'editable' +p46748 +I00 +sS'value' +p46749 +S'none' +p46750 +ssS'valid_types' +p46751 +(dp46752 +S'editable' +p46753 +I00 +sS'value' +p46754 +(lp46755 +S'Asset' +p46756 +asssS'description' +p46757 +(dp46758 +S'editable' +p46759 +I01 +sS'value' +p46760 +g47 +sssS'id' +p46761 +(dp46762 +S'mandatory' +p46763 +(dp46764 +S'editable' +p46765 +I00 +sS'value' +p46766 +I01 +ssS'name' +p46767 +(dp46768 +S'editable' +p46769 +I01 +sS'value' +p46770 +S'Id' +p46771 +ssS'data_type' +p46772 +(dp46773 +S'editable' +p46774 +I00 +sS'value' +p46775 +S'number' +p46776 +ssS'entity_type' +p46777 +(dp46778 +S'editable' +p46779 +I00 +sS'value' +p46780 +S'AssetShootDayConnection' +p46781 +ssS'editable' +p46782 +(dp46783 +S'editable' +p46784 +I00 +sS'value' +p46785 +I00 +ssS'unique' +p46786 +(dp46787 +S'editable' +p46788 +I00 +sS'value' +p46789 +I00 +ssS'properties' +p46790 +(dp46791 +S'default_value' +p46792 +(dp46793 +S'editable' +p46794 +I00 +sS'value' +p46795 +NssS'summary_default' +p46796 +(dp46797 +S'editable' +p46798 +I00 +sS'value' +p46799 +S'none' +p46800 +sssS'description' +p46801 +(dp46802 +S'editable' +p46803 +I01 +sS'value' +p46804 +g47 +sssS'shoot_day' +p46805 +(dp46806 +S'mandatory' +p46807 +(dp46808 +S'editable' +p46809 +I00 +sS'value' +p46810 +I00 +ssS'name' +p46811 +(dp46812 +S'editable' +p46813 +I01 +sS'value' +p46814 +S'Shoot Day' +p46815 +ssS'data_type' +p46816 +(dp46817 +S'editable' +p46818 +I00 +sS'value' +p46819 +S'entity' +p46820 +ssS'entity_type' +p46821 +(dp46822 +S'editable' +p46823 +I00 +sS'value' +p46824 +S'AssetShootDayConnection' +p46825 +ssS'editable' +p46826 +(dp46827 +S'editable' +p46828 +I00 +sS'value' +p46829 +I00 +ssS'unique' +p46830 +(dp46831 +S'editable' +p46832 +I00 +sS'value' +p46833 +I00 +ssS'properties' +p46834 +(dp46835 +S'default_value' +p46836 +(dp46837 +S'editable' +p46838 +I00 +sS'value' +p46839 +NssS'summary_default' +p46840 +(dp46841 +S'editable' +p46842 +I00 +sS'value' +p46843 +S'none' +p46844 +ssS'valid_types' +p46845 +(dp46846 +S'editable' +p46847 +I00 +sS'value' +p46848 +(lp46849 +S'ShootDay' +p46850 +asssS'description' +p46851 +(dp46852 +S'editable' +p46853 +I01 +sS'value' +p46854 +g47 +ssssS'Asset' +p46855 +(dp46856 +S'open_notes_count' +p46857 +(dp46858 +S'mandatory' +p46859 +(dp46860 +S'editable' +p46861 +I00 +sS'value' +p46862 +I00 +ssS'name' +p46863 +(dp46864 +S'editable' +p46865 +I01 +sS'value' +p46866 +S'Open Notes Count' +p46867 +ssS'data_type' +p46868 +(dp46869 +S'editable' +p46870 +I00 +sS'value' +p46871 +S'text' +p46872 +ssS'entity_type' +p46873 +(dp46874 +S'editable' +p46875 +I00 +sS'value' +p46876 +S'Asset' +p46877 +ssS'editable' +p46878 +(dp46879 +S'editable' +p46880 +I00 +sS'value' +p46881 +I00 +ssS'unique' +p46882 +(dp46883 +S'editable' +p46884 +I00 +sS'value' +p46885 +I00 +ssS'properties' +p46886 +(dp46887 +S'default_value' +p46888 +(dp46889 +S'editable' +p46890 +I00 +sS'value' +p46891 +NssS'summary_default' +p46892 +(dp46893 +S'editable' +p46894 +I01 +sS'value' +p46895 +S'none' +p46896 +sssS'description' +p46897 +(dp46898 +S'editable' +p46899 +I01 +sS'value' +p46900 +g47 +sssS'code' +p46901 +(dp46902 +S'mandatory' +p46903 +(dp46904 +S'editable' +p46905 +I00 +sS'value' +p46906 +I01 +ssS'name' +p46907 +(dp46908 +S'editable' +p46909 +I01 +sS'value' +p46910 +S'Asset Name' +p46911 +ssS'data_type' +p46912 +(dp46913 +S'editable' +p46914 +I00 +sS'value' +p46915 +S'text' +p46916 +ssS'entity_type' +p46917 +(dp46918 +S'editable' +p46919 +I00 +sS'value' +p46920 +S'Asset' +p46921 +ssS'editable' +p46922 +(dp46923 +S'editable' +p46924 +I00 +sS'value' +p46925 +I01 +ssS'unique' +p46926 +(dp46927 +S'editable' +p46928 +I00 +sS'value' +p46929 +I00 +ssS'properties' +p46930 +(dp46931 +S'default_value' +p46932 +(dp46933 +S'editable' +p46934 +I00 +sS'value' +p46935 +NssS'summary_default' +p46936 +(dp46937 +S'editable' +p46938 +I01 +sS'value' +p46939 +S'none' +p46940 +sssS'description' +p46941 +(dp46942 +S'editable' +p46943 +I01 +sS'value' +p46944 +g47 +sssS'step_11' +p46945 +(dp46946 +S'mandatory' +p46947 +(dp46948 +S'editable' +p46949 +I00 +sS'value' +p46950 +I00 +ssS'name' +p46951 +(dp46952 +S'editable' +p46953 +I01 +sS'value' +p46954 +S'Rig' +p46955 +ssS'data_type' +p46956 +(dp46957 +S'editable' +p46958 +I00 +sS'value' +p46959 +S'pivot_column' +p46960 +ssS'entity_type' +p46961 +(dp46962 +S'editable' +p46963 +I00 +sS'value' +p46964 +S'Asset' +p46965 +ssS'editable' +p46966 +(dp46967 +S'editable' +p46968 +I00 +sS'value' +p46969 +I00 +ssS'unique' +p46970 +(dp46971 +S'editable' +p46972 +I00 +sS'value' +p46973 +I00 +ssS'properties' +p46974 +(dp46975 +S'default_value' +p46976 +(dp46977 +S'editable' +p46978 +I00 +sS'value' +p46979 +NssS'summary_default' +p46980 +(dp46981 +S'editable' +p46982 +I00 +sS'value' +p46983 +S'none' +p46984 +sssS'description' +p46985 +(dp46986 +S'editable' +p46987 +I01 +sS'value' +p46988 +g47 +sssS'step_10' +p46989 +(dp46990 +S'mandatory' +p46991 +(dp46992 +S'editable' +p46993 +I00 +sS'value' +p46994 +I00 +ssS'name' +p46995 +(dp46996 +S'editable' +p46997 +I01 +sS'value' +p46998 +S'Model' +p46999 +ssS'data_type' +p47000 +(dp47001 +S'editable' +p47002 +I00 +sS'value' +p47003 +S'pivot_column' +p47004 +ssS'entity_type' +p47005 +(dp47006 +S'editable' +p47007 +I00 +sS'value' +p47008 +S'Asset' +p47009 +ssS'editable' +p47010 +(dp47011 +S'editable' +p47012 +I00 +sS'value' +p47013 +I00 +ssS'unique' +p47014 +(dp47015 +S'editable' +p47016 +I00 +sS'value' +p47017 +I00 +ssS'properties' +p47018 +(dp47019 +S'default_value' +p47020 +(dp47021 +S'editable' +p47022 +I00 +sS'value' +p47023 +NssS'summary_default' +p47024 +(dp47025 +S'editable' +p47026 +I00 +sS'value' +p47027 +S'none' +p47028 +sssS'description' +p47029 +(dp47030 +S'editable' +p47031 +I01 +sS'value' +p47032 +g47 +sssS'mocap_takes' +p47033 +(dp47034 +S'mandatory' +p47035 +(dp47036 +S'editable' +p47037 +I00 +sS'value' +p47038 +I00 +ssS'name' +p47039 +(dp47040 +S'editable' +p47041 +I01 +sS'value' +p47042 +S'Mocap Takes' +p47043 +ssS'data_type' +p47044 +(dp47045 +S'editable' +p47046 +I00 +sS'value' +p47047 +S'multi_entity' +p47048 +ssS'entity_type' +p47049 +(dp47050 +S'editable' +p47051 +I00 +sS'value' +p47052 +S'Asset' +p47053 +ssS'editable' +p47054 +(dp47055 +S'editable' +p47056 +I00 +sS'value' +p47057 +I01 +ssS'unique' +p47058 +(dp47059 +S'editable' +p47060 +I00 +sS'value' +p47061 +I00 +ssS'properties' +p47062 +(dp47063 +S'default_value' +p47064 +(dp47065 +S'editable' +p47066 +I00 +sS'value' +p47067 +NssS'summary_default' +p47068 +(dp47069 +S'editable' +p47070 +I01 +sS'value' +p47071 +S'none' +p47072 +ssS'valid_types' +p47073 +(dp47074 +S'editable' +p47075 +I01 +sS'value' +p47076 +(lp47077 +S'MocapTake' +p47078 +asssS'description' +p47079 +(dp47080 +S'editable' +p47081 +I01 +sS'value' +p47082 +g47 +sssS'step_12' +p47083 +(dp47084 +S'mandatory' +p47085 +(dp47086 +S'editable' +p47087 +I00 +sS'value' +p47088 +I00 +ssS'name' +p47089 +(dp47090 +S'editable' +p47091 +I01 +sS'value' +p47092 +S'Surface' +p47093 +ssS'data_type' +p47094 +(dp47095 +S'editable' +p47096 +I00 +sS'value' +p47097 +S'pivot_column' +p47098 +ssS'entity_type' +p47099 +(dp47100 +S'editable' +p47101 +I00 +sS'value' +p47102 +S'Asset' +p47103 +ssS'editable' +p47104 +(dp47105 +S'editable' +p47106 +I00 +sS'value' +p47107 +I00 +ssS'unique' +p47108 +(dp47109 +S'editable' +p47110 +I00 +sS'value' +p47111 +I00 +ssS'properties' +p47112 +(dp47113 +S'default_value' +p47114 +(dp47115 +S'editable' +p47116 +I00 +sS'value' +p47117 +NssS'summary_default' +p47118 +(dp47119 +S'editable' +p47120 +I00 +sS'value' +p47121 +S'none' +p47122 +sssS'description' +p47123 +(dp47124 +S'editable' +p47125 +I01 +sS'value' +p47126 +g47 +sssS'image' +p47127 +(dp47128 +S'mandatory' +p47129 +(dp47130 +S'editable' +p47131 +I00 +sS'value' +p47132 +I00 +ssS'name' +p47133 +(dp47134 +S'editable' +p47135 +I01 +sS'value' +p47136 +S'Thumbnail' +p47137 +ssS'data_type' +p47138 +(dp47139 +S'editable' +p47140 +I00 +sS'value' +p47141 +S'image' +p47142 +ssS'entity_type' +p47143 +(dp47144 +S'editable' +p47145 +I00 +sS'value' +p47146 +S'Asset' +p47147 +ssS'editable' +p47148 +(dp47149 +S'editable' +p47150 +I00 +sS'value' +p47151 +I01 +ssS'unique' +p47152 +(dp47153 +S'editable' +p47154 +I00 +sS'value' +p47155 +I00 +ssS'properties' +p47156 +(dp47157 +S'default_value' +p47158 +(dp47159 +S'editable' +p47160 +I00 +sS'value' +p47161 +NssS'summary_default' +p47162 +(dp47163 +S'editable' +p47164 +I01 +sS'value' +p47165 +S'none' +p47166 +sssS'description' +p47167 +(dp47168 +S'editable' +p47169 +I01 +sS'value' +p47170 +g47 +sssS'updated_at' +p47171 +(dp47172 +S'mandatory' +p47173 +(dp47174 +S'editable' +p47175 +I00 +sS'value' +p47176 +I00 +ssS'name' +p47177 +(dp47178 +S'editable' +p47179 +I01 +sS'value' +p47180 +S'Date Updated' +p47181 +ssS'data_type' +p47182 +(dp47183 +S'editable' +p47184 +I00 +sS'value' +p47185 +S'date_time' +p47186 +ssS'entity_type' +p47187 +(dp47188 +S'editable' +p47189 +I00 +sS'value' +p47190 +S'Asset' +p47191 +ssS'editable' +p47192 +(dp47193 +S'editable' +p47194 +I00 +sS'value' +p47195 +I00 +ssS'unique' +p47196 +(dp47197 +S'editable' +p47198 +I00 +sS'value' +p47199 +I00 +ssS'properties' +p47200 +(dp47201 +S'default_value' +p47202 +(dp47203 +S'editable' +p47204 +I00 +sS'value' +p47205 +NssS'summary_default' +p47206 +(dp47207 +S'editable' +p47208 +I01 +sS'value' +p47209 +S'none' +p47210 +sssS'description' +p47211 +(dp47212 +S'editable' +p47213 +I01 +sS'value' +p47214 +g47 +sssS'tasks' +p47215 +(dp47216 +S'mandatory' +p47217 +(dp47218 +S'editable' +p47219 +I00 +sS'value' +p47220 +I00 +ssS'name' +p47221 +(dp47222 +S'editable' +p47223 +I01 +sS'value' +p47224 +S'Tasks' +p47225 +ssS'data_type' +p47226 +(dp47227 +S'editable' +p47228 +I00 +sS'value' +p47229 +S'multi_entity' +p47230 +ssS'entity_type' +p47231 +(dp47232 +S'editable' +p47233 +I00 +sS'value' +p47234 +S'Asset' +p47235 +ssS'editable' +p47236 +(dp47237 +S'editable' +p47238 +I00 +sS'value' +p47239 +I01 +ssS'unique' +p47240 +(dp47241 +S'editable' +p47242 +I00 +sS'value' +p47243 +I00 +ssS'properties' +p47244 +(dp47245 +S'default_value' +p47246 +(dp47247 +S'editable' +p47248 +I00 +sS'value' +p47249 +NssS'summary_default' +p47250 +(dp47251 +S'editable' +p47252 +I01 +sS'value' +p47253 +S'none' +p47254 +ssS'valid_types' +p47255 +(dp47256 +S'editable' +p47257 +I01 +sS'value' +p47258 +(lp47259 +S'Task' +p47260 +asssS'description' +p47261 +(dp47262 +S'editable' +p47263 +I01 +sS'value' +p47264 +g47 +sssS'sequences' +p47265 +(dp47266 +S'mandatory' +p47267 +(dp47268 +S'editable' +p47269 +I00 +sS'value' +p47270 +I00 +ssS'name' +p47271 +(dp47272 +S'editable' +p47273 +I01 +sS'value' +p47274 +S'Sequences' +p47275 +ssS'data_type' +p47276 +(dp47277 +S'editable' +p47278 +I00 +sS'value' +p47279 +S'multi_entity' +p47280 +ssS'entity_type' +p47281 +(dp47282 +S'editable' +p47283 +I00 +sS'value' +p47284 +S'Asset' +p47285 +ssS'editable' +p47286 +(dp47287 +S'editable' +p47288 +I00 +sS'value' +p47289 +I01 +ssS'unique' +p47290 +(dp47291 +S'editable' +p47292 +I00 +sS'value' +p47293 +I00 +ssS'properties' +p47294 +(dp47295 +S'default_value' +p47296 +(dp47297 +S'editable' +p47298 +I00 +sS'value' +p47299 +NssS'summary_default' +p47300 +(dp47301 +S'editable' +p47302 +I01 +sS'value' +p47303 +S'none' +p47304 +ssS'valid_types' +p47305 +(dp47306 +S'editable' +p47307 +I01 +sS'value' +p47308 +(lp47309 +S'Sequence' +p47310 +asssS'description' +p47311 +(dp47312 +S'editable' +p47313 +I01 +sS'value' +p47314 +g47 +sssS'cached_display_name' +p47315 +(dp47316 +S'mandatory' +p47317 +(dp47318 +S'editable' +p47319 +I00 +sS'value' +p47320 +I00 +ssS'name' +p47321 +(dp47322 +S'editable' +p47323 +I01 +sS'value' +p47324 +S'Cached Display Name' +p47325 +ssS'data_type' +p47326 +(dp47327 +S'editable' +p47328 +I00 +sS'value' +p47329 +S'text' +p47330 +ssS'entity_type' +p47331 +(dp47332 +S'editable' +p47333 +I00 +sS'value' +p47334 +S'Asset' +p47335 +ssS'editable' +p47336 +(dp47337 +S'editable' +p47338 +I00 +sS'value' +p47339 +I01 +ssS'unique' +p47340 +(dp47341 +S'editable' +p47342 +I00 +sS'value' +p47343 +I00 +ssS'properties' +p47344 +(dp47345 +S'default_value' +p47346 +(dp47347 +S'editable' +p47348 +I00 +sS'value' +p47349 +NssS'summary_default' +p47350 +(dp47351 +S'editable' +p47352 +I00 +sS'value' +p47353 +S'none' +p47354 +sssS'description' +p47355 +(dp47356 +S'editable' +p47357 +I01 +sS'value' +p47358 +g47 +sssS'id' +p47359 +(dp47360 +S'mandatory' +p47361 +(dp47362 +S'editable' +p47363 +I00 +sS'value' +p47364 +I00 +ssS'name' +p47365 +(dp47366 +S'editable' +p47367 +I01 +sS'value' +p47368 +S'Id' +p47369 +ssS'data_type' +p47370 +(dp47371 +S'editable' +p47372 +I00 +sS'value' +p47373 +S'number' +p47374 +ssS'entity_type' +p47375 +(dp47376 +S'editable' +p47377 +I00 +sS'value' +p47378 +S'Asset' +p47379 +ssS'editable' +p47380 +(dp47381 +S'editable' +p47382 +I00 +sS'value' +p47383 +I00 +ssS'unique' +p47384 +(dp47385 +S'editable' +p47386 +I00 +sS'value' +p47387 +I00 +ssS'properties' +p47388 +(dp47389 +S'default_value' +p47390 +(dp47391 +S'editable' +p47392 +I00 +sS'value' +p47393 +NssS'summary_default' +p47394 +(dp47395 +S'editable' +p47396 +I01 +sS'value' +p47397 +S'none' +p47398 +sssS'description' +p47399 +(dp47400 +S'editable' +p47401 +I01 +sS'value' +p47402 +g47 +sssS'updated_by' +p47403 +(dp47404 +S'mandatory' +p47405 +(dp47406 +S'editable' +p47407 +I00 +sS'value' +p47408 +I00 +ssS'name' +p47409 +(dp47410 +S'editable' +p47411 +I01 +sS'value' +p47412 +S'Updated by' +p47413 +ssS'data_type' +p47414 +(dp47415 +S'editable' +p47416 +I00 +sS'value' +p47417 +S'entity' +p47418 +ssS'entity_type' +p47419 +(dp47420 +S'editable' +p47421 +I00 +sS'value' +p47422 +S'Asset' +p47423 +ssS'editable' +p47424 +(dp47425 +S'editable' +p47426 +I00 +sS'value' +p47427 +I00 +ssS'unique' +p47428 +(dp47429 +S'editable' +p47430 +I00 +sS'value' +p47431 +I00 +ssS'properties' +p47432 +(dp47433 +S'default_value' +p47434 +(dp47435 +S'editable' +p47436 +I00 +sS'value' +p47437 +NssS'summary_default' +p47438 +(dp47439 +S'editable' +p47440 +I01 +sS'value' +p47441 +S'none' +p47442 +ssS'valid_types' +p47443 +(dp47444 +S'editable' +p47445 +I01 +sS'value' +p47446 +(lp47447 +S'HumanUser' +p47448 +aS'ApiUser' +p47449 +asssS'description' +p47450 +(dp47451 +S'editable' +p47452 +I01 +sS'value' +p47453 +g47 +sssS'open_notes' +p47454 +(dp47455 +S'mandatory' +p47456 +(dp47457 +S'editable' +p47458 +I00 +sS'value' +p47459 +I00 +ssS'name' +p47460 +(dp47461 +S'editable' +p47462 +I01 +sS'value' +p47463 +S'Open Notes' +p47464 +ssS'data_type' +p47465 +(dp47466 +S'editable' +p47467 +I00 +sS'value' +p47468 +S'multi_entity' +p47469 +ssS'entity_type' +p47470 +(dp47471 +S'editable' +p47472 +I00 +sS'value' +p47473 +S'Asset' +p47474 +ssS'editable' +p47475 +(dp47476 +S'editable' +p47477 +I00 +sS'value' +p47478 +I00 +ssS'unique' +p47479 +(dp47480 +S'editable' +p47481 +I00 +sS'value' +p47482 +I00 +ssS'properties' +p47483 +(dp47484 +S'default_value' +p47485 +(dp47486 +S'editable' +p47487 +I00 +sS'value' +p47488 +NssS'summary_default' +p47489 +(dp47490 +S'editable' +p47491 +I01 +sS'value' +p47492 +S'none' +p47493 +ssS'valid_types' +p47494 +(dp47495 +S'editable' +p47496 +I01 +sS'value' +p47497 +(lp47498 +S'Note' +p47499 +asssS'description' +p47500 +(dp47501 +S'editable' +p47502 +I01 +sS'value' +p47503 +g47 +sssS'task_template' +p47504 +(dp47505 +S'mandatory' +p47506 +(dp47507 +S'editable' +p47508 +I00 +sS'value' +p47509 +I00 +ssS'name' +p47510 +(dp47511 +S'editable' +p47512 +I01 +sS'value' +p47513 +S'Task Template' +p47514 +ssS'data_type' +p47515 +(dp47516 +S'editable' +p47517 +I00 +sS'value' +p47518 +S'entity' +p47519 +ssS'entity_type' +p47520 +(dp47521 +S'editable' +p47522 +I00 +sS'value' +p47523 +S'Asset' +p47524 +ssS'editable' +p47525 +(dp47526 +S'editable' +p47527 +I00 +sS'value' +p47528 +I01 +ssS'unique' +p47529 +(dp47530 +S'editable' +p47531 +I00 +sS'value' +p47532 +I00 +ssS'properties' +p47533 +(dp47534 +S'default_value' +p47535 +(dp47536 +S'editable' +p47537 +I00 +sS'value' +p47538 +NssS'summary_default' +p47539 +(dp47540 +S'editable' +p47541 +I01 +sS'value' +p47542 +S'none' +p47543 +ssS'valid_types' +p47544 +(dp47545 +S'editable' +p47546 +I01 +sS'value' +p47547 +(lp47548 +S'TaskTemplate' +p47549 +asssS'description' +p47550 +(dp47551 +S'editable' +p47552 +I01 +sS'value' +p47553 +g47 +sssS'created_by' +p47554 +(dp47555 +S'mandatory' +p47556 +(dp47557 +S'editable' +p47558 +I00 +sS'value' +p47559 +I00 +ssS'name' +p47560 +(dp47561 +S'editable' +p47562 +I01 +sS'value' +p47563 +S'Created by' +p47564 +ssS'data_type' +p47565 +(dp47566 +S'editable' +p47567 +I00 +sS'value' +p47568 +S'entity' +p47569 +ssS'entity_type' +p47570 +(dp47571 +S'editable' +p47572 +I00 +sS'value' +p47573 +S'Asset' +p47574 +ssS'editable' +p47575 +(dp47576 +S'editable' +p47577 +I00 +sS'value' +p47578 +I00 +ssS'unique' +p47579 +(dp47580 +S'editable' +p47581 +I00 +sS'value' +p47582 +I00 +ssS'properties' +p47583 +(dp47584 +S'default_value' +p47585 +(dp47586 +S'editable' +p47587 +I00 +sS'value' +p47588 +NssS'summary_default' +p47589 +(dp47590 +S'editable' +p47591 +I01 +sS'value' +p47592 +S'none' +p47593 +ssS'valid_types' +p47594 +(dp47595 +S'editable' +p47596 +I01 +sS'value' +p47597 +(lp47598 +S'HumanUser' +p47599 +aS'ApiUser' +p47600 +asssS'description' +p47601 +(dp47602 +S'editable' +p47603 +I01 +sS'value' +p47604 +g47 +sssS'parents' +p47605 +(dp47606 +S'mandatory' +p47607 +(dp47608 +S'editable' +p47609 +I00 +sS'value' +p47610 +I00 +ssS'name' +p47611 +(dp47612 +S'editable' +p47613 +I01 +sS'value' +p47614 +S'Parent Assets' +p47615 +ssS'data_type' +p47616 +(dp47617 +S'editable' +p47618 +I00 +sS'value' +p47619 +S'multi_entity' +p47620 +ssS'entity_type' +p47621 +(dp47622 +S'editable' +p47623 +I00 +sS'value' +p47624 +S'Asset' +p47625 +ssS'editable' +p47626 +(dp47627 +S'editable' +p47628 +I00 +sS'value' +p47629 +I01 +ssS'unique' +p47630 +(dp47631 +S'editable' +p47632 +I00 +sS'value' +p47633 +I00 +ssS'properties' +p47634 +(dp47635 +S'default_value' +p47636 +(dp47637 +S'editable' +p47638 +I00 +sS'value' +p47639 +NssS'summary_default' +p47640 +(dp47641 +S'editable' +p47642 +I01 +sS'value' +p47643 +S'none' +p47644 +ssS'valid_types' +p47645 +(dp47646 +S'editable' +p47647 +I01 +sS'value' +p47648 +(lp47649 +S'Asset' +p47650 +asssS'description' +p47651 +(dp47652 +S'editable' +p47653 +I01 +sS'value' +p47654 +g47 +sssS'sg_status_list' +p47655 +(dp47656 +S'mandatory' +p47657 +(dp47658 +S'editable' +p47659 +I00 +sS'value' +p47660 +I00 +ssS'name' +p47661 +(dp47662 +S'editable' +p47663 +I01 +sS'value' +p47664 +S'Status' +p47665 +ssS'data_type' +p47666 +(dp47667 +S'editable' +p47668 +I00 +sS'value' +p47669 +S'status_list' +p47670 +ssS'entity_type' +p47671 +(dp47672 +S'editable' +p47673 +I00 +sS'value' +p47674 +S'Asset' +p47675 +ssS'editable' +p47676 +(dp47677 +S'editable' +p47678 +I00 +sS'value' +p47679 +I01 +ssS'unique' +p47680 +(dp47681 +S'editable' +p47682 +I00 +sS'value' +p47683 +I00 +ssS'properties' +p47684 +(dp47685 +S'default_value' +p47686 +(dp47687 +S'editable' +p47688 +I01 +sS'value' +p47689 +S'wtg' +p47690 +ssS'valid_values' +p47691 +(dp47692 +S'editable' +p47693 +I01 +sS'value' +p47694 +(lp47695 +S'fin' +p47696 +aS'ip' +p47697 +aS'omt' +p47698 +aS'hld' +p47699 +aS'rdy' +p47700 +aS'wtg' +p47701 +assS'summary_default' +p47702 +(dp47703 +S'editable' +p47704 +I01 +sS'value' +p47705 +S'status_list' +p47706 +sssS'description' +p47707 +(dp47708 +S'editable' +p47709 +I01 +sS'value' +p47710 +g47 +sssS'elements' +p47711 +(dp47712 +S'mandatory' +p47713 +(dp47714 +S'editable' +p47715 +I00 +sS'value' +p47716 +I00 +ssS'name' +p47717 +(dp47718 +S'editable' +p47719 +I01 +sS'value' +p47720 +S'Elements' +p47721 +ssS'data_type' +p47722 +(dp47723 +S'editable' +p47724 +I00 +sS'value' +p47725 +S'multi_entity' +p47726 +ssS'entity_type' +p47727 +(dp47728 +S'editable' +p47729 +I00 +sS'value' +p47730 +S'Asset' +p47731 +ssS'editable' +p47732 +(dp47733 +S'editable' +p47734 +I00 +sS'value' +p47735 +I01 +ssS'unique' +p47736 +(dp47737 +S'editable' +p47738 +I00 +sS'value' +p47739 +I00 +ssS'properties' +p47740 +(dp47741 +S'default_value' +p47742 +(dp47743 +S'editable' +p47744 +I00 +sS'value' +p47745 +NssS'summary_default' +p47746 +(dp47747 +S'editable' +p47748 +I00 +sS'value' +p47749 +S'none' +p47750 +ssS'valid_types' +p47751 +(dp47752 +S'editable' +p47753 +I00 +sS'value' +p47754 +(lp47755 +S'Element' +p47756 +asssS'description' +p47757 +(dp47758 +S'editable' +p47759 +I01 +sS'value' +p47760 +g47 +sssS'description' +p47761 +(dp47762 +S'mandatory' +p47763 +(dp47764 +S'editable' +p47765 +I00 +sS'value' +p47766 +I00 +ssS'name' +p47767 +(dp47768 +S'editable' +p47769 +I01 +sS'value' +p47770 +S'Description' +p47771 +ssS'data_type' +p47772 +(dp47773 +S'editable' +p47774 +I00 +sS'value' +p47775 +S'text' +p47776 +ssS'entity_type' +p47777 +(dp47778 +S'editable' +p47779 +I00 +sS'value' +p47780 +S'Asset' +p47781 +ssS'editable' +p47782 +(dp47783 +S'editable' +p47784 +I00 +sS'value' +p47785 +I01 +ssS'unique' +p47786 +(dp47787 +S'editable' +p47788 +I00 +sS'value' +p47789 +I00 +ssS'properties' +p47790 +(dp47791 +S'default_value' +p47792 +(dp47793 +S'editable' +p47794 +I00 +sS'value' +p47795 +NssS'summary_default' +p47796 +(dp47797 +S'editable' +p47798 +I01 +sS'value' +p47799 +S'none' +p47800 +sssS'description' +p47801 +(dp47802 +S'editable' +p47803 +I01 +sS'value' +p47804 +g47 +sssS'addressings_cc' +p47805 +(dp47806 +S'mandatory' +p47807 +(dp47808 +S'editable' +p47809 +I00 +sS'value' +p47810 +I00 +ssS'name' +p47811 +(dp47812 +S'editable' +p47813 +I01 +sS'value' +p47814 +S'Cc' +p47815 +ssS'data_type' +p47816 +(dp47817 +S'editable' +p47818 +I00 +sS'value' +p47819 +S'multi_entity' +p47820 +ssS'entity_type' +p47821 +(dp47822 +S'editable' +p47823 +I00 +sS'value' +p47824 +S'Asset' +p47825 +ssS'editable' +p47826 +(dp47827 +S'editable' +p47828 +I00 +sS'value' +p47829 +I01 +ssS'unique' +p47830 +(dp47831 +S'editable' +p47832 +I00 +sS'value' +p47833 +I00 +ssS'properties' +p47834 +(dp47835 +S'default_value' +p47836 +(dp47837 +S'editable' +p47838 +I00 +sS'value' +p47839 +NssS'summary_default' +p47840 +(dp47841 +S'editable' +p47842 +I01 +sS'value' +p47843 +S'none' +p47844 +ssS'valid_types' +p47845 +(dp47846 +S'editable' +p47847 +I01 +sS'value' +p47848 +(lp47849 +S'Group' +p47850 +aS'HumanUser' +p47851 +asssS'description' +p47852 +(dp47853 +S'editable' +p47854 +I01 +sS'value' +p47855 +g47 +sssS'shoot_days' +p47856 +(dp47857 +S'mandatory' +p47858 +(dp47859 +S'editable' +p47860 +I00 +sS'value' +p47861 +I00 +ssS'name' +p47862 +(dp47863 +S'editable' +p47864 +I01 +sS'value' +p47865 +S'Shoot Days' +p47866 +ssS'data_type' +p47867 +(dp47868 +S'editable' +p47869 +I00 +sS'value' +p47870 +S'multi_entity' +p47871 +ssS'entity_type' +p47872 +(dp47873 +S'editable' +p47874 +I00 +sS'value' +p47875 +S'Asset' +p47876 +ssS'editable' +p47877 +(dp47878 +S'editable' +p47879 +I00 +sS'value' +p47880 +I01 +ssS'unique' +p47881 +(dp47882 +S'editable' +p47883 +I00 +sS'value' +p47884 +I00 +ssS'properties' +p47885 +(dp47886 +S'default_value' +p47887 +(dp47888 +S'editable' +p47889 +I00 +sS'value' +p47890 +NssS'summary_default' +p47891 +(dp47892 +S'editable' +p47893 +I01 +sS'value' +p47894 +S'none' +p47895 +ssS'valid_types' +p47896 +(dp47897 +S'editable' +p47898 +I01 +sS'value' +p47899 +(lp47900 +S'ShootDay' +p47901 +asssS'description' +p47902 +(dp47903 +S'editable' +p47904 +I01 +sS'value' +p47905 +g47 +sssS'step_0' +p47906 +(dp47907 +S'mandatory' +p47908 +(dp47909 +S'editable' +p47910 +I00 +sS'value' +p47911 +I00 +ssS'name' +p47912 +(dp47913 +S'editable' +p47914 +I01 +sS'value' +p47915 +S'ALL TASKS' +p47916 +ssS'data_type' +p47917 +(dp47918 +S'editable' +p47919 +I00 +sS'value' +p47920 +S'pivot_column' +p47921 +ssS'entity_type' +p47922 +(dp47923 +S'editable' +p47924 +I00 +sS'value' +p47925 +S'Asset' +p47926 +ssS'editable' +p47927 +(dp47928 +S'editable' +p47929 +I00 +sS'value' +p47930 +I00 +ssS'unique' +p47931 +(dp47932 +S'editable' +p47933 +I00 +sS'value' +p47934 +I00 +ssS'properties' +p47935 +(dp47936 +S'default_value' +p47937 +(dp47938 +S'editable' +p47939 +I00 +sS'value' +p47940 +NssS'summary_default' +p47941 +(dp47942 +S'editable' +p47943 +I00 +sS'value' +p47944 +S'none' +p47945 +sssS'description' +p47946 +(dp47947 +S'editable' +p47948 +I01 +sS'value' +p47949 +g47 +sssS'tag_list' +p47950 +(dp47951 +S'mandatory' +p47952 +(dp47953 +S'editable' +p47954 +I00 +sS'value' +p47955 +I00 +ssS'name' +p47956 +(dp47957 +S'editable' +p47958 +I01 +sS'value' +p47959 +S'Tags' +p47960 +ssS'data_type' +p47961 +(dp47962 +S'editable' +p47963 +I00 +sS'value' +p47964 +S'tag_list' +p47965 +ssS'entity_type' +p47966 +(dp47967 +S'editable' +p47968 +I00 +sS'value' +p47969 +S'Asset' +p47970 +ssS'editable' +p47971 +(dp47972 +S'editable' +p47973 +I00 +sS'value' +p47974 +I01 +ssS'unique' +p47975 +(dp47976 +S'editable' +p47977 +I00 +sS'value' +p47978 +I00 +ssS'properties' +p47979 +(dp47980 +S'default_value' +p47981 +(dp47982 +S'editable' +p47983 +I00 +sS'value' +p47984 +NssS'summary_default' +p47985 +(dp47986 +S'editable' +p47987 +I01 +sS'value' +p47988 +S'none' +p47989 +ssS'valid_types' +p47990 +(dp47991 +S'editable' +p47992 +I01 +sS'value' +p47993 +(lp47994 +S'Tag' +p47995 +asssS'description' +p47996 +(dp47997 +S'editable' +p47998 +I01 +sS'value' +p47999 +g47 +sssS'assets' +p48000 +(dp48001 +S'mandatory' +p48002 +(dp48003 +S'editable' +p48004 +I00 +sS'value' +p48005 +I00 +ssS'name' +p48006 +(dp48007 +S'editable' +p48008 +I01 +sS'value' +p48009 +S'Sub Assets' +p48010 +ssS'data_type' +p48011 +(dp48012 +S'editable' +p48013 +I00 +sS'value' +p48014 +S'multi_entity' +p48015 +ssS'entity_type' +p48016 +(dp48017 +S'editable' +p48018 +I00 +sS'value' +p48019 +S'Asset' +p48020 +ssS'editable' +p48021 +(dp48022 +S'editable' +p48023 +I00 +sS'value' +p48024 +I01 +ssS'unique' +p48025 +(dp48026 +S'editable' +p48027 +I00 +sS'value' +p48028 +I00 +ssS'properties' +p48029 +(dp48030 +S'default_value' +p48031 +(dp48032 +S'editable' +p48033 +I00 +sS'value' +p48034 +NssS'summary_default' +p48035 +(dp48036 +S'editable' +p48037 +I01 +sS'value' +p48038 +S'none' +p48039 +ssS'valid_types' +p48040 +(dp48041 +S'editable' +p48042 +I01 +sS'value' +p48043 +(lp48044 +S'Asset' +p48045 +asssS'description' +p48046 +(dp48047 +S'editable' +p48048 +I01 +sS'value' +p48049 +g47 +sssS'step_9' +p48050 +(dp48051 +S'mandatory' +p48052 +(dp48053 +S'editable' +p48054 +I00 +sS'value' +p48055 +I00 +ssS'name' +p48056 +(dp48057 +S'editable' +p48058 +I01 +sS'value' +p48059 +S'Art' +p48060 +ssS'data_type' +p48061 +(dp48062 +S'editable' +p48063 +I00 +sS'value' +p48064 +S'pivot_column' +p48065 +ssS'entity_type' +p48066 +(dp48067 +S'editable' +p48068 +I00 +sS'value' +p48069 +S'Asset' +p48070 +ssS'editable' +p48071 +(dp48072 +S'editable' +p48073 +I00 +sS'value' +p48074 +I00 +ssS'unique' +p48075 +(dp48076 +S'editable' +p48077 +I00 +sS'value' +p48078 +I00 +ssS'properties' +p48079 +(dp48080 +S'default_value' +p48081 +(dp48082 +S'editable' +p48083 +I00 +sS'value' +p48084 +NssS'summary_default' +p48085 +(dp48086 +S'editable' +p48087 +I00 +sS'value' +p48088 +S'none' +p48089 +sssS'description' +p48090 +(dp48091 +S'editable' +p48092 +I01 +sS'value' +p48093 +g47 +sssS'notes' +p48094 +(dp48095 +S'mandatory' +p48096 +(dp48097 +S'editable' +p48098 +I00 +sS'value' +p48099 +I00 +ssS'name' +p48100 +(dp48101 +S'editable' +p48102 +I01 +sS'value' +p48103 +S'Notes' +p48104 +ssS'data_type' +p48105 +(dp48106 +S'editable' +p48107 +I00 +sS'value' +p48108 +S'multi_entity' +p48109 +ssS'entity_type' +p48110 +(dp48111 +S'editable' +p48112 +I00 +sS'value' +p48113 +S'Asset' +p48114 +ssS'editable' +p48115 +(dp48116 +S'editable' +p48117 +I00 +sS'value' +p48118 +I01 +ssS'unique' +p48119 +(dp48120 +S'editable' +p48121 +I00 +sS'value' +p48122 +I00 +ssS'properties' +p48123 +(dp48124 +S'default_value' +p48125 +(dp48126 +S'editable' +p48127 +I00 +sS'value' +p48128 +NssS'summary_default' +p48129 +(dp48130 +S'editable' +p48131 +I01 +sS'value' +p48132 +S'none' +p48133 +ssS'valid_types' +p48134 +(dp48135 +S'editable' +p48136 +I01 +sS'value' +p48137 +(lp48138 +S'Note' +p48139 +asssS'description' +p48140 +(dp48141 +S'editable' +p48142 +I01 +sS'value' +p48143 +g47 +sssS'scenes' +p48144 +(dp48145 +S'mandatory' +p48146 +(dp48147 +S'editable' +p48148 +I00 +sS'value' +p48149 +I00 +ssS'name' +p48150 +(dp48151 +S'editable' +p48152 +I01 +sS'value' +p48153 +S'Scenes' +p48154 +ssS'data_type' +p48155 +(dp48156 +S'editable' +p48157 +I00 +sS'value' +p48158 +S'multi_entity' +p48159 +ssS'entity_type' +p48160 +(dp48161 +S'editable' +p48162 +I00 +sS'value' +p48163 +S'Asset' +p48164 +ssS'editable' +p48165 +(dp48166 +S'editable' +p48167 +I00 +sS'value' +p48168 +I01 +ssS'unique' +p48169 +(dp48170 +S'editable' +p48171 +I00 +sS'value' +p48172 +I00 +ssS'properties' +p48173 +(dp48174 +S'default_value' +p48175 +(dp48176 +S'editable' +p48177 +I00 +sS'value' +p48178 +NssS'summary_default' +p48179 +(dp48180 +S'editable' +p48181 +I01 +sS'value' +p48182 +S'none' +p48183 +ssS'valid_types' +p48184 +(dp48185 +S'editable' +p48186 +I01 +sS'value' +p48187 +(lp48188 +S'Scene' +p48189 +asssS'description' +p48190 +(dp48191 +S'editable' +p48192 +I01 +sS'value' +p48193 +g47 +sssS'project' +p48194 +(dp48195 +S'mandatory' +p48196 +(dp48197 +S'editable' +p48198 +I00 +sS'value' +p48199 +I00 +ssS'name' +p48200 +(dp48201 +S'editable' +p48202 +I01 +sS'value' +p48203 +S'Project' +p48204 +ssS'data_type' +p48205 +(dp48206 +S'editable' +p48207 +I00 +sS'value' +p48208 +S'entity' +p48209 +ssS'entity_type' +p48210 +(dp48211 +S'editable' +p48212 +I00 +sS'value' +p48213 +S'Asset' +p48214 +ssS'editable' +p48215 +(dp48216 +S'editable' +p48217 +I00 +sS'value' +p48218 +I01 +ssS'unique' +p48219 +(dp48220 +S'editable' +p48221 +I00 +sS'value' +p48222 +I00 +ssS'properties' +p48223 +(dp48224 +S'default_value' +p48225 +(dp48226 +S'editable' +p48227 +I00 +sS'value' +p48228 +NssS'summary_default' +p48229 +(dp48230 +S'editable' +p48231 +I01 +sS'value' +p48232 +S'none' +p48233 +ssS'valid_types' +p48234 +(dp48235 +S'editable' +p48236 +I01 +sS'value' +p48237 +(lp48238 +S'Project' +p48239 +asssS'description' +p48240 +(dp48241 +S'editable' +p48242 +I01 +sS'value' +p48243 +g47 +sssS'filmstrip_image' +p48244 +(dp48245 +S'mandatory' +p48246 +(dp48247 +S'editable' +p48248 +I00 +sS'value' +p48249 +I00 +ssS'name' +p48250 +(dp48251 +S'editable' +p48252 +I01 +sS'value' +p48253 +S'Filmstrip Thumbnail' +p48254 +ssS'data_type' +p48255 +(dp48256 +S'editable' +p48257 +I00 +sS'value' +p48258 +S'image' +p48259 +ssS'entity_type' +p48260 +(dp48261 +S'editable' +p48262 +I00 +sS'value' +p48263 +S'Asset' +p48264 +ssS'editable' +p48265 +(dp48266 +S'editable' +p48267 +I00 +sS'value' +p48268 +I01 +ssS'unique' +p48269 +(dp48270 +S'editable' +p48271 +I00 +sS'value' +p48272 +I00 +ssS'properties' +p48273 +(dp48274 +S'default_value' +p48275 +(dp48276 +S'editable' +p48277 +I00 +sS'value' +p48278 +NssS'summary_default' +p48279 +(dp48280 +S'editable' +p48281 +I01 +sS'value' +p48282 +S'none' +p48283 +sssS'description' +p48284 +(dp48285 +S'editable' +p48286 +I01 +sS'value' +p48287 +g47 +sssS'shots' +p48288 +(dp48289 +S'mandatory' +p48290 +(dp48291 +S'editable' +p48292 +I00 +sS'value' +p48293 +I00 +ssS'name' +p48294 +(dp48295 +S'editable' +p48296 +I01 +sS'value' +p48297 +S'Shots' +p48298 +ssS'data_type' +p48299 +(dp48300 +S'editable' +p48301 +I00 +sS'value' +p48302 +S'multi_entity' +p48303 +ssS'entity_type' +p48304 +(dp48305 +S'editable' +p48306 +I00 +sS'value' +p48307 +S'Asset' +p48308 +ssS'editable' +p48309 +(dp48310 +S'editable' +p48311 +I00 +sS'value' +p48312 +I01 +ssS'unique' +p48313 +(dp48314 +S'editable' +p48315 +I00 +sS'value' +p48316 +I00 +ssS'properties' +p48317 +(dp48318 +S'default_value' +p48319 +(dp48320 +S'editable' +p48321 +I00 +sS'value' +p48322 +NssS'summary_default' +p48323 +(dp48324 +S'editable' +p48325 +I01 +sS'value' +p48326 +S'none' +p48327 +ssS'valid_types' +p48328 +(dp48329 +S'editable' +p48330 +I01 +sS'value' +p48331 +(lp48332 +S'Shot' +p48333 +asssS'description' +p48334 +(dp48335 +S'editable' +p48336 +I01 +sS'value' +p48337 +g47 +sssS'sg_asset_library' +p48338 +(dp48339 +S'mandatory' +p48340 +(dp48341 +S'editable' +p48342 +I00 +sS'value' +p48343 +I00 +ssS'name' +p48344 +(dp48345 +S'editable' +p48346 +I01 +sS'value' +p48347 +S'Asset Library' +p48348 +ssS'data_type' +p48349 +(dp48350 +S'editable' +p48351 +I00 +sS'value' +p48352 +S'entity' +p48353 +ssS'entity_type' +p48354 +(dp48355 +S'editable' +p48356 +I00 +sS'value' +p48357 +S'Asset' +p48358 +ssS'editable' +p48359 +(dp48360 +S'editable' +p48361 +I00 +sS'value' +p48362 +I01 +ssS'unique' +p48363 +(dp48364 +S'editable' +p48365 +I00 +sS'value' +p48366 +I00 +ssS'properties' +p48367 +(dp48368 +S'default_value' +p48369 +(dp48370 +S'editable' +p48371 +I00 +sS'value' +p48372 +NssS'summary_default' +p48373 +(dp48374 +S'editable' +p48375 +I01 +sS'value' +p48376 +S'none' +p48377 +ssS'valid_types' +p48378 +(dp48379 +S'editable' +p48380 +I01 +sS'value' +p48381 +(lp48382 +S'AssetLibrary' +p48383 +asssS'description' +p48384 +(dp48385 +S'editable' +p48386 +I01 +sS'value' +p48387 +g47 +sssS'sg_asset_type' +p48388 +(dp48389 +S'mandatory' +p48390 +(dp48391 +S'editable' +p48392 +I00 +sS'value' +p48393 +I00 +ssS'name' +p48394 +(dp48395 +S'editable' +p48396 +I01 +sS'value' +p48397 +S'Type' +p48398 +ssS'data_type' +p48399 +(dp48400 +S'editable' +p48401 +I00 +sS'value' +p48402 +S'list' +p48403 +ssS'entity_type' +p48404 +(dp48405 +S'editable' +p48406 +I00 +sS'value' +p48407 +S'Asset' +p48408 +ssS'editable' +p48409 +(dp48410 +S'editable' +p48411 +I00 +sS'value' +p48412 +I01 +ssS'unique' +p48413 +(dp48414 +S'editable' +p48415 +I00 +sS'value' +p48416 +I00 +ssS'properties' +p48417 +(dp48418 +S'default_value' +p48419 +(dp48420 +S'editable' +p48421 +I00 +sS'value' +p48422 +NssS'valid_values' +p48423 +(dp48424 +S'editable' +p48425 +I01 +sS'value' +p48426 +(lp48427 +S'Character' +p48428 +aS'Vehicle' +p48429 +aS'Prop' +p48430 +aS'Environment' +p48431 +aS'Matte Painting' +p48432 +assS'summary_default' +p48433 +(dp48434 +S'editable' +p48435 +I01 +sS'value' +p48436 +S'none' +p48437 +sssS'description' +p48438 +(dp48439 +S'editable' +p48440 +I01 +sS'value' +p48441 +g47 +sssS'sg_library' +p48442 +(dp48443 +S'mandatory' +p48444 +(dp48445 +S'editable' +p48446 +I00 +sS'value' +p48447 +I00 +ssS'name' +p48448 +(dp48449 +S'editable' +p48450 +I01 +sS'value' +p48451 +S'Library' +p48452 +ssS'data_type' +p48453 +(dp48454 +S'editable' +p48455 +I00 +sS'value' +p48456 +S'entity' +p48457 +ssS'entity_type' +p48458 +(dp48459 +S'editable' +p48460 +I00 +sS'value' +p48461 +S'Asset' +p48462 +ssS'editable' +p48463 +(dp48464 +S'editable' +p48465 +I00 +sS'value' +p48466 +I01 +ssS'unique' +p48467 +(dp48468 +S'editable' +p48469 +I00 +sS'value' +p48470 +I00 +ssS'properties' +p48471 +(dp48472 +S'default_value' +p48473 +(dp48474 +S'editable' +p48475 +I00 +sS'value' +p48476 +NssS'summary_default' +p48477 +(dp48478 +S'editable' +p48479 +I01 +sS'value' +p48480 +S'none' +p48481 +ssS'valid_types' +p48482 +(dp48483 +S'editable' +p48484 +I01 +sS'value' +p48485 +(lp48486 +S'AssetLibrary' +p48487 +asssS'description' +p48488 +(dp48489 +S'editable' +p48490 +I01 +sS'value' +p48491 +g47 +sssS'created_at' +p48492 +(dp48493 +S'mandatory' +p48494 +(dp48495 +S'editable' +p48496 +I00 +sS'value' +p48497 +I00 +ssS'name' +p48498 +(dp48499 +S'editable' +p48500 +I01 +sS'value' +p48501 +S'Date Created' +p48502 +ssS'data_type' +p48503 +(dp48504 +S'editable' +p48505 +I00 +sS'value' +p48506 +S'date_time' +p48507 +ssS'entity_type' +p48508 +(dp48509 +S'editable' +p48510 +I00 +sS'value' +p48511 +S'Asset' +p48512 +ssS'editable' +p48513 +(dp48514 +S'editable' +p48515 +I00 +sS'value' +p48516 +I00 +ssS'unique' +p48517 +(dp48518 +S'editable' +p48519 +I00 +sS'value' +p48520 +I00 +ssS'properties' +p48521 +(dp48522 +S'default_value' +p48523 +(dp48524 +S'editable' +p48525 +I00 +sS'value' +p48526 +NssS'summary_default' +p48527 +(dp48528 +S'editable' +p48529 +I01 +sS'value' +p48530 +S'none' +p48531 +sssS'description' +p48532 +(dp48533 +S'editable' +p48534 +I01 +sS'value' +p48535 +g47 +ssss. \ No newline at end of file diff --git a/tests/mockgun/schema_entity.pickle b/tests/mockgun/schema_entity.pickle new file mode 100644 index 000000000..1e528ce03 --- /dev/null +++ b/tests/mockgun/schema_entity.pickle @@ -0,0 +1,1003 @@ +(dp0 +S'Playlist' +p1 +(dp2 +S'name' +p3 +(dp4 +S'editable' +p5 +I00 +sS'value' +p6 +S'Playlist' +p7 +sssS'AppWelcomeUserConnection' +p8 +(dp9 +S'name' +p10 +(dp11 +S'editable' +p12 +I00 +sS'value' +p13 +S'App Welcome User Connection' +p14 +sssS'Group' +p15 +(dp16 +S'name' +p17 +(dp18 +S'editable' +p19 +I00 +sS'value' +p20 +S'Group' +p21 +sssS'PhysicalAssetMocapTakeConnection' +p22 +(dp23 +S'name' +p24 +(dp25 +S'editable' +p26 +I00 +sS'value' +p27 +S'Physical Asset Mocap Take Connection' +p28 +sssS'CustomEntity05' +p29 +(dp30 +S'name' +p31 +(dp32 +S'editable' +p33 +I00 +sS'value' +p34 +S'Custom Entity05' +p35 +sssS'Note' +p36 +(dp37 +S'name' +p38 +(dp39 +S'editable' +p40 +I00 +sS'value' +p41 +S'Note' +p42 +sssS'TaskDependency' +p43 +(dp44 +S'name' +p45 +(dp46 +S'editable' +p47 +I00 +sS'value' +p48 +S'Task Dependency' +p49 +sssS'PageHit' +p50 +(dp51 +S'name' +p52 +(dp53 +S'editable' +p54 +I00 +sS'value' +p55 +S'Page Hit' +p56 +sssS'ActionMenuItem' +p57 +(dp58 +S'name' +p59 +(dp60 +S'editable' +p61 +I00 +sS'value' +p62 +S'Action Menu Item' +p63 +sssS'Attachment' +p64 +(dp65 +S'name' +p66 +(dp67 +S'editable' +p68 +I00 +sS'value' +p69 +S'File' +p70 +sssS'AssetMocapTakeConnection' +p71 +(dp72 +S'name' +p73 +(dp74 +S'editable' +p75 +I00 +sS'value' +p76 +S'Asset Mocap Take Connection' +p77 +sssS'Department' +p78 +(dp79 +S'name' +p80 +(dp81 +S'editable' +p82 +I00 +sS'value' +p83 +S'Department' +p84 +sssS'AssetSceneConnection' +p85 +(dp86 +S'name' +p87 +(dp88 +S'editable' +p89 +I00 +sS'value' +p90 +S'Asset Scene Connection' +p91 +sssS'CameraMocapTakeConnection' +p92 +(dp93 +S'name' +p94 +(dp95 +S'editable' +p96 +I00 +sS'value' +p97 +S'Camera Mocap Take Connection' +p98 +sssS'Booking' +p99 +(dp100 +S'name' +p101 +(dp102 +S'editable' +p103 +I00 +sS'value' +p104 +S'Booking' +p105 +sssS'CutVersionConnection' +p106 +(dp107 +S'name' +p108 +(dp109 +S'editable' +p110 +I00 +sS'value' +p111 +S'Cut Version Connection' +p112 +sssS'TimeLog' +p113 +(dp114 +S'name' +p115 +(dp116 +S'editable' +p117 +I00 +sS'value' +p118 +S'Time Log' +p119 +sssS'PlaylistVersionConnection' +p120 +(dp121 +S'name' +p122 +(dp123 +S'editable' +p124 +I00 +sS'value' +p125 +S'Playlist Version Connection' +p126 +sssS'CustomNonProjectEntity02' +p127 +(dp128 +S'name' +p129 +(dp130 +S'editable' +p131 +I00 +sS'value' +p132 +S'Custom Non Project Entity02' +p133 +sssS'AssetElementConnection' +p134 +(dp135 +S'name' +p136 +(dp137 +S'editable' +p138 +I00 +sS'value' +p139 +S'Asset Element Connection' +p140 +sssS'ReleaseTicketConnection' +p141 +(dp142 +S'name' +p143 +(dp144 +S'editable' +p145 +I00 +sS'value' +p146 +S'Release Ticket Connection' +p147 +sssS'RevisionRevisionConnection' +p148 +(dp149 +S'name' +p150 +(dp151 +S'editable' +p152 +I00 +sS'value' +p153 +S'Revision Revision Connection' +p154 +sssS'ProjectUserConnection' +p155 +(dp156 +S'name' +p157 +(dp158 +S'editable' +p159 +I00 +sS'value' +p160 +S'Project User Connection' +p161 +sssS'MocapTakeRangeShotConnection' +p162 +(dp163 +S'name' +p164 +(dp165 +S'editable' +p166 +I00 +sS'value' +p167 +S'Mocap Take Range Shot Connection' +p168 +sssS'PublishedFileDependency' +p169 +(dp170 +S'name' +p171 +(dp172 +S'editable' +p173 +I00 +sS'value' +p174 +S'Published File Dependency' +p175 +sssS'Step' +p176 +(dp177 +S'name' +p178 +(dp179 +S'editable' +p180 +I00 +sS'value' +p181 +S'Step' +p182 +sssS'AssetLibrary' +p183 +(dp184 +S'name' +p185 +(dp186 +S'editable' +p187 +I00 +sS'value' +p188 +S'Asset Library' +p189 +sssS'PerformerMocapTakeConnection' +p190 +(dp191 +S'name' +p192 +(dp193 +S'editable' +p194 +I00 +sS'value' +p195 +S'Performer Mocap Take Connection' +p196 +sssS'Phase' +p197 +(dp198 +S'name' +p199 +(dp200 +S'editable' +p201 +I00 +sS'value' +p202 +S'Phase' +p203 +sssS'PublishedFile' +p204 +(dp205 +S'name' +p206 +(dp207 +S'editable' +p208 +I00 +sS'value' +p209 +S'Published File' +p210 +sssS'ShootDaySceneConnection' +p211 +(dp212 +S'name' +p213 +(dp214 +S'editable' +p215 +I00 +sS'value' +p216 +S'Shoot Day Scene Connection' +p217 +sssS'AssetShotConnection' +p218 +(dp219 +S'name' +p220 +(dp221 +S'editable' +p222 +I00 +sS'value' +p223 +S'Asset Shot Connection' +p224 +sssS'TicketTicketConnection' +p225 +(dp226 +S'name' +p227 +(dp228 +S'editable' +p229 +I00 +sS'value' +p230 +S'Ticket Ticket Connection' +p231 +sssS'AssetBlendshapeConnection' +p232 +(dp233 +S'name' +p234 +(dp235 +S'editable' +p236 +I00 +sS'value' +p237 +S'Asset Blendshape Connection' +p238 +sssS'PageSetting' +p239 +(dp240 +S'name' +p241 +(dp242 +S'editable' +p243 +I00 +sS'value' +p244 +S'Page Setting' +p245 +sssS'Status' +p246 +(dp247 +S'name' +p248 +(dp249 +S'editable' +p250 +I00 +sS'value' +p251 +S'Status' +p252 +sssS'Reply' +p253 +(dp254 +S'name' +p255 +(dp256 +S'editable' +p257 +I00 +sS'value' +p258 +S'Reply' +p259 +sssS'Task' +p260 +(dp261 +S'name' +p262 +(dp263 +S'editable' +p264 +I00 +sS'value' +p265 +S'Task' +p266 +sssS'CustomNonProjectEntity01' +p267 +(dp268 +S'name' +p269 +(dp270 +S'editable' +p271 +I00 +sS'value' +p272 +S'Custom Non Project Entity01' +p273 +sssS'ApiUser' +p274 +(dp275 +S'name' +p276 +(dp277 +S'editable' +p278 +I00 +sS'value' +p279 +S'Script' +p280 +sssS'CustomNonProjectEntity03' +p281 +(dp282 +S'name' +p283 +(dp284 +S'editable' +p285 +I00 +sS'value' +p286 +S'Custom Non Project Entity03' +p287 +sssS'LaunchShotConnection' +p288 +(dp289 +S'name' +p290 +(dp291 +S'editable' +p292 +I00 +sS'value' +p293 +S'Launch Shot Connection' +p294 +sssS'ShotShotConnection' +p295 +(dp296 +S'name' +p297 +(dp298 +S'editable' +p299 +I00 +sS'value' +p300 +S'Shot Shot Connection' +p301 +sssS'PerformerRoutineConnection' +p302 +(dp303 +S'name' +p304 +(dp305 +S'editable' +p306 +I00 +sS'value' +p307 +S'Performer Routine Connection' +p308 +sssS'PublishedFileType' +p309 +(dp310 +S'name' +p311 +(dp312 +S'editable' +p313 +I00 +sS'value' +p314 +S'Published File Type' +p315 +sssS'Element' +p316 +(dp317 +S'name' +p318 +(dp319 +S'editable' +p320 +I00 +sS'value' +p321 +S'Element' +p322 +sssS'TankType' +p323 +(dp324 +S'name' +p325 +(dp326 +S'editable' +p327 +I00 +sS'value' +p328 +S'Tank Type' +p329 +sssS'Icon' +p330 +(dp331 +S'name' +p332 +(dp333 +S'editable' +p334 +I00 +sS'value' +p335 +S'Icon' +p336 +sssS'LocalStorage' +p337 +(dp338 +S'name' +p339 +(dp340 +S'editable' +p341 +I00 +sS'value' +p342 +S'Local Storage' +p343 +sssS'TaskTemplate' +p344 +(dp345 +S'name' +p346 +(dp347 +S'editable' +p348 +I00 +sS'value' +p349 +S'Task Template' +p350 +sssS'RevisionTicketConnection' +p351 +(dp352 +S'name' +p353 +(dp354 +S'editable' +p355 +I00 +sS'value' +p356 +S'Revision Ticket Connection' +p357 +sssS'PerformerShootDayConnection' +p358 +(dp359 +S'name' +p360 +(dp361 +S'editable' +p362 +I00 +sS'value' +p363 +S'Performer Shoot Day Connection' +p364 +sssS'PipelineConfiguration' +p365 +(dp366 +S'name' +p367 +(dp368 +S'editable' +p369 +I00 +sS'value' +p370 +S'Pipeline Configuration' +p371 +sssS'LaunchSceneConnection' +p372 +(dp373 +S'name' +p374 +(dp375 +S'editable' +p376 +I00 +sS'value' +p377 +S'Launch Scene Connection' +p378 +sssS'GroupUserConnection' +p379 +(dp380 +S'name' +p381 +(dp382 +S'editable' +p383 +I00 +sS'value' +p384 +S'Group User Connection' +p385 +sssS'AssetSequenceConnection' +p386 +(dp387 +S'name' +p388 +(dp389 +S'editable' +p390 +I00 +sS'value' +p391 +S'Asset Sequence Connection' +p392 +sssS'Page' +p393 +(dp394 +S'name' +p395 +(dp396 +S'editable' +p397 +I00 +sS'value' +p398 +S'Page' +p399 +sssS'CustomEntity02' +p400 +(dp401 +S'name' +p402 +(dp403 +S'editable' +p404 +I00 +sS'value' +p405 +S'Custom Entity02' +p406 +sssS'CustomEntity03' +p407 +(dp408 +S'name' +p409 +(dp410 +S'editable' +p411 +I00 +sS'value' +p412 +S'Custom Entity03' +p413 +sssS'FilesystemLocation' +p414 +(dp415 +S'name' +p416 +(dp417 +S'editable' +p418 +I00 +sS'value' +p419 +S'Filesystem Location' +p420 +sssS'CustomEntity01' +p421 +(dp422 +S'name' +p423 +(dp424 +S'editable' +p425 +I00 +sS'value' +p426 +S'Disk Location' +p427 +sssS'Shot' +p428 +(dp429 +S'name' +p430 +(dp431 +S'editable' +p432 +I00 +sS'value' +p433 +S'Shot' +p434 +sssS'TankPublishedFile' +p435 +(dp436 +S'name' +p437 +(dp438 +S'editable' +p439 +I00 +sS'value' +p440 +S'Tank Published File' +p441 +sssS'CustomEntity04' +p442 +(dp443 +S'name' +p444 +(dp445 +S'editable' +p446 +I00 +sS'value' +p447 +S'Custom Entity04' +p448 +sssS'Sequence' +p449 +(dp450 +S'name' +p451 +(dp452 +S'editable' +p453 +I00 +sS'value' +p454 +S'Sequence' +p455 +sssS'BannerUserConnection' +p456 +(dp457 +S'name' +p458 +(dp459 +S'editable' +p460 +I00 +sS'value' +p461 +S'Banner User Connection' +p462 +sssS'AssetAssetConnection' +p463 +(dp464 +S'name' +p465 +(dp466 +S'editable' +p467 +I00 +sS'value' +p468 +S'Asset Asset Connection' +p469 +sssS'Scene' +p470 +(dp471 +S'name' +p472 +(dp473 +S'editable' +p474 +I00 +sS'value' +p475 +S'Scene' +p476 +sssS'Project' +p477 +(dp478 +S'name' +p479 +(dp480 +S'editable' +p481 +I00 +sS'value' +p482 +S'Project' +p483 +sssS'Version' +p484 +(dp485 +S'name' +p486 +(dp487 +S'editable' +p488 +I00 +sS'value' +p489 +S'Version' +p490 +sssS'ElementShotConnection' +p491 +(dp492 +S'name' +p493 +(dp494 +S'editable' +p495 +I00 +sS'value' +p496 +S'Element Shot Connection' +p497 +sssS'HumanUser' +p498 +(dp499 +S'name' +p500 +(dp501 +S'editable' +p502 +I00 +sS'value' +p503 +S'Person' +p504 +sssS'PermissionRuleSet' +p505 +(dp506 +S'name' +p507 +(dp508 +S'editable' +p509 +I00 +sS'value' +p510 +S'Permission Rule Set' +p511 +sssS'EventLogEntry' +p512 +(dp513 +S'name' +p514 +(dp515 +S'editable' +p516 +I00 +sS'value' +p517 +S'Event Log Entry' +p518 +sssS'TankDependency' +p519 +(dp520 +S'name' +p521 +(dp522 +S'editable' +p523 +I00 +sS'value' +p524 +S'Tank Dependency' +p525 +sssS'AssetShootDayConnection' +p526 +(dp527 +S'name' +p528 +(dp529 +S'editable' +p530 +I00 +sS'value' +p531 +S'Asset Shoot Day Connection' +p532 +sssS'Asset' +p533 +(dp534 +S'name' +p535 +(dp536 +S'editable' +p537 +I00 +sS'value' +p538 +S'Asset' +p539 +sss. \ No newline at end of file diff --git a/tests/test_mockgun.py b/tests/test_mockgun.py new file mode 100644 index 000000000..617428e09 --- /dev/null +++ b/tests/test_mockgun.py @@ -0,0 +1,264 @@ +#! /opt/local/bin/python + +# ----------------------------------------------------------------------------- +# Copyright (c) 2009-2017, Shotgun Software Inc +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# - Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# - Neither the name of the Shotgun Software Inc nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ----------------------------------------------------------------------------- + +""" +Unit tests for Mockgun. Does not require an Internet connection +and can be run on their own by typing "python test_mockgun.py". +""" + +import re +import os +import unittest +from shotgun_api3.lib.mockgun import Shotgun as Mockgun +from shotgun_api3 import ShotgunError + + +def setUpModule(): + """ + Sets the Shotgun schema for this series of unit tests. + """ + mockgun_schema_folder = os.path.join( + os.path.dirname(__file__), + "mockgun" + ) + + Mockgun.set_schema_paths( + os.path.join(mockgun_schema_folder, "schema.pickle"), + os.path.join(mockgun_schema_folder, "schema_entity.pickle") + ) + + +# FIXME: This should probably be refactored into a base class for +# all test bases +class TestBaseWithExceptionTests(unittest.TestCase): + """ + Implements a Python 2.4 compatible assertRaisesRegexp like method. This + was introduced in Python 2.7. + """ + def assertRaisesRegexp(self, exception_type, re_msg, func): + try: + func() + except exception_type, exception: + matches = re.findall(re_msg, str(exception)) + if not matches: + self.fail("Expected exception to match '%s', got '%s' instead." % ( + re_msg, str(exception) + )) + except Exception, ex: + self.fail("Expected exception of type %s, got %s" % (exception_type, type(ex))) + else: + self.fail("Expected %s was not raised." % exception_type) + + +class TestValidateFilterSyntax(TestBaseWithExceptionTests): + """ + Tests filter syntax support. + """ + + def setUp(self): + """ + Creates tests data. + """ + super(TestValidateFilterSyntax, self).setUp() + + self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") + + self._mockgun.create("Shot", {"code": "shot"}) + + def test_filter_array_or_dict(self): + # Should not throw, even though it is pretty much + # empty. + self._mockgun.find( + "Shot", + [ + { + "filter_operator": "any", + "filters": [["code", "is", "shot"]] + }, + [ + "code", "is", "shot" + ] + ] + ) + + self.assertRaisesRegexp( + ShotgunError, + "Filters can only be lists or dictionaries, not int.", + lambda: self._mockgun.find( + "Shot", + [1] + ) + ) + + +class TestFilterOperator(TestBaseWithExceptionTests): + """ + Unit tests for the filter_operator filter syntax. + """ + + def setUp(self): + """ + Creates tests data. + """ + super(TestFilterOperator, self).setUp() + + self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") + + self._prj1_link = self._mockgun.create( + "Project", + { + "name": "prj1" + } + ) + + self._prj2_link = self._mockgun.create( + "Project", + { + "name": "prj2" + } + ) + + self._shot1 = self._mockgun.create( + "Shot", + { + "code": "shot1", + "project": self._prj1_link + } + ) + + self._shot2 = self._mockgun.create( + "Shot", + { + "code": "shot2", + "project": self._prj1_link + } + ) + + self._shot3 = self._mockgun.create( + "Shot", + { + "code": "shot3", + "project": self._prj2_link + } + ) + + def test_simple_filter_operators(self): + """ + Tests a simple use of the filter_operator. + """ + shots = self._mockgun.find( + "Shot", + [{ + "filter_operator": "any", + "filters": [ + ["code", "is", "shot1"], + ["code", "is", "shot2"] + ] + }] + ) + + self.assertEqual(len(shots), 2) + + shots = self._mockgun.find( + "Shot", + [{ + "filter_operator": "all", + "filters": [ + ["code", "is", "shot1"], + ["code", "is", "shot2"] + ] + }] + ) + + self.assertEqual(len(shots), 0) + + def test_nested_filter_operators(self): + """ + Tests a the use of the filter_operator nested + inside the filter_operator. + """ + shots = self._mockgun.find( + "Shot", + [ + { + "filter_operator": "any", + "filters": [ + { + "filter_operator": "all", + "filters": [ + ["code", "is", "shot1"], + ["project", "is", self._prj1_link] + ] + }, + { + "filter_operator": "all", + "filters": [ + ["code", "is", "shot3"], + ["project", "is", self._prj2_link] + ] + } + ] + } + ] + ) + + self.assertEqual(len(shots), 2) + + def test_invalid_operator(self): + + self.assertRaisesRegexp( + ShotgunError, + "Unknown filter_operator type: bad", + lambda: self._mockgun.find( + "Shot", + [ + { + "filter_operator": "bad", + "filters": [] + } + ]) + ) + + self.assertRaisesRegexp( + ShotgunError, + "Bad filter operator, requires keys 'filter_operator' and 'filters',", + lambda: self._mockgun.find( + "Shot", + [ + { + } + ]) + ) + + +if __name__ == '__main__': + unittest.main() From 37496444a4cc4d6694f43620a238d898351d5be1 Mon Sep 17 00:00:00 2001 From: daigles Date: Tue, 14 Feb 2017 11:53:21 -0500 Subject: [PATCH 153/389] For #38721: Added support for direct upload to S3 when feature activated on the server --- shotgun_api3/shotgun.py | 231 +++++++++++++++++++++++++++++++++------- 1 file changed, 195 insertions(+), 36 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 3442e8c29..796edba10 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -582,6 +582,7 @@ def server_info(self): >>> sg.server_info {'full_version': [6, 3, 15, 0], 's3_uploads_enabled': True, + 's3_direct_uploads_enabled': True, 'version': [6, 3, 15]} :returns: dict of server information from :class:`ServerCapabilities` object @@ -2023,26 +2024,16 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, url = urlparse.urlunparse((self.config.scheme, self.config.server, "/upload/share_thumbnail", None, None, None)) - # Perform the request - try: - resp = opener.open(url, params) - result = resp.read() - # response headers are in str(resp.info()).splitlines() - except urllib2.HTTPError, e: - if e.code == 500: - raise ShotgunError("Server encountered an internal error. " - "\n%s\n(%s)\n%s\n\n" % (url, self._sanitize_auth_params(params), e)) - else: - raise ShotgunError("Unanticipated error occurred %s" % (e)) + result = self._send_form(url, params) + + if not str(result).startswith("1"): + raise ShotgunError("Unable to share thumbnail: %s" % result) else: - if not str(result).startswith("1"): - raise ShotgunError("Unable to share thumbnail: %s" % result) - else: - # clearing thumbnail returns no attachment_id - try: - attachment_id = int(str(result).split(":")[1].split("\n")[0]) - except ValueError: - attachment_id = None + # clearing thumbnail returns no attachment_id + try: + attachment_id = int(str(result).split(":")[1].split("\n")[0]) + except ValueError: + attachment_id = None return attachment_id @@ -2155,6 +2146,121 @@ def upload(self, entity_type, entity_id, path, field_name=None, display_name=Non is_thumbnail = (field_name in ["thumb_image", "filmstrip_thumb_image", "image", "filmstrip_image"]) + # Version.sg_uploaded_movie is handled as a special case and uploaded + # directly to Cloud storage + if self.server_info["s3_direct_uploads_enabled"] \ + and entity_type == "Version" and field_name == "sg_uploaded_movie": + return self._upload_to_storage(entity_type, entity_id, path, field_name, display_name, + tag_list, is_thumbnail) + else: + return self._upload_to_sg(entity_type, entity_id, path, field_name, display_name, + tag_list, is_thumbnail) + + def _upload_to_storage(self, entity_type, entity_id, path, field_name, display_name, + tag_list, is_thumbnail): + """ + Internal function to upload a file to the Cloud storage and link it to the specified entity. + + :param str entity_type: Entity type to link the upload to. + :param int entity_id: Id of the entity to link the upload to. + :param str path: Full path to an existing non-empty file on disk to upload. + :param str field_name: The internal Shotgun field name on the entity to store the file in. + This field must be a File/Link field type. + :param str display_name: The display name to use for the file. Defaults to the file name. + :param str tag_list: comma-separated string of tags to assign to the file. + :param bool is_thumbnail: indicates if the attachment is a thumbnail. + :returns: Id of the Attachment entity that was created for the image. + :rtype: int + """ + + filename = os.path.basename(path) + + # Step 1: get the upload url + + upload_info = self._get_attachment_upload_info(is_thumbnail, filename) + + # Step 2: upload the file + + fd = open(path, "rb") + try: + content_type = mimetypes.guess_type(filename)[0] + content_type = content_type or "application/octet-stream" + file_size = os.fstat(fd.fileno())[stat.ST_SIZE] + + # Perform the request + opener = urllib2.build_opener(urllib2.HTTPHandler) + + request = urllib2.Request(upload_info["upload_url"], data=fd) + request.add_header("Content-Type", content_type) + request.add_header("Content-Length", file_size) + request.get_method = lambda: "PUT" + result = opener.open(request) + except urllib2.HTTPError, e: + if e.code == 500: + raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) + else: + raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) + finally: + fd.close() + + LOG.debug("File uploaded to Cloud storage: %s", filename) + + # Step 3: create the attachment + + url = urlparse.urlunparse((self.config.scheme, self.config.server, + "/upload/api_link_file", None, None, None)) + + params = { + "entity_type" : entity_type, + "entity_id" : entity_id, + "upload_link_info": upload_info['upload_info'] + } + + params.update(self._auth_params()) + + if is_thumbnail: + if field_name == "filmstrip_thumb_image" or field_name == "filmstrip_image": + params["filmstrip"] = True + else: + if display_name is None: + display_name = filename + # we allow linking to nothing for generic reference use cases + if field_name is not None: + params["field_name"] = field_name + params["display_name"] = display_name + # None gets converted to a string and added as a tag... + if tag_list: + params["tag_list"] = tag_list + + result = self._send_form(url, params) + if not str(result).startswith("1"): + raise ShotgunError("Could not upload file successfully, but " \ + "not sure why.\nPath: %s\nUrl: %s\nError: %s" % ( + path, url, str(result))) + + LOG.debug("Attachment linked to content on Cloud storage") + + attachment_id = int(str(result).split(":")[1].split("\n")[0]) + return attachment_id + + def _upload_to_sg(self, entity_type, entity_id, path, field_name, display_name, + tag_list, is_thumbnail): + """ + Internal function to upload a file to Shotgun and link it to the specified entity. + + :param str entity_type: Entity type to link the upload to. + :param int entity_id: Id of the entity to link the upload to. + :param str path: Full path to an existing non-empty file on disk to upload. + :param str field_name: The internal Shotgun field name on the entity to store the file in. + This field must be a File/Link field type. + :param str display_name: The display name to use for the file. Defaults to the file name. + :param str tag_list: comma-separated string of tags to assign to the file. + :param bool is_thumbnail: indicates if the attachment is a thumbnail. + + :returns: Id of the Attachment entity that was created for the image. + :rtype: int + """ + params = { "entity_type" : entity_type, "entity_id" : entity_id, @@ -2184,28 +2290,56 @@ def upload(self, entity_type, entity_id, path, field_name=None, display_name=Non params["file"] = open(path, "rb") - # Create opener with extended form post support - opener = self._build_opener(FormPostHandler) + result = self._send_form(url, params) - # Perform the request - try: - result = opener.open(url, params).read() - except urllib2.HTTPError, e: - if e.code == 500: - raise ShotgunError("Server encountered an internal error. " - "\n%s\n(%s)\n%s\n\n" % (url, self._sanitize_auth_params(params), e)) - else: - raise ShotgunError("Unanticipated error occurred uploading " - "%s: %s" % (path, e)) - else: - if not str(result).startswith("1"): - raise ShotgunError("Could not upload file successfully, but "\ - "not sure why.\nPath: %s\nUrl: %s\nError: %s" % ( - path, url, str(result))) + if not str(result).startswith("1"): + raise ShotgunError("Could not upload file successfully, but "\ + "not sure why.\nPath: %s\nUrl: %s\nError: %s" % ( + path, url, str(result))) attachment_id = int(str(result).split(":")[1].split("\n")[0]) return attachment_id + def _get_attachment_upload_info(self, is_thumbnail, filename): + """ + Internal function to get the information needed to upload a file to Cloud storage. + + :param bool is_thumbnail: indicates if the attachment is a thumbnail. + :param str filename: name of the file that will be uploaded. + + :returns: dictionary containing the upload url and + upload_info (passed back to the SG server once the upload is completed). + :rtype: dict + """ + + if is_thumbnail: + upload_type = "Thumbnail" + else: + upload_type = "Attachment" + + params = { + "upload_type" : upload_type, + "filename" : filename + } + + params.update(self._auth_params()) + + upload_url = "/upload/api_get_upload_link_info" + url = urlparse.urlunparse((self.config.scheme, self.config.server, + upload_url, None, None, None)) + + upload_info = self._send_form(url, params) + if not str(upload_info).startswith("1"): + raise ShotgunError("Could not get upload_url but " \ + "not sure why.\nPath: %s\nUrl: %s\nError: %s" % ( + path, url, str(upload_info))) + + LOG.debug("Completed rpc call to %s" % (upload_url)) + return { + "upload_url" : str(upload_info).split("\n")[1], + "upload_info" : upload_info + } + def download_attachment(self, attachment=False, file_path=None, attachment_id=None): """ Download the file associated with a Shotgun Attachment. @@ -3363,6 +3497,31 @@ def _dict_to_extra_data(self, d, key_name="value"): """ return dict([(k, {key_name: v}) for (k,v) in (d or {}).iteritems()]) + def _send_form(self, url, params): + """ + Utility function to send a Form to Shotgun and process any HTTP errors that + could occur. + + :param url: endpoint where the form is sent. + :param params: form data + :returns: result from the server. + """ + opener = self._build_opener(FormPostHandler) + + # Perform the request + try: + resp = opener.open(url, params) + result = resp.read() + # response headers are in str(resp.info()).splitlines() + except urllib2.HTTPError, e: + if e.code == 500: + raise ShotgunError("Server encountered an internal error. " + "\n%s\n(%s)\n%s\n\n" % (url, self._sanitize_auth_params(params), e)) + else: + raise ShotgunError("Unanticipated error occurred %s" % (e)) + + return result + # Helpers from the previous API, left as is. # Based on http://code.activestate.com/recipes/146306/ From 747331e916ea417f1c96cc0b37c845b5d8438842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Wed, 15 Feb 2017 08:41:17 -0500 Subject: [PATCH 154/389] For #34923, implement site level bootstrap in Desktop. This branch adds supports for features in Mockgun that are required by the Shotgun Desktop and the Toolkit core. Closes https://github.com/shotgunsoftware/python-api/pull/133 --- shotgun_api3/lib/mockgun.py | 87 ++++++++++++++----- tests/test_mockgun.py | 162 ++++++++++++++++++++++++++++++++---- 2 files changed, 213 insertions(+), 36 deletions(-) diff --git a/shotgun_api3/lib/mockgun.py b/shotgun_api3/lib/mockgun.py index ae404bc79..d5e7214ae 100644 --- a/shotgun_api3/lib/mockgun.py +++ b/shotgun_api3/lib/mockgun.py @@ -539,7 +539,7 @@ def _validate_entity_fields(self, entity_type, fields): except ValueError: if field not in valid_fields and field not in ("type", "id"): raise ShotgunError("%s is not a valid field for entity %s" % (field, entity_type)) - + def _get_default_value(self, entity_type, field): field_info = self._schema[entity_type][field] if field_info["data_type"]["value"] == "multi_entity": @@ -560,6 +560,22 @@ def _get_new_row(self, entity_type): return row def _compare(self, field_type, lval, operator, rval): + """ + Compares a field using the operator and value provide by the filter. + + :param str field_type: Type of the field we are operating on. + :param lval: Value inside that field. Can be of any type: datetime, date, int, str, bool, etc. + :param str operator: Name of the operator to use. + :param rval: The value following the operator in a filter. + + :returns: The result of the operator that was applied. + :rtype: bool + """ + # If we have a list of scalar values + if isinstance(lval, list) and field_type != "multi_entity": + # Compare each one. If one matches the predicate we're good! + return any((self._compare(field_type, sub_val, operator, rval)) for sub_val in lval) + if field_type == "checkbox": if operator == "is": return lval == rval @@ -598,9 +614,9 @@ def _compare(self, field_type, lval, operator, rval): elif operator == "is_not": return lval != rval elif operator == "in": - return lval in rval - elif operator == "contains": return lval in rval + elif operator == "contains": + return rval in lval elif operator == "not_contains": return lval not in rval elif operator == "starts_with": @@ -609,8 +625,17 @@ def _compare(self, field_type, lval, operator, rval): return lval.endswith(rval) elif field_type == "entity": if operator == "is": + # If one of the two is None, ensure both are. + if lval is None or rval is None: + return lval == rval + # Both values are set, compare them. return lval["type"] == rval["type"] and lval["id"] == rval["id"] elif operator == "is_not": + if lval is None or rval is None: + return lval != rval + if rval is None: + # We already know lval is not None, so we know they are not equal. + return True return lval["type"] != rval["type"] or lval["id"] != rval["id"] elif operator == "in": return all((lval["type"] == sub_rval["type"] and lval["id"] == sub_rval["id"]) for sub_rval in rval) @@ -635,36 +660,50 @@ def _compare(self, field_type, lval, operator, rval): raise ShotgunError("The %s operator is not supported on the %s type" % (operator, field_type)) def _get_field_from_row(self, entity_type, row, field): - # split dotted form fields + # split dotted form fields try: # is it something like sg_sequence.Sequence.code ? field2, entity_type2, field3 = field.split(".", 2) - + if field2 in row: - + field_value = row[field2] - - # all deep links need to be link fields - if not isinstance(field_value, dict): + + # If we have a list of links, retrieve the subfields one by one. + if isinstance(field_value, list): + values = [] + for linked_row in field_value: + # Make sure we're actually iterating on links. + if not isinstance(linked_row, dict): + raise ShotgunError("Invalid deep query field %s.%s" % (entity_type, field)) + + # Skips entities that are not of the requested type. + if linked_row["type"] != entity_type2: + continue + + entity = self._db[linked_row["type"]][linked_row["id"]] + + sub_field_value = self._get_field_from_row(entity_type2, entity, field3) + values.append(sub_field_value) + return values + # not multi entity, must be entity. + elif not isinstance(field_value, dict): raise ShotgunError("Invalid deep query field %s.%s" % (entity_type, field)) - + # make sure that types in the query match type in the linked field if entity_type2 != field_value["type"]: raise ShotgunError("Deep query field %s.%s does not match type " "with data %s" % (entity_type, field, field_value)) - + # ok so looks like the value is an entity link # e.g. db contains: {"sg_sequence": {"type":"Sequence", "id": 123 } } linked_row = self._db[ field_value["type"] ][ field_value["id"] ] - if field3 in linked_row: - return linked_row[field3] - else: - return None + return self._get_field_from_row(entity_type2, linked_row, field3) else: # sg returns none for unknown stuff return None - + except ValueError: # this is not a deep-linked field - just something like "code" if field in row: @@ -695,17 +734,23 @@ def _row_matches_filter(self, entity_type, row, sg_filter, retired_only): else: raise ShotgunError("Unknown filter_operator type: %s" % operator) else: + lval = self._get_field_from_row(entity_type, row, field) field_type = self._get_field_type(entity_type, field) # if we're operating on an entity, we'll need to grab the name from the lval's row if field_type == "entity": - lval_row = self._db[lval["type"]][lval["id"]] - if "name" in lval_row: - lval["name"] = lval_row["name"] - elif "code" in lval_row: - lval["name"] = lval_row["code"] + # If the entity field is set, we'll retrieve the name of the entity. + if lval is not None: + link_type = lval["type"] + link_id = lval["id"] + lval_row = self._db[link_type][link_id] + if "name" in lval_row: + lval["name"] = lval_row["name"] + elif "code" in lval_row: + lval["name"] = lval_row["code"] + return self._compare(field_type, lval, operator, rval) def _rearrange_filters(self, filters): diff --git a/tests/test_mockgun.py b/tests/test_mockgun.py index 617428e09..904a0501b 100644 --- a/tests/test_mockgun.py +++ b/tests/test_mockgun.py @@ -42,19 +42,15 @@ from shotgun_api3 import ShotgunError -def setUpModule(): - """ - Sets the Shotgun schema for this series of unit tests. - """ - mockgun_schema_folder = os.path.join( - os.path.dirname(__file__), - "mockgun" - ) +mockgun_schema_folder = os.path.join( + os.path.dirname(__file__), + "mockgun" +) - Mockgun.set_schema_paths( - os.path.join(mockgun_schema_folder, "schema.pickle"), - os.path.join(mockgun_schema_folder, "schema_entity.pickle") - ) +Mockgun.set_schema_paths( + os.path.join(mockgun_schema_folder, "schema.pickle"), + os.path.join(mockgun_schema_folder, "schema_entity.pickle") +) # FIXME: This should probably be refactored into a base class for @@ -86,7 +82,7 @@ class TestValidateFilterSyntax(TestBaseWithExceptionTests): def setUp(self): """ - Creates tests data. + Creates test data. """ super(TestValidateFilterSyntax, self).setUp() @@ -95,8 +91,10 @@ def setUp(self): self._mockgun.create("Shot", {"code": "shot"}) def test_filter_array_or_dict(self): - # Should not throw, even though it is pretty much - # empty. + """ + Ensure that arrays and dictionaries are supported for filters. + """ + # This should not throw. self._mockgun.find( "Shot", [ @@ -110,6 +108,7 @@ def test_filter_array_or_dict(self): ] ) + # We can't have not dict/list values for filters however. self.assertRaisesRegexp( ShotgunError, "Filters can only be lists or dictionaries, not int.", @@ -120,6 +119,139 @@ def test_filter_array_or_dict(self): ) +class TestEntityFieldComparison(TestBaseWithExceptionTests): + """ + Checks if entity fields comparison work. + """ + + def setUp(self): + """ + Creates test data. + """ + self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") + + self._project_link = self._mockgun.create("Project", {"name": "project"}) + + # This entity will ensure that a populated link field will be comparable. + self._mockgun.create( + "PipelineConfiguration", + {"code": "with_project", "project": self._project_link} + ) + + # This entity will ensure that an unpopulated link field will be comparable. + self._mockgun.create("PipelineConfiguration", {"code": "without_project"}) + + def test_searching_for_none_entity_field(self): + """ + Ensures that comparison with None work. + """ + + items = self._mockgun.find("PipelineConfiguration", [["project", "is", None]]) + self.assertEqual(len(items), 1) + + items = self._mockgun.find("PipelineConfiguration", [["project", "is_not", None]]) + self.assertEqual(len(items), 1) + + def test_searching_for_initialized_entity_field(self): + """ + Ensures that comparison with an entity works. + """ + items = self._mockgun.find("PipelineConfiguration", [["project", "is", self._project_link]]) + self.assertEqual(len(items), 1) + + items = self._mockgun.find("PipelineConfiguration", [["project", "is_not", self._project_link]]) + self.assertEqual(len(items), 1) + + +class TestTextFieldOperators(TestBaseWithExceptionTests): + """ + Checks if text field comparison work. + """ + def setUp(self): + """ + Creates test data. + """ + self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") + self._user = self._mockgun.create("HumanUser", {"login": "user"}) + + def test_operator_contains(self): + """ + Ensures contains operator works. + """ + item = self._mockgun.find_one("HumanUser", [["login", "contains", "se"]]) + self.assertTrue(item) + + +class TestMultiEntityFieldComparison(TestBaseWithExceptionTests): + """ + Ensures multi entity field comparison work. + """ + + def setUp(self): + """ + Creates test data. + """ + + self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") + + # Create two users to assign to the pipeline configurations. + self._user1 = self._mockgun.create("HumanUser", {"login": "user1"}) + self._user2 = self._mockgun.create("HumanUser", {"login": "user2"}) + + # Create pipeline configurations that are assigned none, one or two users. + self._mockgun.create( + "PipelineConfiguration", + {"code": "with_user1", "users": [self._user1]} + ) + + self._mockgun.create( + "PipelineConfiguration", + {"code": "with_user2", "users": [self._user2]} + ) + + self._mockgun.create( + "PipelineConfiguration", + {"code": "with_both", "users": [self._user2, self._user1]} + ) + + self._mockgun.create( + "PipelineConfiguration", + {"code": "with_none", "users": []} + ) + + def test_find_by_sub_entity_field(self): + """ + Ensures that queries on linked entity fields works. + """ + items = self._mockgun.find("PipelineConfiguration", [["users.HumanUser.login", "is", "user1"]]) + self.assertEqual(len(items), 2) + + items = self._mockgun.find("PipelineConfiguration", [["users.HumanUser.login", "is", "user2"]]) + self.assertEqual(len(items), 2) + + items = self._mockgun.find("PipelineConfiguration", [["users.HumanUser.login", "contains", "ser"]]) + self.assertEqual(len(items), 3) + + # Lets get fancy a bit. + items = self._mockgun.find("PipelineConfiguration", [{ + "filter_operator": "any", + "filters": [ + ["users.HumanUser.login", "is", "user1"], + ["users.HumanUser.login", "is", "user2"] + ]}] + ) + self.assertEqual(len(items), 3) + + items = self._mockgun.find("PipelineConfiguration", [{ + "filter_operator": "all", + "filters": [ + ["users.HumanUser.login", "is", "user1"], + ["users.HumanUser.login", "is", "user2"] + ]}] + ) + self.assertEqual(len(items), 1) + + class TestFilterOperator(TestBaseWithExceptionTests): """ Unit tests for the filter_operator filter syntax. From fd17dc2710a630fcceb4fea5e4b299d65ee59308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Wed, 15 Feb 2017 08:54:20 -0500 Subject: [PATCH 155/389] Updated release notes. --- HISTORY.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 2134d2631..4aed803ac 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,6 +9,13 @@ v3.0.33.dev (TBD) - Raise an exception when uploading an empty file using :meth:`upload`, :meth:`upload_thumbnail` or :meth:`upload_filmstrip_thumbnail` before calling out to the server. +- Multiple enhancements and bugfixes to Mockgun: + - Added support for filters using the `filter_operator` syntax. + - `is` and `is_not` comparison with a field set to `None` are now handled. + - Fixed contains operator on strings. + - Fixed entity link comparisons with `None`. + - Added support for dotted notation in find parameters (e.g. `users.HumanUser.login`) on both entity and multi-entity fields. + - Added unit tests for Mockgun in `test_mockgun.py`. The tests currently cover all the fixes and features mentionned above. - TBD v3.0.32 (2016 Sep 22) From 9395a0008295a5fd8bfaf879a8ac12d410c99b96 Mon Sep 17 00:00:00 2001 From: daigles Date: Wed, 15 Feb 2017 12:42:23 -0500 Subject: [PATCH 156/389] For #38721: Fixed upload regression for sites prior to V 7.0.10 --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 796edba10..8ed99a9c7 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2148,7 +2148,7 @@ def upload(self, entity_type, entity_id, path, field_name=None, display_name=Non # Version.sg_uploaded_movie is handled as a special case and uploaded # directly to Cloud storage - if self.server_info["s3_direct_uploads_enabled"] \ + if self.server_info.get("s3_direct_uploads_enabled", False) \ and entity_type == "Version" and field_name == "sg_uploaded_movie": return self._upload_to_storage(entity_type, entity_id, path, field_name, display_name, tag_list, is_thumbnail) From 00ce67e4216f1246f424cb4bc74f83afb5069111 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Tue, 21 Feb 2017 14:06:50 -0800 Subject: [PATCH 157/389] For #40631: Adding following method and updating unit tests (#131) --- shotgun_api3/shotgun.py | 42 +++++++++++++++++++++++++++++ tests/test_api.py | 60 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 95 insertions(+), 7 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 8ed99a9c7..405f7fa1d 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -238,6 +238,15 @@ def ensure_support_for_additional_filter_presets(self): 'label': 'additional_filter_presets parameter' }, True) + def ensure_user_following_support(self): + """ + Ensures server has support for listing items a user is following, added in v7.0.12. + """ + return self._ensure_support({ + 'version': (7, 0, 12), + 'label': 'user_following parameter' + }, True) + def __str__(self): return "ServerCapabilities: host %s, version %s, is_dev %s"\ % (self.host, self.version, self.is_dev) @@ -1611,6 +1620,39 @@ def followers(self, entity): return self._call_rpc('followers', params) + def following(self, user, project=None, entity_type=None): + """ + Return all entity instances a user is following. + + Optionally, a project and/or entity_type can be supplied to restrict returned results. + + >>> user = {"type": "HumanUser", "id": 1234} + >>> project = {"type": "Project", "id": 1234} + >>> entity_type = "Task" + >>> sg.following(user, project=project, entity_type=entity_type) + [{"type":"Task", "id":1}, + {"type":"Task", "id":2}, + {"type":"Task", "id":3}] + + :param dict user: Find what this person is following. + :param dict project: Optional filter to only return results from a specific project. + :param str entity_type: Optional filter to only return results from one entity type. + :returns: list of dictionaries, each containing entity type & id's being followed. + :rtype: list + """ + + self.server_caps.ensure_user_following_support() + + params = { + "user":user + } + if project: + params["project"] = project + if entity_type: + params["entity_type"] = entity_type + + return self._call_rpc('following', params) + def schema_entity_read(self, project_entity=None): """ Return all active entity types, their display names, and their visibility. diff --git a/tests/test_api.py b/tests/test_api.py index 78870bb60..21d9dbe23 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1467,7 +1467,13 @@ def setUp(self): super(TestFollow, self).setUp() self.sg.update( 'HumanUser', self.human_user['id'], {'projects':[self.project]}) - def test_follow(self): + # As the Follow entity isn't exposed directly, we clear out existing + # follows for the user before running our tests. + if self.sg.server_caps.version and self.sg.server_caps.version >= (7, 0, 12): + for entity in self.sg.following(self.human_user): + self.sg.unfollow(self.human_user, entity) + + def test_follow_unfollow(self): '''Test follow method''' if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): @@ -1476,12 +1482,6 @@ def test_follow(self): result = self.sg.follow(self.human_user, self.shot) assert(result['followed']) - def test_unfollow(self): - '''Test unfollow method''' - - if not self.sg.server_caps.version or self.sg.server_caps.version < (5, 1, 22): - return - result = self.sg.unfollow(self.human_user, self.shot) assert(result['unfollowed']) @@ -1498,6 +1498,52 @@ def test_followers(self): self.assertEqual( 1, len(result) ) self.assertEqual( self.human_user['id'], result[0]['id'] ) + def test_following(self): + '''Test following method''' + + if not self.sg.server_caps.version or self.sg.server_caps.version < (7, 0, 12): + warnings.warn("Test bypassed because SG server used does not support this feature.", FutureWarning) + return + + result = self.sg.follow(self.human_user, self.shot) + assert(result['followed']) + + result = self.sg.following(self.human_user) + self.assertEqual( 1, len(result) ) + self.assertEqual( self.shot['id'], result[0]['id'] ) + + result = self.sg.follow(self.human_user, self.task) + assert(result['followed']) + + result = self.sg.following(self.human_user) + self.assertEqual( 2, len(result) ) + result = self.sg.following(self.human_user, entity_type="Task") + self.assertEqual( 1, len(result) ) + result = self.sg.following(self.human_user, entity_type="Shot") + self.assertEqual( 1, len(result) ) + + shot_project_id = self.sg.find_one("Shot", + [["id","is",self.shot["id"]]], + ["project.Project.id"])["project.Project.id"] + task_project_id = self.sg.find_one("Task", + [["id","is",self.task["id"]]], + ["project.Project.id"])["project.Project.id"] + project_count = 2 if shot_project_id == task_project_id else 1 + result = self.sg.following(self.human_user, + project={"type":"Project", "id":shot_project_id}) + self.assertEqual( project_count, len(result) ) + result = self.sg.following(self.human_user, + project={"type":"Project", "id":task_project_id}) + self.assertEqual( project_count, len(result) ) + result = self.sg.following(self.human_user, + project={"type":"Project", "id":shot_project_id}, + entity_type="Shot") + self.assertEqual( 1, len(result) ) + result = self.sg.following(self.human_user, + project={"type":"Project", "id":task_project_id}, + entity_type="Task") + self.assertEqual( 1, len(result) ) + class TestErrors(base.TestBase): def test_bad_auth(self): '''test_bad_auth invalid script name or api key raises fault''' From 0a4cf45b91ef42becbe62262bfb1f6068a36e166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Wed, 22 Feb 2017 09:53:31 -0500 Subject: [PATCH 158/389] For #34923, desktop site bootstrap - Introduces a schema cache which speeds up Mockgun-based unit tests tremendously. - shotgun_api.lib.mockgun is now a folder and not just a file. Closes https://github.com/shotgunsoftware/python-api/pull/135 --- HISTORY.rst | 2 + shotgun_api3/lib/mockgun/__init__.py | 35 ++++++ shotgun_api3/lib/mockgun/errors.py | 42 ++++++++ shotgun_api3/lib/{ => mockgun}/mockgun.py | 65 ++---------- shotgun_api3/lib/mockgun/schema.py | 124 ++++++++++++++++++++++ tests/test_mockgun.py | 18 ++++ 6 files changed, 227 insertions(+), 59 deletions(-) create mode 100644 shotgun_api3/lib/mockgun/__init__.py create mode 100644 shotgun_api3/lib/mockgun/errors.py rename shotgun_api3/lib/{ => mockgun}/mockgun.py (94%) create mode 100644 shotgun_api3/lib/mockgun/schema.py diff --git a/HISTORY.rst b/HISTORY.rst index 4aed803ac..7cfda35c6 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -16,6 +16,8 @@ v3.0.33.dev (TBD) - Fixed entity link comparisons with `None`. - Added support for dotted notation in find parameters (e.g. `users.HumanUser.login`) on both entity and multi-entity fields. - Added unit tests for Mockgun in `test_mockgun.py`. The tests currently cover all the fixes and features mentionned above. + - Schemas are written using pickle's highest protocol as of Python 2.4's release, which speeds up the loading from disk. + - The current schema is cached in memory so it can be reused without having to do back to disk. - TBD v3.0.32 (2016 Sep 22) diff --git a/shotgun_api3/lib/mockgun/__init__.py b/shotgun_api3/lib/mockgun/__init__.py new file mode 100644 index 000000000..6a83e99d7 --- /dev/null +++ b/shotgun_api3/lib/mockgun/__init__.py @@ -0,0 +1,35 @@ +""" + ----------------------------------------------------------------------------- + Copyright (c) 2009-2017, Shotgun Software Inc + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of the Shotgun Software Inc nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------- +""" + +from .schema import generate_schema # noqa +from .mockgun import Shotgun # noqa +from .errors import MockgunError # noqa \ No newline at end of file diff --git a/shotgun_api3/lib/mockgun/errors.py b/shotgun_api3/lib/mockgun/errors.py new file mode 100644 index 000000000..481f194a4 --- /dev/null +++ b/shotgun_api3/lib/mockgun/errors.py @@ -0,0 +1,42 @@ +""" + ----------------------------------------------------------------------------- + Copyright (c) 2009-2017, Shotgun Software Inc + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of the Shotgun Software Inc nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------- +""" + + +# ---------------------------------------------------------------------------- +# Errors +class MockgunError(Exception): + """ + Base for all Mockgun related API Errors. + These are errors that relate to mockgun specifically, for example + relating to mockups setup and initialization. For operational errors, + mockgun raises ShotgunErrors just like the Shotgun API. + """ diff --git a/shotgun_api3/lib/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py similarity index 94% rename from shotgun_api3/lib/mockgun.py rename to shotgun_api3/lib/mockgun/mockgun.py index d5e7214ae..7b4a64a77 100644 --- a/shotgun_api3/lib/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -114,55 +114,18 @@ """ -import os, datetime -import cPickle as pickle +import datetime -from .. import sg_timezone, ShotgunError -from ..shotgun import _Config +from ... import sg_timezone, ShotgunError +from ...shotgun import _Config +from .errors import MockgunError +from .schema import SchemaFactory # ---------------------------------------------------------------------------- # Version __version__ = "0.0.1" -# ---------------------------------------------------------------------------- -# Errors - -class MockgunError(Exception): - """ - Base for all Mockgun related API Errors. - These are errors that relate to mockgun specifically, for example - relating to mockups setup and initialization. For operational errors, - mockgun raises ShotgunErrors just like the Shotgun API. - """ - pass -# ---------------------------------------------------------------------------- -# Utility methods - -def generate_schema(shotgun, schema_file_path, schema_entity_file_path): - """ - Helper method for mockgun. - Generates the schema files needed by the mocker by connecting to a real shotgun - and downloading the schema information for that site. Once the generated schema - files are being passed to mockgun, it will mimic the site's schema structure. - - :param sg_url: Shotgun site url - :param sg_script: Script name to connect with - :param sg_key: Script key to connect with - :param schema_file_path: Path where to write the main schema file to - :param schema_entity_file_path: Path where to write the entity schema file to - """ - - schema = shotgun.schema_read() - fh = open(schema_file_path, "w") - pickle.dump(schema, fh) - fh.close() - - schema_entity = shotgun.schema_entity_read() - fh = open(schema_entity_file_path, "w") - pickle.dump(schema_entity, fh) - fh.close() - # ---------------------------------------------------------------------------- # API @@ -237,23 +200,7 @@ def __init__(self, "Before creating a Mockgun instance, please call Mockgun.set_schema_paths() " "in order to specify which Shotgun schema Mockgun should operate against.") - if not os.path.exists(schema_path): - raise MockgunError("Cannot locate Mockgun schema file '%s'!" % schema_path) - - if not os.path.exists(schema_entity_path): - raise MockgunError("Cannot locate Mockgun schema file '%s'!" % schema_entity_path) - - fh = open(schema_path, "r") - try: - self._schema = pickle.load(fh) - finally: - fh.close() - - fh = open(schema_entity_path, "r") - try: - self._schema_entity = pickle.load(fh) - finally: - fh.close() + self._schema, self._schema_entity = SchemaFactory.get_schemas(schema_path, schema_entity_path) # initialize the "database" self._db = dict((entity, {}) for entity in self._schema) diff --git a/shotgun_api3/lib/mockgun/schema.py b/shotgun_api3/lib/mockgun/schema.py new file mode 100644 index 000000000..6b3657456 --- /dev/null +++ b/shotgun_api3/lib/mockgun/schema.py @@ -0,0 +1,124 @@ +""" + ----------------------------------------------------------------------------- + Copyright (c) 2009-2017, Shotgun Software Inc + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of the Shotgun Software Inc nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------------------------------------------- +""" + +import cPickle as pickle +import os +import copy + +from .errors import MockgunError + + +class SchemaFactory(object): + """ + Allows to instantiate a pickled schema. + """ + + _schema_entity_cache = None + _schema_entity_cache_path = None + _schema_cache = None + _schema_cache_path = None + + @classmethod + def get_schemas(cls, schema_path, schema_entity_path): + """ + Retrieves the schemas from disk. + + :param str schema_path: Path to the schema. + :param str schema_entity_path: Path to the entities schema. + + :returns: Pair of dictionaries holding the schema and entities schema. + :rtype: tuple + """ + if not os.path.exists(schema_path): + raise MockgunError("Cannot locate Mockgun schema file '%s'!" % schema_path) + + if not os.path.exists(schema_entity_path): + raise MockgunError("Cannot locate Mockgun schema file '%s'!" % schema_entity_path) + + # Poor man's attempt at a cache. All of our use cases deal with a single pair of files + # for the duration of the unit tests, so keep a cache for both inputs. We don't want + # to deal with ever growing caches anyway. Just having this simple cache has shown + # speed increases of up to 500% for Toolkit unit tests alone. + + if schema_path != cls._schema_cache_path: + cls._schema_cache = cls._read_file(schema_path) + cls._schema_cache_path = schema_path + + if schema_entity_path != cls._schema_entity_cache_path: + cls._schema_entity_cache = cls._read_file(schema_entity_path) + cls._schema_entity_cache_path = schema_entity_path + + return cls._schema_cache, cls._schema_entity_cache + + @classmethod + def _read_file(cls, path): + fh = open(path, "r") + try: + return pickle.load(fh) + finally: + fh.close() + + +# Highest protocol that Python 2.4 supports, which is the earliest version of Python we support. +# Actually, this is the same version that Python 2.7 supports at the moment! +_HIGHEST_24_PICKLE_PROTOCOL = 2 + + +# ---------------------------------------------------------------------------- +# Utility methods +def generate_schema(shotgun, schema_file_path, schema_entity_file_path): + """ + Helper method for mockgun. + Generates the schema files needed by the mocker by connecting to a real shotgun + and downloading the schema information for that site. Once the generated schema + files are being passed to mockgun, it will mimic the site's schema structure. + + :param sg_url: Shotgun site url + :param sg_script: Script name to connect with + :param sg_key: Script key to connect with + :param schema_file_path: Path where to write the main schema file to + :param schema_entity_file_path: Path where to write the entity schema file to + """ + + schema = shotgun.schema_read() + fh = open(schema_file_path, "w") + try: + pickle.dump(schema, fh, protocol=_HIGHEST_24_PICKLE_PROTOCOL) + finally: + fh.close() + + schema_entity = shotgun.schema_entity_read() + fh = open(schema_entity_file_path, "w") + try: + pickle.dump(schema_entity, fh, protocol=_HIGHEST_24_PICKLE_PROTOCOL) + finally: + fh.close() diff --git a/tests/test_mockgun.py b/tests/test_mockgun.py index 904a0501b..30002a599 100644 --- a/tests/test_mockgun.py +++ b/tests/test_mockgun.py @@ -75,6 +75,24 @@ def assertRaisesRegexp(self, exception_type, re_msg, func): self.fail("Expected %s was not raised." % exception_type) +class TestMockgunModuleInterface(unittest.TestCase): + """ + mockgun.py was turned into a module. Ensure we haven't broken the interface. + """ + + def test_interface_intact(self): + """ + Ensure everything that was public before still is. + """ + + from shotgun_api3.lib import mockgun + # Try to access everything. If something is missing, it will raise an + # error. + mockgun.MockgunError + mockgun.generate_schema + mockgun.Shotgun + + class TestValidateFilterSyntax(TestBaseWithExceptionTests): """ Tests filter syntax support. From 12d9fc5bc7786e15e577437c32f8809d54845b8d Mon Sep 17 00:00:00 2001 From: Stephane Daigle Date: Thu, 2 Mar 2017 10:31:55 -0500 Subject: [PATCH 159/389] For #40884: Extend support for direct uploads to S3 - Added multi-part uploads to support uploads of files > 5 GB --- shotgun_api3/shotgun.py | 185 +++++++++++++++++++++++++++++++++------- 1 file changed, 153 insertions(+), 32 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 405f7fa1d..c05d3c508 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2059,10 +2059,6 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, "filmstrip_thumbnail" : filmstrip_thumbnail, } - params.update(self._auth_params()) - - # Create opener with extended form post support - opener = self._build_opener(FormPostHandler) url = urlparse.urlunparse((self.config.scheme, self.config.server, "/upload/share_thumbnail", None, None, None)) @@ -2219,33 +2215,16 @@ def _upload_to_storage(self, entity_type, entity_id, path, field_name, display_n # Step 1: get the upload url - upload_info = self._get_attachment_upload_info(is_thumbnail, filename) + multipart_upload = (os.path.getsize(path) > 20000000) - # Step 2: upload the file + upload_info = self._get_attachment_upload_info(is_thumbnail, filename, multipart_upload) - fd = open(path, "rb") - try: - content_type = mimetypes.guess_type(filename)[0] - content_type = content_type or "application/octet-stream" - file_size = os.fstat(fd.fileno())[stat.ST_SIZE] - - # Perform the request - opener = urllib2.build_opener(urllib2.HTTPHandler) - - request = urllib2.Request(upload_info["upload_url"], data=fd) - request.add_header("Content-Type", content_type) - request.add_header("Content-Length", file_size) - request.get_method = lambda: "PUT" - result = opener.open(request) - except urllib2.HTTPError, e: - if e.code == 500: - raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) - else: - raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) - finally: - fd.close() + # Step 2: upload the file - LOG.debug("File uploaded to Cloud storage: %s", filename) + if multipart_upload: + self._multipart_upload_file_to_storage(path, upload_info) + else: + self._upload_file_to_storage(path, upload_info["upload_url"]) # Step 3: create the attachment @@ -2342,12 +2321,13 @@ def _upload_to_sg(self, entity_type, entity_id, path, field_name, display_name, attachment_id = int(str(result).split(":")[1].split("\n")[0]) return attachment_id - def _get_attachment_upload_info(self, is_thumbnail, filename): + def _get_attachment_upload_info(self, is_thumbnail, filename, multipart_upload): """ Internal function to get the information needed to upload a file to Cloud storage. :param bool is_thumbnail: indicates if the attachment is a thumbnail. :param str filename: name of the file that will be uploaded. + :param bool multipart_upload: Indicates if we want multi-part upload information back. :returns: dictionary containing the upload url and upload_info (passed back to the SG server once the upload is completed). @@ -2364,7 +2344,8 @@ def _get_attachment_upload_info(self, is_thumbnail, filename): "filename" : filename } - params.update(self._auth_params()) + if multipart_upload: + params['multipart_upload'] = True upload_url = "/upload/api_get_upload_link_info" url = urlparse.urlunparse((self.config.scheme, self.config.server, @@ -2374,11 +2355,17 @@ def _get_attachment_upload_info(self, is_thumbnail, filename): if not str(upload_info).startswith("1"): raise ShotgunError("Could not get upload_url but " \ "not sure why.\nPath: %s\nUrl: %s\nError: %s" % ( - path, url, str(upload_info))) + filename, url, str(upload_info))) LOG.debug("Completed rpc call to %s" % (upload_url)) + + upload_info_parts = str(upload_info).split("\n") + return { - "upload_url" : str(upload_info).split("\n")[1], + "upload_url" : upload_info_parts[1], + "timestamp" : upload_info_parts[2], + "upload_type" : upload_info_parts[3], + "upload_id": upload_info_parts[4], "upload_info" : upload_info } @@ -3539,6 +3526,137 @@ def _dict_to_extra_data(self, d, key_name="value"): """ return dict([(k, {key_name: v}) for (k,v) in (d or {}).iteritems()]) + def _upload_file_to_storage(self, path, storage_url): + """ + Internal function to upload an entire file to the Cloud storage. + + :param str path: Full path to an existing non-empty file on disk to upload. + :param str storage_url: Target URL for the uploaded file. + """ + filename = os.path.basename(path) + + fd = open(path, "rb") + try: + content_type = mimetypes.guess_type(filename)[0] + content_type = content_type or "application/octet-stream" + file_size = os.fstat(fd.fileno())[stat.ST_SIZE] + self._upload_data_to_storage(fd, content_type, file_size, storage_url ) + finally: + fd.close() + + LOG.debug("File uploaded to Cloud storage: %s", filename) + + def _multipart_upload_file_to_storage(self, path, upload_info): + """ + Internal function to upload a file to the Cloud storage in multiple parts. + + :param str path: Full path to an existing non-empty file on disk to upload. + :param dict upload_info: Contains details received from the server, about the upload. + """ + + fd = open(path, "rb") + try: + content_type = mimetypes.guess_type(path)[0] + content_type = content_type or "application/octet-stream" + file_size = os.fstat(fd.fileno())[stat.ST_SIZE] + filename = os.path.basename(path) + + etags = [] + part_number = 1 + bytes_read = 0 + chunk_size = 20000000 + while bytes_read < file_size: + data = fd.read(chunk_size) + bytes_read += len(data) + part_url = self._get_upload_part_link(upload_info, filename, part_number) + etags.append(self._upload_data_to_storage(data, content_type, len(data), part_url )) + part_number += 1 + + self._complete_multipart_upload(upload_info, filename, etags) + finally: + fd.close() + + LOG.debug("File uploaded in multiple parts to Cloud storage: %s", path) + + def _get_upload_part_link(self, upload_info, filename, part_number): + """ + Internal function to get the url to upload the next part of a file to the + Cloud storage, in a multi-part upload process. + + :param dict upload_info: Contains details received from the server, about the upload. + :param str filename: Name of the file for which we want the link. + :param int part_number: Part number for the link. + :returns: upload url. + :rtype: str + """ + params = { + "upload_type": upload_info["upload_type"], + "filename": filename, + "timestamp": upload_info["timestamp"], + "upload_id": upload_info["upload_id"], + "part_number": part_number + } + + url = urlparse.urlunparse((self.config.scheme, self.config.server, + "/upload/api_get_upload_link_for_part", None, None, None)) + result = self._send_form(url, params) + + if not str(result).startswith("1"): + raise ShotgunError("Unable get upload part link: %s" % result) + + return str(result).split("\n")[1] + + def _upload_data_to_storage(self, data, content_type, size, storage_url): + """ + Internal function to upload data to Cloud storage. + + :param stream data: Contains details received from the server, about the upload. + :param str content_type: Content type of the data stream. + :param int size: Number of bytes in the data stream. + :param str storage_url: Target URL for the uploaded file. + :returns: upload url. + :rtype: str + """ + try: + opener = urllib2.build_opener(urllib2.HTTPHandler) + + request = urllib2.Request(storage_url, data=data) + request.add_header("Content-Type", content_type) + request.add_header("Content-Length", size) + request.get_method = lambda: "PUT" + result = opener.open(request) + etag = result.info().getheader("ETag") + except urllib2.HTTPError, e: + if e.code == 500: + raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) + else: + raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) + return etag + + def _complete_multipart_upload(self, upload_info, filename, etags): + """ + Internal function to complete a multi-part upload to the Cloud storage. + + :param dict upload_info: Contains details received from the server, about the upload. + :param str filename: Name of the file for which we want to complete the upload. + :param tupple etags: Contains the etag of each uploaded file part. + """ + + params = { + "upload_type": upload_info["upload_type"], + "filename": filename, + "timestamp": upload_info["timestamp"], + "upload_id": upload_info["upload_id"], + "etags": ",".join(etags) + } + + url = urlparse.urlunparse((self.config.scheme, self.config.server, + "/upload/api_complete_multipart_upload", None, None, None)) + result = self._send_form(url, params) + + if not str(result).startswith("1"): + raise ShotgunError("Unable get upload part link: %s" % result) + def _send_form(self, url, params): """ Utility function to send a Form to Shotgun and process any HTTP errors that @@ -3548,6 +3666,9 @@ def _send_form(self, url, params): :param params: form data :returns: result from the server. """ + + params.update(self._auth_params()) + opener = self._build_opener(FormPostHandler) # Perform the request From 0cda1e9510649e318575521b85c4ea0f9918f0b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Fri, 3 Mar 2017 08:29:50 -0500 Subject: [PATCH 160/389] [minor] Fixes an issue with Mockgun on Windows when reading schema files --- shotgun_api3/lib/mockgun/schema.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shotgun_api3/lib/mockgun/schema.py b/shotgun_api3/lib/mockgun/schema.py index 6b3657456..edd4b889a 100644 --- a/shotgun_api3/lib/mockgun/schema.py +++ b/shotgun_api3/lib/mockgun/schema.py @@ -81,7 +81,7 @@ def get_schemas(cls, schema_path, schema_entity_path): @classmethod def _read_file(cls, path): - fh = open(path, "r") + fh = open(path, "rb") try: return pickle.load(fh) finally: @@ -110,14 +110,14 @@ def generate_schema(shotgun, schema_file_path, schema_entity_file_path): """ schema = shotgun.schema_read() - fh = open(schema_file_path, "w") + fh = open(schema_file_path, "wb") try: pickle.dump(schema, fh, protocol=_HIGHEST_24_PICKLE_PROTOCOL) finally: fh.close() schema_entity = shotgun.schema_entity_read() - fh = open(schema_entity_file_path, "w") + fh = open(schema_entity_file_path, "wb") try: pickle.dump(schema_entity, fh, protocol=_HIGHEST_24_PICKLE_PROTOCOL) finally: From a0e4ab5ab9a2ced25fa7de1ec09a15efda66a321 Mon Sep 17 00:00:00 2001 From: Stephane Daigle Date: Fri, 3 Mar 2017 09:47:16 -0500 Subject: [PATCH 161/389] CR fixes --- shotgun_api3/shotgun.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index c05d3c508..e0f73249f 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -362,6 +362,8 @@ class Shotgun(object): "^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])"\ "(\D?([01]\d|2[0-3])\D?([0-5]\d)\D?([0-5]\d)?\D?(\d{3})?)?$") + _MULTIPART_UPLOAD_CHUNK_SIZE = 20000000 + def __init__(self, base_url, script_name=None, @@ -2215,13 +2217,14 @@ def _upload_to_storage(self, entity_type, entity_id, path, field_name, display_n # Step 1: get the upload url - multipart_upload = (os.path.getsize(path) > 20000000) + is_multipart_upload = (os.path.getsize(path) > _MULTIPART_UPLOAD_CHUNK_SIZE) - upload_info = self._get_attachment_upload_info(is_thumbnail, filename, multipart_upload) + upload_info = self._get_attachment_upload_info(is_thumbnail, filename, is_multipart_upload) # Step 2: upload the file - - if multipart_upload: + # We upload large files in multiple parts because it is more robust + # (and required when using S3 storage) + if is_multipart_upload: self._multipart_upload_file_to_storage(path, upload_info) else: self._upload_file_to_storage(path, upload_info["upload_url"]) @@ -2321,16 +2324,16 @@ def _upload_to_sg(self, entity_type, entity_id, path, field_name, display_name, attachment_id = int(str(result).split(":")[1].split("\n")[0]) return attachment_id - def _get_attachment_upload_info(self, is_thumbnail, filename, multipart_upload): + def _get_attachment_upload_info(self, is_thumbnail, filename, is_multipart_upload): """ Internal function to get the information needed to upload a file to Cloud storage. :param bool is_thumbnail: indicates if the attachment is a thumbnail. :param str filename: name of the file that will be uploaded. - :param bool multipart_upload: Indicates if we want multi-part upload information back. + :param bool is_multipart_upload: Indicates if we want multi-part upload information back. - :returns: dictionary containing the upload url and - upload_info (passed back to the SG server once the upload is completed). + :returns: dictionary containing upload details from the server. + These details are used throughout the upload process. :rtype: dict """ @@ -2344,8 +2347,7 @@ def _get_attachment_upload_info(self, is_thumbnail, filename, multipart_upload): "filename" : filename } - if multipart_upload: - params['multipart_upload'] = True + params["multipart_upload"] = is_multipart_upload upload_url = "/upload/api_get_upload_link_info" url = urlparse.urlunparse((self.config.scheme, self.config.server, @@ -3564,7 +3566,7 @@ def _multipart_upload_file_to_storage(self, path, upload_info): etags = [] part_number = 1 bytes_read = 0 - chunk_size = 20000000 + chunk_size = _MULTIPART_UPLOAD_CHUNK_SIZE while bytes_read < file_size: data = fd.read(chunk_size) bytes_read += len(data) @@ -3601,9 +3603,13 @@ def _get_upload_part_link(self, upload_info, filename, part_number): "/upload/api_get_upload_link_for_part", None, None, None)) result = self._send_form(url, params) + # Response is of the form: 1\n (for success) or 0\n (for failure). + # In case of success, we know we the second line of the response contains the + # requested URL. if not str(result).startswith("1"): raise ShotgunError("Unable get upload part link: %s" % result) + LOG.debug("Got next upload link from server for multipart upload.") return str(result).split("\n")[1] def _upload_data_to_storage(self, data, content_type, size, storage_url): @@ -3631,6 +3637,8 @@ def _upload_data_to_storage(self, data, content_type, size, storage_url): raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) else: raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) + + LOG.debug("Part upload completed successfully.") return etag def _complete_multipart_upload(self, upload_info, filename, etags): @@ -3654,6 +3662,7 @@ def _complete_multipart_upload(self, upload_info, filename, etags): "/upload/api_complete_multipart_upload", None, None, None)) result = self._send_form(url, params) + # Response is of the form: 1\n or 0\n to indicate success or failure of the call. if not str(result).startswith("1"): raise ShotgunError("Unable get upload part link: %s" % result) From e66544d6779e3e27ae7054cd44327066eeaa1ada Mon Sep 17 00:00:00 2001 From: Stephane Daigle Date: Fri, 3 Mar 2017 10:47:49 -0500 Subject: [PATCH 162/389] =?UTF-8?q?Adding=20missing=20=E2=80=98self?= =?UTF-8?q?=E2=80=99=20:\?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shotgun_api3/shotgun.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index e0f73249f..629304811 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2217,7 +2217,7 @@ def _upload_to_storage(self, entity_type, entity_id, path, field_name, display_n # Step 1: get the upload url - is_multipart_upload = (os.path.getsize(path) > _MULTIPART_UPLOAD_CHUNK_SIZE) + is_multipart_upload = (os.path.getsize(path) > self._MULTIPART_UPLOAD_CHUNK_SIZE) upload_info = self._get_attachment_upload_info(is_thumbnail, filename, is_multipart_upload) @@ -3566,7 +3566,7 @@ def _multipart_upload_file_to_storage(self, path, upload_info): etags = [] part_number = 1 bytes_read = 0 - chunk_size = _MULTIPART_UPLOAD_CHUNK_SIZE + chunk_size = self._MULTIPART_UPLOAD_CHUNK_SIZE while bytes_read < file_size: data = fd.read(chunk_size) bytes_read += len(data) From 56a328e9ec89d3e363cef0c7054fd41b12d5eacf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Wed, 8 Mar 2017 10:10:22 -0500 Subject: [PATCH 163/389] Revert "For #40884: Extend support for direct uploads to S3" --- shotgun_api3/shotgun.py | 200 +++++++--------------------------------- 1 file changed, 35 insertions(+), 165 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 629304811..405f7fa1d 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -362,8 +362,6 @@ class Shotgun(object): "^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])"\ "(\D?([01]\d|2[0-3])\D?([0-5]\d)\D?([0-5]\d)?\D?(\d{3})?)?$") - _MULTIPART_UPLOAD_CHUNK_SIZE = 20000000 - def __init__(self, base_url, script_name=None, @@ -2061,6 +2059,10 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, "filmstrip_thumbnail" : filmstrip_thumbnail, } + params.update(self._auth_params()) + + # Create opener with extended form post support + opener = self._build_opener(FormPostHandler) url = urlparse.urlunparse((self.config.scheme, self.config.server, "/upload/share_thumbnail", None, None, None)) @@ -2217,17 +2219,33 @@ def _upload_to_storage(self, entity_type, entity_id, path, field_name, display_n # Step 1: get the upload url - is_multipart_upload = (os.path.getsize(path) > self._MULTIPART_UPLOAD_CHUNK_SIZE) - - upload_info = self._get_attachment_upload_info(is_thumbnail, filename, is_multipart_upload) + upload_info = self._get_attachment_upload_info(is_thumbnail, filename) # Step 2: upload the file - # We upload large files in multiple parts because it is more robust - # (and required when using S3 storage) - if is_multipart_upload: - self._multipart_upload_file_to_storage(path, upload_info) - else: - self._upload_file_to_storage(path, upload_info["upload_url"]) + + fd = open(path, "rb") + try: + content_type = mimetypes.guess_type(filename)[0] + content_type = content_type or "application/octet-stream" + file_size = os.fstat(fd.fileno())[stat.ST_SIZE] + + # Perform the request + opener = urllib2.build_opener(urllib2.HTTPHandler) + + request = urllib2.Request(upload_info["upload_url"], data=fd) + request.add_header("Content-Type", content_type) + request.add_header("Content-Length", file_size) + request.get_method = lambda: "PUT" + result = opener.open(request) + except urllib2.HTTPError, e: + if e.code == 500: + raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) + else: + raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) + finally: + fd.close() + + LOG.debug("File uploaded to Cloud storage: %s", filename) # Step 3: create the attachment @@ -2324,16 +2342,15 @@ def _upload_to_sg(self, entity_type, entity_id, path, field_name, display_name, attachment_id = int(str(result).split(":")[1].split("\n")[0]) return attachment_id - def _get_attachment_upload_info(self, is_thumbnail, filename, is_multipart_upload): + def _get_attachment_upload_info(self, is_thumbnail, filename): """ Internal function to get the information needed to upload a file to Cloud storage. :param bool is_thumbnail: indicates if the attachment is a thumbnail. :param str filename: name of the file that will be uploaded. - :param bool is_multipart_upload: Indicates if we want multi-part upload information back. - :returns: dictionary containing upload details from the server. - These details are used throughout the upload process. + :returns: dictionary containing the upload url and + upload_info (passed back to the SG server once the upload is completed). :rtype: dict """ @@ -2347,7 +2364,7 @@ def _get_attachment_upload_info(self, is_thumbnail, filename, is_multipart_uploa "filename" : filename } - params["multipart_upload"] = is_multipart_upload + params.update(self._auth_params()) upload_url = "/upload/api_get_upload_link_info" url = urlparse.urlunparse((self.config.scheme, self.config.server, @@ -2357,17 +2374,11 @@ def _get_attachment_upload_info(self, is_thumbnail, filename, is_multipart_uploa if not str(upload_info).startswith("1"): raise ShotgunError("Could not get upload_url but " \ "not sure why.\nPath: %s\nUrl: %s\nError: %s" % ( - filename, url, str(upload_info))) + path, url, str(upload_info))) LOG.debug("Completed rpc call to %s" % (upload_url)) - - upload_info_parts = str(upload_info).split("\n") - return { - "upload_url" : upload_info_parts[1], - "timestamp" : upload_info_parts[2], - "upload_type" : upload_info_parts[3], - "upload_id": upload_info_parts[4], + "upload_url" : str(upload_info).split("\n")[1], "upload_info" : upload_info } @@ -3528,144 +3539,6 @@ def _dict_to_extra_data(self, d, key_name="value"): """ return dict([(k, {key_name: v}) for (k,v) in (d or {}).iteritems()]) - def _upload_file_to_storage(self, path, storage_url): - """ - Internal function to upload an entire file to the Cloud storage. - - :param str path: Full path to an existing non-empty file on disk to upload. - :param str storage_url: Target URL for the uploaded file. - """ - filename = os.path.basename(path) - - fd = open(path, "rb") - try: - content_type = mimetypes.guess_type(filename)[0] - content_type = content_type or "application/octet-stream" - file_size = os.fstat(fd.fileno())[stat.ST_SIZE] - self._upload_data_to_storage(fd, content_type, file_size, storage_url ) - finally: - fd.close() - - LOG.debug("File uploaded to Cloud storage: %s", filename) - - def _multipart_upload_file_to_storage(self, path, upload_info): - """ - Internal function to upload a file to the Cloud storage in multiple parts. - - :param str path: Full path to an existing non-empty file on disk to upload. - :param dict upload_info: Contains details received from the server, about the upload. - """ - - fd = open(path, "rb") - try: - content_type = mimetypes.guess_type(path)[0] - content_type = content_type or "application/octet-stream" - file_size = os.fstat(fd.fileno())[stat.ST_SIZE] - filename = os.path.basename(path) - - etags = [] - part_number = 1 - bytes_read = 0 - chunk_size = self._MULTIPART_UPLOAD_CHUNK_SIZE - while bytes_read < file_size: - data = fd.read(chunk_size) - bytes_read += len(data) - part_url = self._get_upload_part_link(upload_info, filename, part_number) - etags.append(self._upload_data_to_storage(data, content_type, len(data), part_url )) - part_number += 1 - - self._complete_multipart_upload(upload_info, filename, etags) - finally: - fd.close() - - LOG.debug("File uploaded in multiple parts to Cloud storage: %s", path) - - def _get_upload_part_link(self, upload_info, filename, part_number): - """ - Internal function to get the url to upload the next part of a file to the - Cloud storage, in a multi-part upload process. - - :param dict upload_info: Contains details received from the server, about the upload. - :param str filename: Name of the file for which we want the link. - :param int part_number: Part number for the link. - :returns: upload url. - :rtype: str - """ - params = { - "upload_type": upload_info["upload_type"], - "filename": filename, - "timestamp": upload_info["timestamp"], - "upload_id": upload_info["upload_id"], - "part_number": part_number - } - - url = urlparse.urlunparse((self.config.scheme, self.config.server, - "/upload/api_get_upload_link_for_part", None, None, None)) - result = self._send_form(url, params) - - # Response is of the form: 1\n (for success) or 0\n (for failure). - # In case of success, we know we the second line of the response contains the - # requested URL. - if not str(result).startswith("1"): - raise ShotgunError("Unable get upload part link: %s" % result) - - LOG.debug("Got next upload link from server for multipart upload.") - return str(result).split("\n")[1] - - def _upload_data_to_storage(self, data, content_type, size, storage_url): - """ - Internal function to upload data to Cloud storage. - - :param stream data: Contains details received from the server, about the upload. - :param str content_type: Content type of the data stream. - :param int size: Number of bytes in the data stream. - :param str storage_url: Target URL for the uploaded file. - :returns: upload url. - :rtype: str - """ - try: - opener = urllib2.build_opener(urllib2.HTTPHandler) - - request = urllib2.Request(storage_url, data=data) - request.add_header("Content-Type", content_type) - request.add_header("Content-Length", size) - request.get_method = lambda: "PUT" - result = opener.open(request) - etag = result.info().getheader("ETag") - except urllib2.HTTPError, e: - if e.code == 500: - raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) - else: - raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) - - LOG.debug("Part upload completed successfully.") - return etag - - def _complete_multipart_upload(self, upload_info, filename, etags): - """ - Internal function to complete a multi-part upload to the Cloud storage. - - :param dict upload_info: Contains details received from the server, about the upload. - :param str filename: Name of the file for which we want to complete the upload. - :param tupple etags: Contains the etag of each uploaded file part. - """ - - params = { - "upload_type": upload_info["upload_type"], - "filename": filename, - "timestamp": upload_info["timestamp"], - "upload_id": upload_info["upload_id"], - "etags": ",".join(etags) - } - - url = urlparse.urlunparse((self.config.scheme, self.config.server, - "/upload/api_complete_multipart_upload", None, None, None)) - result = self._send_form(url, params) - - # Response is of the form: 1\n or 0\n to indicate success or failure of the call. - if not str(result).startswith("1"): - raise ShotgunError("Unable get upload part link: %s" % result) - def _send_form(self, url, params): """ Utility function to send a Form to Shotgun and process any HTTP errors that @@ -3675,9 +3548,6 @@ def _send_form(self, url, params): :param params: form data :returns: result from the server. """ - - params.update(self._auth_params()) - opener = self._build_opener(FormPostHandler) # Perform the request From 2b4230910e1ef521e1cabdd1dcecb1cd761edc09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Jacques?= Date: Fri, 17 Mar 2017 08:24:39 -0400 Subject: [PATCH 164/389] For #40884: Extend support for direct uploads to S3 Direct upload to S3 now supports multipart uploads. This means we now support uploads of files > 5GB. --- shotgun_api3/shotgun.py | 200 +++++++++++++++++++++++++++++++++------- 1 file changed, 165 insertions(+), 35 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 405f7fa1d..629304811 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -362,6 +362,8 @@ class Shotgun(object): "^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])"\ "(\D?([01]\d|2[0-3])\D?([0-5]\d)\D?([0-5]\d)?\D?(\d{3})?)?$") + _MULTIPART_UPLOAD_CHUNK_SIZE = 20000000 + def __init__(self, base_url, script_name=None, @@ -2059,10 +2061,6 @@ def share_thumbnail(self, entities, thumbnail_path=None, source_entity=None, "filmstrip_thumbnail" : filmstrip_thumbnail, } - params.update(self._auth_params()) - - # Create opener with extended form post support - opener = self._build_opener(FormPostHandler) url = urlparse.urlunparse((self.config.scheme, self.config.server, "/upload/share_thumbnail", None, None, None)) @@ -2219,33 +2217,17 @@ def _upload_to_storage(self, entity_type, entity_id, path, field_name, display_n # Step 1: get the upload url - upload_info = self._get_attachment_upload_info(is_thumbnail, filename) - - # Step 2: upload the file - - fd = open(path, "rb") - try: - content_type = mimetypes.guess_type(filename)[0] - content_type = content_type or "application/octet-stream" - file_size = os.fstat(fd.fileno())[stat.ST_SIZE] - - # Perform the request - opener = urllib2.build_opener(urllib2.HTTPHandler) + is_multipart_upload = (os.path.getsize(path) > self._MULTIPART_UPLOAD_CHUNK_SIZE) - request = urllib2.Request(upload_info["upload_url"], data=fd) - request.add_header("Content-Type", content_type) - request.add_header("Content-Length", file_size) - request.get_method = lambda: "PUT" - result = opener.open(request) - except urllib2.HTTPError, e: - if e.code == 500: - raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) - else: - raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) - finally: - fd.close() + upload_info = self._get_attachment_upload_info(is_thumbnail, filename, is_multipart_upload) - LOG.debug("File uploaded to Cloud storage: %s", filename) + # Step 2: upload the file + # We upload large files in multiple parts because it is more robust + # (and required when using S3 storage) + if is_multipart_upload: + self._multipart_upload_file_to_storage(path, upload_info) + else: + self._upload_file_to_storage(path, upload_info["upload_url"]) # Step 3: create the attachment @@ -2342,15 +2324,16 @@ def _upload_to_sg(self, entity_type, entity_id, path, field_name, display_name, attachment_id = int(str(result).split(":")[1].split("\n")[0]) return attachment_id - def _get_attachment_upload_info(self, is_thumbnail, filename): + def _get_attachment_upload_info(self, is_thumbnail, filename, is_multipart_upload): """ Internal function to get the information needed to upload a file to Cloud storage. :param bool is_thumbnail: indicates if the attachment is a thumbnail. :param str filename: name of the file that will be uploaded. + :param bool is_multipart_upload: Indicates if we want multi-part upload information back. - :returns: dictionary containing the upload url and - upload_info (passed back to the SG server once the upload is completed). + :returns: dictionary containing upload details from the server. + These details are used throughout the upload process. :rtype: dict """ @@ -2364,7 +2347,7 @@ def _get_attachment_upload_info(self, is_thumbnail, filename): "filename" : filename } - params.update(self._auth_params()) + params["multipart_upload"] = is_multipart_upload upload_url = "/upload/api_get_upload_link_info" url = urlparse.urlunparse((self.config.scheme, self.config.server, @@ -2374,11 +2357,17 @@ def _get_attachment_upload_info(self, is_thumbnail, filename): if not str(upload_info).startswith("1"): raise ShotgunError("Could not get upload_url but " \ "not sure why.\nPath: %s\nUrl: %s\nError: %s" % ( - path, url, str(upload_info))) + filename, url, str(upload_info))) LOG.debug("Completed rpc call to %s" % (upload_url)) + + upload_info_parts = str(upload_info).split("\n") + return { - "upload_url" : str(upload_info).split("\n")[1], + "upload_url" : upload_info_parts[1], + "timestamp" : upload_info_parts[2], + "upload_type" : upload_info_parts[3], + "upload_id": upload_info_parts[4], "upload_info" : upload_info } @@ -3539,6 +3528,144 @@ def _dict_to_extra_data(self, d, key_name="value"): """ return dict([(k, {key_name: v}) for (k,v) in (d or {}).iteritems()]) + def _upload_file_to_storage(self, path, storage_url): + """ + Internal function to upload an entire file to the Cloud storage. + + :param str path: Full path to an existing non-empty file on disk to upload. + :param str storage_url: Target URL for the uploaded file. + """ + filename = os.path.basename(path) + + fd = open(path, "rb") + try: + content_type = mimetypes.guess_type(filename)[0] + content_type = content_type or "application/octet-stream" + file_size = os.fstat(fd.fileno())[stat.ST_SIZE] + self._upload_data_to_storage(fd, content_type, file_size, storage_url ) + finally: + fd.close() + + LOG.debug("File uploaded to Cloud storage: %s", filename) + + def _multipart_upload_file_to_storage(self, path, upload_info): + """ + Internal function to upload a file to the Cloud storage in multiple parts. + + :param str path: Full path to an existing non-empty file on disk to upload. + :param dict upload_info: Contains details received from the server, about the upload. + """ + + fd = open(path, "rb") + try: + content_type = mimetypes.guess_type(path)[0] + content_type = content_type or "application/octet-stream" + file_size = os.fstat(fd.fileno())[stat.ST_SIZE] + filename = os.path.basename(path) + + etags = [] + part_number = 1 + bytes_read = 0 + chunk_size = self._MULTIPART_UPLOAD_CHUNK_SIZE + while bytes_read < file_size: + data = fd.read(chunk_size) + bytes_read += len(data) + part_url = self._get_upload_part_link(upload_info, filename, part_number) + etags.append(self._upload_data_to_storage(data, content_type, len(data), part_url )) + part_number += 1 + + self._complete_multipart_upload(upload_info, filename, etags) + finally: + fd.close() + + LOG.debug("File uploaded in multiple parts to Cloud storage: %s", path) + + def _get_upload_part_link(self, upload_info, filename, part_number): + """ + Internal function to get the url to upload the next part of a file to the + Cloud storage, in a multi-part upload process. + + :param dict upload_info: Contains details received from the server, about the upload. + :param str filename: Name of the file for which we want the link. + :param int part_number: Part number for the link. + :returns: upload url. + :rtype: str + """ + params = { + "upload_type": upload_info["upload_type"], + "filename": filename, + "timestamp": upload_info["timestamp"], + "upload_id": upload_info["upload_id"], + "part_number": part_number + } + + url = urlparse.urlunparse((self.config.scheme, self.config.server, + "/upload/api_get_upload_link_for_part", None, None, None)) + result = self._send_form(url, params) + + # Response is of the form: 1\n (for success) or 0\n (for failure). + # In case of success, we know we the second line of the response contains the + # requested URL. + if not str(result).startswith("1"): + raise ShotgunError("Unable get upload part link: %s" % result) + + LOG.debug("Got next upload link from server for multipart upload.") + return str(result).split("\n")[1] + + def _upload_data_to_storage(self, data, content_type, size, storage_url): + """ + Internal function to upload data to Cloud storage. + + :param stream data: Contains details received from the server, about the upload. + :param str content_type: Content type of the data stream. + :param int size: Number of bytes in the data stream. + :param str storage_url: Target URL for the uploaded file. + :returns: upload url. + :rtype: str + """ + try: + opener = urllib2.build_opener(urllib2.HTTPHandler) + + request = urllib2.Request(storage_url, data=data) + request.add_header("Content-Type", content_type) + request.add_header("Content-Length", size) + request.get_method = lambda: "PUT" + result = opener.open(request) + etag = result.info().getheader("ETag") + except urllib2.HTTPError, e: + if e.code == 500: + raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) + else: + raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) + + LOG.debug("Part upload completed successfully.") + return etag + + def _complete_multipart_upload(self, upload_info, filename, etags): + """ + Internal function to complete a multi-part upload to the Cloud storage. + + :param dict upload_info: Contains details received from the server, about the upload. + :param str filename: Name of the file for which we want to complete the upload. + :param tupple etags: Contains the etag of each uploaded file part. + """ + + params = { + "upload_type": upload_info["upload_type"], + "filename": filename, + "timestamp": upload_info["timestamp"], + "upload_id": upload_info["upload_id"], + "etags": ",".join(etags) + } + + url = urlparse.urlunparse((self.config.scheme, self.config.server, + "/upload/api_complete_multipart_upload", None, None, None)) + result = self._send_form(url, params) + + # Response is of the form: 1\n or 0\n to indicate success or failure of the call. + if not str(result).startswith("1"): + raise ShotgunError("Unable get upload part link: %s" % result) + def _send_form(self, url, params): """ Utility function to send a Form to Shotgun and process any HTTP errors that @@ -3548,6 +3675,9 @@ def _send_form(self, url, params): :param params: form data :returns: result from the server. """ + + params.update(self._auth_params()) + opener = self._build_opener(FormPostHandler) # Perform the request From f2afa75ea0f75796c76f16c6045f2ffe98b65832 Mon Sep 17 00:00:00 2001 From: daigles Date: Fri, 17 Mar 2017 08:29:04 -0400 Subject: [PATCH 165/389] For #40885: Fixed error message --- shotgun_api3/shotgun.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 629304811..dbb6afad6 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -3634,9 +3634,9 @@ def _upload_data_to_storage(self, data, content_type, size, storage_url): etag = result.info().getheader("ETag") except urllib2.HTTPError, e: if e.code == 500: - raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (url, e)) + raise ShotgunError("Server encountered an internal error.\n%s\n%s\n\n" % (storage_url, e)) else: - raise ShotgunError("Unanticipated error occurred uploading %s: %s" % (path, e)) + raise ShotgunError("Unanticipated error occurred uploading to %s: %s" % (storage_url, e)) LOG.debug("Part upload completed successfully.") return etag From 69133490b9f01bf29b5bafca2969810dcd8b97e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Deverly?= Date: Mon, 20 Mar 2017 14:16:21 +0100 Subject: [PATCH 166/389] For #41470, fix skipped tests (#143) Ensured a tuple is used for LiveTestBase.sg_version so comparisons against tuples like (7,0,0) work. --- tests/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/base.py b/tests/base.py index 899f642a5..6f86b79d6 100644 --- a/tests/base.py +++ b/tests/base.py @@ -192,7 +192,7 @@ class LiveTestBase(TestBase): '''Test base for tests relying on connection to server.''' def setUp(self, auth_mode='ApiUser'): super(LiveTestBase, self).setUp(auth_mode) - self.sg_version = self.sg.info()['version'][:3] + self.sg_version = tuple(self.sg.info()['version'][:3]) self._setup_db(self.config) if self.sg.server_caps.version and \ self.sg.server_caps.version >= (3, 3, 0) and \ From 2a8b7ce8b93e7e79583499857fd575a7c1fe62b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Fri, 24 Mar 2017 13:04:21 -0400 Subject: [PATCH 167/389] [Mockgun] Fixes is/is_not comparison with None on multi entity fields. --- HISTORY.rst | 2 +- shotgun_api3/lib/mockgun/mockgun.py | 4 ++++ tests/test_mockgun.py | 13 +++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 7cfda35c6..77a114ce0 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -11,7 +11,7 @@ v3.0.33.dev (TBD) or :meth:`upload_filmstrip_thumbnail` before calling out to the server. - Multiple enhancements and bugfixes to Mockgun: - Added support for filters using the `filter_operator` syntax. - - `is` and `is_not` comparison with a field set to `None` are now handled. + - `is` and `is_not` comparisons with an entity or multi-entity field set to `None` are now handled. - Fixed contains operator on strings. - Fixed entity link comparisons with `None`. - Added support for dotted notation in find parameters (e.g. `users.HumanUser.login`) on both entity and multi-entity fields. diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index 7b4a64a77..e0ab26d78 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -600,8 +600,12 @@ def _compare(self, field_type, lval, operator, rval): return lval["name"].endswith(rval) elif field_type == "multi_entity": if operator == "is": + if rval is None: + return len(lval) == 0 return rval["id"] in (sub_lval["id"] for sub_lval in lval) elif operator == "is_not": + if rval is None: + return len(lval) != 0 return rval["id"] not in (sub_lval["id"] for sub_lval in lval) raise ShotgunError("The %s operator is not supported on the %s type" % (operator, field_type)) diff --git a/tests/test_mockgun.py b/tests/test_mockgun.py index 30002a599..5a5d34117 100644 --- a/tests/test_mockgun.py +++ b/tests/test_mockgun.py @@ -269,6 +269,19 @@ def test_find_by_sub_entity_field(self): ) self.assertEqual(len(items), 1) + def test_find_with_none(self): + """ + Ensures comparison with multi-entity fields and None works. + """ + items = self._mockgun.find("PipelineConfiguration", [["users", "is", None]], ["users"]) + self.assertEqual(len(items), 1) + self.assertEqual(items[0]["users"], []) + + items = self._mockgun.find("PipelineConfiguration", [["users", "is_not", None]], ["users"]) + self.assertEqual(len(items), 3) + for item in items: + self.assertTrue(len(item["users"]) > 0) + class TestFilterOperator(TestBaseWithExceptionTests): """ From 5d71ecd3419ee769ab11ce11c647f3f9c560c9bd Mon Sep 17 00:00:00 2001 From: daigles Date: Sun, 16 Apr 2017 09:26:34 -0400 Subject: [PATCH 168/389] #41856 Added function to support new nav_search RPC (#146) Added nav_search_string() and nav_search_entity() methods as experimental, internal methods for querying SG hierarchy. --- HISTORY.rst | 3 ++- shotgun_api3/shotgun.py | 45 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 77a114ce0..4b6c6909f 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -18,6 +18,7 @@ v3.0.33.dev (TBD) - Added unit tests for Mockgun in `test_mockgun.py`. The tests currently cover all the fixes and features mentionned above. - Schemas are written using pickle's highest protocol as of Python 2.4's release, which speeds up the loading from disk. - The current schema is cached in memory so it can be reused without having to do back to disk. +- Added ``nav_search_string()`` and ``nav_search_entity()`` methods as experimental, internal methods for querying SG hierarchy. - TBD v3.0.32 (2016 Sep 22) @@ -330,4 +331,4 @@ v3.0b3 (2009 June 24) - added ``__version__`` string. - removed ``RECORDS_PER_PAGE`` global (can just set ``records_per_page`` on the Shotgun object after initializing it). -- removed ``api_ver`` from the constructor, as this class is only designed to work with API v3. \ No newline at end of file +- removed ``api_ver`` from the constructor, as this class is only designed to work with API v3. diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index dbb6afad6..0d8797495 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2887,14 +2887,51 @@ def nav_expand(self, path, seed_entity_field=None, entity_fields=None): """ return self._call_rpc( - 'nav_expand', + "nav_expand", { - 'path':path, - 'seed_entity_field': seed_entity_field, - 'entity_fields': entity_fields + "path":path, + "seed_entity_field": seed_entity_field, + "entity_fields": entity_fields } ) + def nav_search_string(self, root_path, search_string): + """ + Search function adapted to work with the navigation hierarchy. + + .. warning:: + + This is an experimental method that is not officially part of the + python-api. Usage of this method is discouraged. This method's name, + arguments, and argument types may change at any point. + """ + return self._call_rpc( + "nav_search", + { + "root_path":root_path, + "search_criteria": { "search_string": search_string } + } + ) + + def nav_search_entity(self, root_path, entity): + """ + Search function adapted to work with the navigation hierarchy. + + .. warning:: + + This is an experimental method that is not officially part of the + python-api. Usage of this method is discouraged. This method's name, + arguments, and argument types may change at any point. + + """ + return self._call_rpc( + "nav_search", + { + "root_path": root_path, + "search_criteria": {"entity": entity } + } + ) + def get_session_token(self): """ Get the session token associated with the current session. From 73554b51f795bd5a89f824e0ae69f7c470f0cf90 Mon Sep 17 00:00:00 2001 From: Renaud Lessard Larouche Date: Thu, 4 May 2017 15:21:57 -0400 Subject: [PATCH 169/389] fix nested multi-entities query (#138) Fixes for Mockgun. - Enhancements to multi-entity queries. - You can now order or rows that are now part of the predicate. - `created_at` is now set during tests. Thanks to @renaudll for all these changes. --- shotgun_api3/lib/mockgun/mockgun.py | 59 +++++++----- tests/test_mockgun.py | 142 ++++++++++++++++++++++++++-- 2 files changed, 173 insertions(+), 28 deletions(-) diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index e0ab26d78..e511d5234 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -242,16 +242,31 @@ def schema_field_read(self, entity_type, field_name=None): else: return dict((k, v) for k, v in self._schema[entity_type].items() if k == field_name) - def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0): - - self.finds += 1 self._validate_entity_type(entity_type) # do not validate custom fields - this makes it hard to mock up a field quickly #self._validate_entity_fields(entity_type, fields) + # Configure fields + if fields is None: + requested_fields = set(["type", "id"]) + else: + requested_fields = set(fields) | set(["type", "id"]) + + # Include fields from the order argument in the searched fields + order_fields = set() + if order: + for o in order: + order_fields.add(o['field_name']) + + # Merge the requested fields and the order fields. + # We need all those to property order the results but still return only requested fields. + all_fields = set() + all_fields.update(requested_fields) + all_fields.update(order_fields) + # FIXME: This should be refactored so that we can use the complex filer # style in nested filter operations. if isinstance(filters, dict): @@ -274,7 +289,7 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No resolved_filters.append([ f["path"], f["relation"], f["values"][0] ]) else: - # traditiona style sg filters + # traditional style sg filters resolved_filters = filters results = [ @@ -285,7 +300,10 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No ) ] - # handle the ordering of the recordset + # Extract fields from row + val = [dict((field, self._get_field_from_row(entity_type, row, field)) for field in all_fields) for row in results] + + # Handle the ordering of the result after we requested additional fields from results. if order: # order: [{"field_name": "code", "direction": "asc"}, ... ] for order_entry in order: @@ -300,23 +318,20 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No else: raise ValueError("Unknown ordering direction") - results = sorted(results, key=lambda k: k[order_field], reverse=desc_order) + val = sorted(val, key=lambda k: k[order_field], reverse=desc_order) - if fields is None: - fields = set(["type", "id"]) - else: - fields = set(fields) | set(["type", "id"]) - - # get the values requested - val = [dict((field, self._get_field_from_row(entity_type, row, field)) for field in fields) for row in results] + # Remove any fields that was not explicitely requested. + fields_to_remove = all_fields - requested_fields + for v in val: + for field in fields_to_remove: + v.pop(field) return val - - + def find_one(self, entity_type, filters, fields=None, order=None, filter_operator=None, retired_only=False): results = self.find(entity_type, filters, fields=fields, order=order, filter_operator=filter_operator, retired_only=retired_only) return results[0] if results else None - + def batch(self, requests): results = [] for request in requests: @@ -361,9 +376,12 @@ def create(self, entity_type, data, return_fields=None): row = self._get_new_row(entity_type) - self._update_row(entity_type, row, data) + self._update_row(entity_type, row, data) row["id"] = next_id + if "created_at" not in row: + row["created_at"] = datetime.datetime.now() + self._db[entity_type][next_id] = row if return_fields is None: @@ -637,15 +655,12 @@ def _get_field_from_row(self, entity_type, row, field): sub_field_value = self._get_field_from_row(entity_type2, entity, field3) values.append(sub_field_value) return values + elif field_value is None: + return None # not multi entity, must be entity. elif not isinstance(field_value, dict): raise ShotgunError("Invalid deep query field %s.%s" % (entity_type, field)) - # make sure that types in the query match type in the linked field - if entity_type2 != field_value["type"]: - raise ShotgunError("Deep query field %s.%s does not match type " - "with data %s" % (entity_type, field, field_value)) - # ok so looks like the value is an entity link # e.g. db contains: {"sg_sequence": {"type":"Sequence", "id": 123 } } linked_row = self._db[ field_value["type"] ][ field_value["id"] ] diff --git a/tests/test_mockgun.py b/tests/test_mockgun.py index 5a5d34117..feacd0f5e 100644 --- a/tests/test_mockgun.py +++ b/tests/test_mockgun.py @@ -216,23 +216,33 @@ def setUp(self): self._user1 = self._mockgun.create("HumanUser", {"login": "user1"}) self._user2 = self._mockgun.create("HumanUser", {"login": "user2"}) + # Create a project for nested sub entity field + self._project1 = self._mockgun.create("Project", {"name": "project1", "users": [self._user1]}) + self._project2 = self._mockgun.create("Project", {"name": "project2", "users": [self._user2]}) + + self._sequence1 = self._mockgun.create("Sequence", {"code":"01", "project":self._project1}) + self._shot1 = self._mockgun.create("Shot", {"code":"01_0010", "project":self._project1, "sg_sequence": self._sequence1}) + + self._task_seq = self._mockgun.create("Task", {"entity": self._sequence1}) + self._task_shot = self._mockgun.create("Task", {"entity": self._shot1}) + # Create pipeline configurations that are assigned none, one or two users. - self._mockgun.create( + self._pipeline_config_1 = self._mockgun.create( "PipelineConfiguration", - {"code": "with_user1", "users": [self._user1]} + {"code": "with_user1", "users": [self._user1], "project": self._project1} ) - self._mockgun.create( + self._pipeline_config_2 = self._mockgun.create( "PipelineConfiguration", - {"code": "with_user2", "users": [self._user2]} + {"code": "with_user2", "users": [self._user2], "project": self._project2} ) - self._mockgun.create( + self._pipeline_config_3 = self._mockgun.create( "PipelineConfiguration", {"code": "with_both", "users": [self._user2, self._user1]} ) - self._mockgun.create( + self._pipeline_config_4 = self._mockgun.create( "PipelineConfiguration", {"code": "with_none", "users": []} ) @@ -268,6 +278,126 @@ def test_find_by_sub_entity_field(self): ]}] ) self.assertEqual(len(items), 1) + + # Try with multi entities + item = self._mockgun.find_one("Task", [ + ['entity.Shot.code', 'is', self._shot1['code']] + ]) + self.assertNotEqual(None, item) + self.assertEqual(self._task_shot["id"], item["id"]) + + item = self._mockgun.find_one("Task", [ + ['entity.Sequence.code', 'is', self._sequence1['code']] + ]) + self.assertNotEqual(None, item) + self.assertEqual(self._task_seq["id"], item["id"]) + + def test_find_by_sub_entity_field_nested(self): + """ + Ensure that queries on nested linked entity fields work. + """ + items = self._mockgun.find("PipelineConfiguration", [ + ["project.Project.users.HumanUser.login", "is", "user1"] + ]) + self.assertEqual(len(items), 1) + self.assertEqual(self._pipeline_config_1['id'], items[0]['id']) + + items = self._mockgun.find("PipelineConfiguration", [ + ["project.Project.users.HumanUser.login", "is", "user2"] + ]) + self.assertEqual(len(items), 1) + self.assertEqual(self._pipeline_config_2['id'], items[0]['id']) + + + +class TestFindFields(TestBaseWithExceptionTests): + """ + Ensure that using the 'field' argument in the find method work. + """ + + def setUp(self): + """Creates test data.""" + self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") + + # Create two users to assign to the pipeline configurations. + self._user1 = self._mockgun.create("HumanUser", {"login": "user1", "firstname": "firstname1"}) + + # Create a project for nested sub entity field + self._project1 = self._mockgun.create("Project", {"name": "project1", "users": [self._user1]}) + + # Create pipeline configurations that are assigned none, one or two users. + self._mockgun.create( + "PipelineConfiguration", + {"code": "with_user1", "users": [self._user1], "project": self._project1} + ) + + def test_field(self): + item = self._mockgun.find_one("HumanUser", [ + ["login", "is", "user1"] + ], ["firstname"]) + self.assertIn("firstname",item) + self.assertEqual("firstname1", item["firstname"]) + + def test_find_field_multi_entity(self): + item = self._mockgun.find_one("PipelineConfiguration", [ + ["project.Project.users.HumanUser.login", "is", "user1"] + ], ["project.Project.name"]) + self.assertIn("project.Project.name", item) + self.assertEqual("project1", item["project.Project.name"]) + + +class TestFindOrder(TestBaseWithExceptionTests): + """ + Ensure that using the 'order' argument in the find method work. + """ + def setUp(self): + self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") + + # Create two users to assign to the pipeline configurations. + self._user1 = self._mockgun.create("HumanUser", {"login": "user1", "firstname": "firstname1", "email": "user1@foobar.com"}) + self._user2 = self._mockgun.create("HumanUser", {"login": "user2", "firstname": "firstname2", "email": "user2@foobar.com"}) + + # Create a project for nested sub entity field + self._project1 = self._mockgun.create("Project", {"name": "project1", "users": [self._user1]}) + self._project2 = self._mockgun.create("Project", {"name": "project2", "users": [self._user2]}) + + # Create two PipelineConfiguration entities so we can test multi-entity sorting. + self._pipeline_configutation_1 = self._mockgun.create("PipelineConfiguration", { + "code": "PipelineConfiguration1", "users": [self._user2], "project": self._project1}) + self._pipeline_configutation_2 = self._mockgun.create("PipelineConfiguration", { + "code": "PipelineConfiguration2", "users": [self._user1], "project": self._project2}) + + def test_find_order(self): + # Test ascending order + item = self._mockgun.find_one("HumanUser", [], order=[{'field_name': 'login', 'direction': 'asc'}]) + self.assertEqual(self._user1['id'], item['id']) + + # Test descending order + item = self._mockgun.find_one("HumanUser", [], order=[{'field_name': 'login', 'direction': 'desc'}]) + self.assertEqual(self._user2['id'], item['id']) + + def test_find_order_linked_entity_field(self): + """Ensure we are able to sort data using a linked entity field.""" + # Test ascending order + item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'project.Project.name', 'direction': 'asc'}]) + self.assertEqual(self._pipeline_configutation_1['id'], item['id']) + + # Test descending order + item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'project.Project.name', 'direction': 'desc'}]) + self.assertEqual(self._pipeline_configutation_2['id'], item['id']) + + def test_find_order_fields_leak(self): + """Ensure that additional fields passed through the order argument but NOT via the field argument are not added to the resulting fields.""" + item = self._mockgun.find_one("HumanUser", [], fields=['email'], order=[{'field_name': 'login', 'direction': 'asc'}]) + self.assertEqual(set(item.keys()), set(['id', 'type', 'email'])) # note: we don't verify the order yet + + def test_find_order_date_created(self): + """Ensure we are able to sort entities by their creation date.""" + item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'created_at', 'direction': 'asc'}]) + self.assertEqual(self._pipeline_configutation_1['id'], item['id']) + + item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'created_at', 'direction': 'desc'}]) + self.assertEqual(self._pipeline_configutation_2['id'], item['id']) def test_find_with_none(self): """ From 3187e01fa7176407a2a5129b7261e18d22918645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 4 May 2017 15:25:17 -0400 Subject: [PATCH 170/389] Revert "fix nested multi-entities query (#138)" This reverts commit 73554b51f795bd5a89f824e0ae69f7c470f0cf90. --- shotgun_api3/lib/mockgun/mockgun.py | 59 +++++------- tests/test_mockgun.py | 142 ++-------------------------- 2 files changed, 28 insertions(+), 173 deletions(-) diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index e511d5234..e0ab26d78 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -242,31 +242,16 @@ def schema_field_read(self, entity_type, field_name=None): else: return dict((k, v) for k, v in self._schema[entity_type].items() if k == field_name) + def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0): + + self.finds += 1 self._validate_entity_type(entity_type) # do not validate custom fields - this makes it hard to mock up a field quickly #self._validate_entity_fields(entity_type, fields) - # Configure fields - if fields is None: - requested_fields = set(["type", "id"]) - else: - requested_fields = set(fields) | set(["type", "id"]) - - # Include fields from the order argument in the searched fields - order_fields = set() - if order: - for o in order: - order_fields.add(o['field_name']) - - # Merge the requested fields and the order fields. - # We need all those to property order the results but still return only requested fields. - all_fields = set() - all_fields.update(requested_fields) - all_fields.update(order_fields) - # FIXME: This should be refactored so that we can use the complex filer # style in nested filter operations. if isinstance(filters, dict): @@ -289,7 +274,7 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No resolved_filters.append([ f["path"], f["relation"], f["values"][0] ]) else: - # traditional style sg filters + # traditiona style sg filters resolved_filters = filters results = [ @@ -300,10 +285,7 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No ) ] - # Extract fields from row - val = [dict((field, self._get_field_from_row(entity_type, row, field)) for field in all_fields) for row in results] - - # Handle the ordering of the result after we requested additional fields from results. + # handle the ordering of the recordset if order: # order: [{"field_name": "code", "direction": "asc"}, ... ] for order_entry in order: @@ -318,20 +300,23 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No else: raise ValueError("Unknown ordering direction") - val = sorted(val, key=lambda k: k[order_field], reverse=desc_order) + results = sorted(results, key=lambda k: k[order_field], reverse=desc_order) - # Remove any fields that was not explicitely requested. - fields_to_remove = all_fields - requested_fields - for v in val: - for field in fields_to_remove: - v.pop(field) + if fields is None: + fields = set(["type", "id"]) + else: + fields = set(fields) | set(["type", "id"]) - return val + # get the values requested + val = [dict((field, self._get_field_from_row(entity_type, row, field)) for field in fields) for row in results] + return val + + def find_one(self, entity_type, filters, fields=None, order=None, filter_operator=None, retired_only=False): results = self.find(entity_type, filters, fields=fields, order=order, filter_operator=filter_operator, retired_only=retired_only) return results[0] if results else None - + def batch(self, requests): results = [] for request in requests: @@ -376,12 +361,9 @@ def create(self, entity_type, data, return_fields=None): row = self._get_new_row(entity_type) - self._update_row(entity_type, row, data) + self._update_row(entity_type, row, data) row["id"] = next_id - if "created_at" not in row: - row["created_at"] = datetime.datetime.now() - self._db[entity_type][next_id] = row if return_fields is None: @@ -655,12 +637,15 @@ def _get_field_from_row(self, entity_type, row, field): sub_field_value = self._get_field_from_row(entity_type2, entity, field3) values.append(sub_field_value) return values - elif field_value is None: - return None # not multi entity, must be entity. elif not isinstance(field_value, dict): raise ShotgunError("Invalid deep query field %s.%s" % (entity_type, field)) + # make sure that types in the query match type in the linked field + if entity_type2 != field_value["type"]: + raise ShotgunError("Deep query field %s.%s does not match type " + "with data %s" % (entity_type, field, field_value)) + # ok so looks like the value is an entity link # e.g. db contains: {"sg_sequence": {"type":"Sequence", "id": 123 } } linked_row = self._db[ field_value["type"] ][ field_value["id"] ] diff --git a/tests/test_mockgun.py b/tests/test_mockgun.py index feacd0f5e..5a5d34117 100644 --- a/tests/test_mockgun.py +++ b/tests/test_mockgun.py @@ -216,33 +216,23 @@ def setUp(self): self._user1 = self._mockgun.create("HumanUser", {"login": "user1"}) self._user2 = self._mockgun.create("HumanUser", {"login": "user2"}) - # Create a project for nested sub entity field - self._project1 = self._mockgun.create("Project", {"name": "project1", "users": [self._user1]}) - self._project2 = self._mockgun.create("Project", {"name": "project2", "users": [self._user2]}) - - self._sequence1 = self._mockgun.create("Sequence", {"code":"01", "project":self._project1}) - self._shot1 = self._mockgun.create("Shot", {"code":"01_0010", "project":self._project1, "sg_sequence": self._sequence1}) - - self._task_seq = self._mockgun.create("Task", {"entity": self._sequence1}) - self._task_shot = self._mockgun.create("Task", {"entity": self._shot1}) - # Create pipeline configurations that are assigned none, one or two users. - self._pipeline_config_1 = self._mockgun.create( + self._mockgun.create( "PipelineConfiguration", - {"code": "with_user1", "users": [self._user1], "project": self._project1} + {"code": "with_user1", "users": [self._user1]} ) - self._pipeline_config_2 = self._mockgun.create( + self._mockgun.create( "PipelineConfiguration", - {"code": "with_user2", "users": [self._user2], "project": self._project2} + {"code": "with_user2", "users": [self._user2]} ) - self._pipeline_config_3 = self._mockgun.create( + self._mockgun.create( "PipelineConfiguration", {"code": "with_both", "users": [self._user2, self._user1]} ) - self._pipeline_config_4 = self._mockgun.create( + self._mockgun.create( "PipelineConfiguration", {"code": "with_none", "users": []} ) @@ -278,126 +268,6 @@ def test_find_by_sub_entity_field(self): ]}] ) self.assertEqual(len(items), 1) - - # Try with multi entities - item = self._mockgun.find_one("Task", [ - ['entity.Shot.code', 'is', self._shot1['code']] - ]) - self.assertNotEqual(None, item) - self.assertEqual(self._task_shot["id"], item["id"]) - - item = self._mockgun.find_one("Task", [ - ['entity.Sequence.code', 'is', self._sequence1['code']] - ]) - self.assertNotEqual(None, item) - self.assertEqual(self._task_seq["id"], item["id"]) - - def test_find_by_sub_entity_field_nested(self): - """ - Ensure that queries on nested linked entity fields work. - """ - items = self._mockgun.find("PipelineConfiguration", [ - ["project.Project.users.HumanUser.login", "is", "user1"] - ]) - self.assertEqual(len(items), 1) - self.assertEqual(self._pipeline_config_1['id'], items[0]['id']) - - items = self._mockgun.find("PipelineConfiguration", [ - ["project.Project.users.HumanUser.login", "is", "user2"] - ]) - self.assertEqual(len(items), 1) - self.assertEqual(self._pipeline_config_2['id'], items[0]['id']) - - - -class TestFindFields(TestBaseWithExceptionTests): - """ - Ensure that using the 'field' argument in the find method work. - """ - - def setUp(self): - """Creates test data.""" - self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") - - # Create two users to assign to the pipeline configurations. - self._user1 = self._mockgun.create("HumanUser", {"login": "user1", "firstname": "firstname1"}) - - # Create a project for nested sub entity field - self._project1 = self._mockgun.create("Project", {"name": "project1", "users": [self._user1]}) - - # Create pipeline configurations that are assigned none, one or two users. - self._mockgun.create( - "PipelineConfiguration", - {"code": "with_user1", "users": [self._user1], "project": self._project1} - ) - - def test_field(self): - item = self._mockgun.find_one("HumanUser", [ - ["login", "is", "user1"] - ], ["firstname"]) - self.assertIn("firstname",item) - self.assertEqual("firstname1", item["firstname"]) - - def test_find_field_multi_entity(self): - item = self._mockgun.find_one("PipelineConfiguration", [ - ["project.Project.users.HumanUser.login", "is", "user1"] - ], ["project.Project.name"]) - self.assertIn("project.Project.name", item) - self.assertEqual("project1", item["project.Project.name"]) - - -class TestFindOrder(TestBaseWithExceptionTests): - """ - Ensure that using the 'order' argument in the find method work. - """ - def setUp(self): - self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") - - # Create two users to assign to the pipeline configurations. - self._user1 = self._mockgun.create("HumanUser", {"login": "user1", "firstname": "firstname1", "email": "user1@foobar.com"}) - self._user2 = self._mockgun.create("HumanUser", {"login": "user2", "firstname": "firstname2", "email": "user2@foobar.com"}) - - # Create a project for nested sub entity field - self._project1 = self._mockgun.create("Project", {"name": "project1", "users": [self._user1]}) - self._project2 = self._mockgun.create("Project", {"name": "project2", "users": [self._user2]}) - - # Create two PipelineConfiguration entities so we can test multi-entity sorting. - self._pipeline_configutation_1 = self._mockgun.create("PipelineConfiguration", { - "code": "PipelineConfiguration1", "users": [self._user2], "project": self._project1}) - self._pipeline_configutation_2 = self._mockgun.create("PipelineConfiguration", { - "code": "PipelineConfiguration2", "users": [self._user1], "project": self._project2}) - - def test_find_order(self): - # Test ascending order - item = self._mockgun.find_one("HumanUser", [], order=[{'field_name': 'login', 'direction': 'asc'}]) - self.assertEqual(self._user1['id'], item['id']) - - # Test descending order - item = self._mockgun.find_one("HumanUser", [], order=[{'field_name': 'login', 'direction': 'desc'}]) - self.assertEqual(self._user2['id'], item['id']) - - def test_find_order_linked_entity_field(self): - """Ensure we are able to sort data using a linked entity field.""" - # Test ascending order - item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'project.Project.name', 'direction': 'asc'}]) - self.assertEqual(self._pipeline_configutation_1['id'], item['id']) - - # Test descending order - item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'project.Project.name', 'direction': 'desc'}]) - self.assertEqual(self._pipeline_configutation_2['id'], item['id']) - - def test_find_order_fields_leak(self): - """Ensure that additional fields passed through the order argument but NOT via the field argument are not added to the resulting fields.""" - item = self._mockgun.find_one("HumanUser", [], fields=['email'], order=[{'field_name': 'login', 'direction': 'asc'}]) - self.assertEqual(set(item.keys()), set(['id', 'type', 'email'])) # note: we don't verify the order yet - - def test_find_order_date_created(self): - """Ensure we are able to sort entities by their creation date.""" - item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'created_at', 'direction': 'asc'}]) - self.assertEqual(self._pipeline_configutation_1['id'], item['id']) - - item = self._mockgun.find_one("PipelineConfiguration", [], order=[{'field_name': 'created_at', 'direction': 'desc'}]) - self.assertEqual(self._pipeline_configutation_2['id'], item['id']) def test_find_with_none(self): """ From b43cd65041d54250786ea4affccf22ec05cbc7cb Mon Sep 17 00:00:00 2001 From: daigles Date: Thu, 4 May 2017 16:10:58 -0400 Subject: [PATCH 171/389] For #42202: Added seed_entity_field to nav_search functions. --- shotgun_api3/shotgun.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 0d8797495..b439dac7b 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2895,7 +2895,7 @@ def nav_expand(self, path, seed_entity_field=None, entity_fields=None): } ) - def nav_search_string(self, root_path, search_string): + def nav_search_string(self, root_path, search_string, seed_entity_field=None): """ Search function adapted to work with the navigation hierarchy. @@ -2909,11 +2909,12 @@ def nav_search_string(self, root_path, search_string): "nav_search", { "root_path":root_path, + "seed_entity_field": seed_entity_field, "search_criteria": { "search_string": search_string } } ) - def nav_search_entity(self, root_path, entity): + def nav_search_entity(self, root_path, entity, seed_entity_field=None): """ Search function adapted to work with the navigation hierarchy. @@ -2928,6 +2929,7 @@ def nav_search_entity(self, root_path, entity): "nav_search", { "root_path": root_path, + "seed_entity_field": seed_entity_field, "search_criteria": {"entity": entity } } ) From 906f37c9bca8c5a22032dec702360fb0d6fcfadb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 29 Jun 2017 13:23:07 -0400 Subject: [PATCH 172/389] Update HISTORY.rst --- HISTORY.rst | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 4b6c6909f..f1eae90c4 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,17 +9,8 @@ v3.0.33.dev (TBD) - Raise an exception when uploading an empty file using :meth:`upload`, :meth:`upload_thumbnail` or :meth:`upload_filmstrip_thumbnail` before calling out to the server. -- Multiple enhancements and bugfixes to Mockgun: - - Added support for filters using the `filter_operator` syntax. - - `is` and `is_not` comparisons with an entity or multi-entity field set to `None` are now handled. - - Fixed contains operator on strings. - - Fixed entity link comparisons with `None`. - - Added support for dotted notation in find parameters (e.g. `users.HumanUser.login`) on both entity and multi-entity fields. - - Added unit tests for Mockgun in `test_mockgun.py`. The tests currently cover all the fixes and features mentionned above. - - Schemas are written using pickle's highest protocol as of Python 2.4's release, which speeds up the loading from disk. - - The current schema is cached in memory so it can be reused without having to do back to disk. +- Multiple enhancements and bugfixes to Mockgun - Added ``nav_search_string()`` and ``nav_search_entity()`` methods as experimental, internal methods for querying SG hierarchy. -- TBD v3.0.32 (2016 Sep 22) ===================== From f07c3afdadffb579a93a13b9c2cf8c2cd4a02099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 29 Jun 2017 13:34:50 -0400 Subject: [PATCH 173/389] For #43466, pick up records_per_page from the server capabilities Upon connecting to Shotgun, the API will now retrieve the maximum number of records the Shotgun server can return when queried and use it was paging results. https://github.com/shotgunsoftware/python-api/pull/148 --- shotgun_api3/shotgun.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index b439dac7b..c87c72ca3 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -573,6 +573,9 @@ def __init__(self, if connect: self.server_caps + # Check for api_max_entities_per_page in the server info and change the record per page value if it is supplied. + self.config.records_per_page = self.server_info.get('api_max_entities_per_page') or self.config.records_per_page + # When using auth_token in a 2FA scenario we need to switch to session-based # authentication because the auth token will no longer be valid after a first use. if self.config.auth_token is not None: @@ -591,10 +594,12 @@ def server_info(self): Property containing server information. >>> sg.server_info - {'full_version': [6, 3, 15, 0], - 's3_uploads_enabled': True, - 's3_direct_uploads_enabled': True, - 'version': [6, 3, 15]} + {'full_version': [6, 3, 15, 0], 'version': [6, 3, 15], ...} + + .. note:: + + Beyond ``full_version`` and ``version`` which differ by the inclusion of the bugfix number, you should expect + these values to be unsupported and for internal use only. :returns: dict of server information from :class:`ServerCapabilities` object :rtype: dict @@ -644,7 +649,12 @@ def info(self): Get API-related metadata from the Shotgun server. >>> sg.info() - {'s3_uploads_enabled': True, 'full_version': [6, 3, 15, 0], 'version': [6, 3, 15]} + {'full_version': [6, 3, 15, 0], 'version': [6, 3, 15], ...} + + .. note:: + + Beyond ``full_version`` and ``version`` which differ by the inclusion of the bugfix number, you should expect + these values to be unsupported and for internal use only. :returns: dict of the server metadata. :rtype: dict From 6d7f31c33df88430935cfb3d336f37deaa4857a7 Mon Sep 17 00:00:00 2001 From: Patrick Boucher Date: Mon, 10 Jul 2017 14:30:53 -0400 Subject: [PATCH 174/389] Travis config update. Do not notify HipChat. --- .travis.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2eb10e5ed..7caeb2ff6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,13 +12,6 @@ script: nosetests -v notifications: email: - api@shotgunsoftware.com - hipchat: - rooms: - secure: Fn5h3NWccsKeXrH/wP/WcfIMco1xCxJsqnEgzSguAIo2DlQX8UprmbyDPoZTOmKF3Tl1HMSZzgLDr2CWQua5IR8IfFum5rfvkckUCeN+PkihL8aJ+1kqXe1GZc0+rRY8iDjAUyX8i+lupnsF0RGmg/eS9QfqblM83VBKskiSsDs= - template: - - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (Details/Change view)' - format: html - on_pull_requests: false slack: rooms: secure: NgcVxptQji2OL7EKx5owh21tOl4rRg51ydYhLPHpBIpBVzlqPxi1jbMHpcbl8mG+GuhU6y1D6kVQgQfuAfIWx5YOc4FodhOFZgeS+eol5RTmEepl1OT6XmAVgEclSZUYQmK25OkcxnFnOV/31RuDPXWcgCvSBZqTy6lAbOZ5VwQ= From 5140c5efa7db066e85e50286cfd475a6184cd69b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Mon, 10 Jul 2017 14:43:37 -0400 Subject: [PATCH 175/389] Fixes the travis build. --- tests/test_api.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 21d9dbe23..b76cb1717 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -179,13 +179,21 @@ def test_upload_download(self): # test download with attachment hash ticket = self.sg.find_one('Ticket', [['id', 'is', self.ticket['id']]], ['attachments']) - attach_file = self.sg.download_attachment(ticket['attachments'][0]) + + # Look for the attachment we just uploaded, the attachments are not returned from latest + # to earliest. + attachment = [x for x in ticket["attachments"] if x["id"] == attach_id] + self.assertEqual(len(attachment), 1) + + attachment = attachment[0] + attach_file = self.sg.download_attachment(attachment) + self.assertTrue(attach_file is not None) self.assertEqual(size, len(attach_file)) self.assertEqual(orig_file, attach_file) # test download with attachment hash (write to disk) - result = self.sg.download_attachment(ticket['attachments'][0], + result = self.sg.download_attachment(attachment, file_path=file_path) self.assertEqual(result, file_path) fp = open(file_path, 'rb') From 091892bf890d3dcc361cc2afcc0d216b78641dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Mon, 17 Jul 2017 10:28:50 -0400 Subject: [PATCH 176/389] Updating build status to retina icon. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 18d631150..cd15c0baa 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,8 @@ You can see the [full history of the Python API on the documentation site](http: Integration and unit tests are provided. -[![Build Status](https://secure.travis-ci.org/shotgunsoftware/python-api.png?branch=master)](http://travis-ci.org/shotgunsoftware/python-api) +[![Build Status](https://secure.travis-ci.org/shotgunsoftware/python-api.svg?branch=master)](http://travis-ci.org/shotgunsoftware/python-api) + - All tests require the [nose unit testing tools](http://nose.readthedocs.org), and a `tests/config` file (you can copy an example from `tests/example_config`). - Tests can be run individually like this: `nosetest tests/test_client.py` From cc2dc53a6fb76b7dfafee86ac74aee3f258b3695 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Mon, 17 Jul 2017 14:45:41 -0700 Subject: [PATCH 177/389] For #40631: Adding following method to change log --- HISTORY.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/HISTORY.rst b/HISTORY.rst index f1eae90c4..6a60e26db 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -11,6 +11,7 @@ v3.0.33.dev (TBD) or :meth:`upload_filmstrip_thumbnail` before calling out to the server. - Multiple enhancements and bugfixes to Mockgun - Added ``nav_search_string()`` and ``nav_search_entity()`` methods as experimental, internal methods for querying SG hierarchy. +- Introduces a :meth:`following` query method, that accepts a user entity and optionally an entity type and/or project. v3.0.32 (2016 Sep 22) ===================== From 05c9cd907d8f5e15b86cbc2cfe99f8eb7f848a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 18 Jul 2017 15:18:40 -0400 Subject: [PATCH 178/389] For #42677, release the Shotgun API. - Raise an exception when uploading an empty file using :meth:`upload`, :meth:`upload_thumbnail` or :meth:`upload_filmstrip_thumbnail` before calling out to the server. - Multiple enhancements and bugfixes to Mockgun - Introduces a :meth:`following` query method, that accepts a user entity and optionally an entity type and/or project. - Added ``nav_search_string()`` and ``nav_search_entity()`` methods as experimental, internal methods for querying SG hierarchy. --- HISTORY.rst | 4 ++-- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 6a60e26db..b12a43fed 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,8 +4,8 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. -v3.0.33.dev (TBD) -================= +v3.0.33 (2017 July 18) +===================== - Raise an exception when uploading an empty file using :meth:`upload`, :meth:`upload_thumbnail` or :meth:`upload_filmstrip_thumbnail` before calling out to the server. diff --git a/setup.py b/setup.py index 4ded94651..e39ce3b82 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.32', + version='3.0.33', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index c87c72ca3..28a52a4cc 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.33.dev" +__version__ = "3.0.33" # ---------------------------------------------------------------------------- # Errors From d4a2d5088534f468d9274a24f18d1f2ccc433dde Mon Sep 17 00:00:00 2001 From: Matt Daw Date: Fri, 25 Aug 2017 15:43:33 -0400 Subject: [PATCH 179/389] First pass at supporting optimized pagination. (#152) * First pass at supporting optimized pagination. * Remove debug import * Update an old version check to use the new mechanism --- shotgun_api3/shotgun.py | 72 ++++++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 28a52a4cc..9f9b18efa 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -29,7 +29,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ - import base64 import cookielib # used for attachment upload import cStringIO # used for attachment upload @@ -92,7 +91,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.33" +__version__ = "3.0.34.dev" # ---------------------------------------------------------------------------- # Errors @@ -247,6 +246,24 @@ def ensure_user_following_support(self): 'label': 'user_following parameter' }, True) + def ensure_paging_info_without_counts_support(self): + """ + Ensures server has support for optimized pagination, added in v7.4.0. + """ + return self._ensure_support({ + 'version': (7, 4, 0), + 'label': 'optimized pagination' + }, False) + + def ensure_return_image_urls_support(self): + """ + Ensures server has support for returning thumbnail URLs without additional round-trips, added in v3.3.0. + """ + return self._ensure_support({ + 'version': (3, 3, 0), + 'label': 'return thumbnail URLs' + }, False) + def __str__(self): return "ServerCapabilities: host %s, version %s, is_dev %s"\ % (self.host, self.version, self.is_dev) @@ -782,7 +799,7 @@ def find(self, entity_type, filters, fields=None, order=None, returns all entities that match. :param int page: Optional page of results to return. Use this together with the ``limit`` parameter to control how your query results are paged. Defaults to ``0`` which returns - the first page of results. + all entities that match. :param bool retired_only: Optional boolean when ``True`` will return only entities that have been retried. Defaults to ``False`` which returns only entities which have not been retired. There is no option to return both retired and non-retired entities in the @@ -833,6 +850,16 @@ def find(self, entity_type, filters, fields=None, order=None, include_archived_projects, additional_filter_presets) + if self.server_caps.ensure_return_image_urls_support(): + params['api_return_image_urls'] = True + + if self.server_caps.ensure_paging_info_without_counts_support(): + paging_info_param = "return_paging_info_without_counts" + else: + paging_info_param = "return_paging_info" + + params[paging_info_param] = False + if limit and limit <= self.config.records_per_page: params["paging"]["entities_per_page"] = limit # If page isn't set and the limit doesn't require pagination, @@ -840,30 +867,40 @@ def find(self, entity_type, filters, fields=None, order=None, if page == 0: page = 1 - if self.server_caps.version and self.server_caps.version >= (3, 3, 0): - params['api_return_image_urls'] = True - # if page is specified, then only return the page of records requested if page != 0: - # No paging_info needed, so optimize it out. - params["return_paging_info"] = False params["paging"]["current_page"] = page records = self._call_rpc("read", params).get("entities", []) return self._parse_records(records) + params[paging_info_param] = True records = [] - result = self._call_rpc("read", params) - while result.get("entities"): - records.extend(result.get("entities")) - if limit and len(records) >= limit: - records = records[:limit] - break - if len(records) == result["paging_info"]["entity_count"]: - break + if self.server_caps.ensure_paging_info_without_counts_support(): + has_next_page = True + while has_next_page: + result = self._call_rpc("read", params) + records.extend(result.get("entities")) + + if limit and len(records) >= limit: + records = records[:limit] + break - params['paging']['current_page'] += 1 + has_next_page = result["paging_info"]["has_next_page"] + params['paging']['current_page'] += 1 + else: result = self._call_rpc("read", params) + while result.get("entities"): + records.extend(result.get("entities")) + + if limit and len(records) >= limit: + records = records[:limit] + break + if len(records) == result["paging_info"]["entity_count"]: + break + + params['paging']['current_page'] += 1 + result = self._call_rpc("read", params) return self._parse_records(records) @@ -882,7 +919,6 @@ def _construct_read_parameters(self, params["return_fields"] = fields or ["id"] params["filters"] = filters params["return_only"] = (retired_only and 'retired') or "active" - params["return_paging_info"] = True params["paging"] = { "entities_per_page": self.config.records_per_page, "current_page": 1 } From 96fea8303817f49096187f346ecde39d56e1d066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Mon, 18 Sep 2017 10:18:51 -0400 Subject: [PATCH 180/389] packaging for v3.0.34 release. --- HISTORY.rst | 6 ++++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index b12a43fed..e69bb0bb3 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,12 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.34 (2017 September 18) +===================== + +- Optimized pagination strategy for Shotgun 7.4+ +- Switched from a hard-coded value of 500 for "records_per_page" to a server-defined value. We will be experimenting with higher values with the goal of increasing performance for large result sets. + v3.0.33 (2017 July 18) ===================== diff --git a/setup.py b/setup.py index e39ce3b82..a1eaa21f7 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.33', + version='3.0.34', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 9f9b18efa..b1db7985a 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -91,7 +91,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.34.dev" +__version__ = "3.0.34" # ---------------------------------------------------------------------------- # Errors From c03218274e5bae4c56d4fab5fe95c28234b4f487 Mon Sep 17 00:00:00 2001 From: Jordi Riera Date: Thu, 12 Oct 2017 14:19:04 -0400 Subject: [PATCH 181/389] [minor] Adds percent field support to Mockgun. --- shotgun_api3/lib/mockgun/mockgun.py | 1 + 1 file changed, 1 insertion(+) diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index e0ab26d78..9eb5a8bfa 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -460,6 +460,7 @@ def _validate_entity_data(self, entity_type, data): python_type = {"number": int, "float": float, "checkbox": bool, + "percent": int, "text": basestring, "serializable": dict, "date": datetime.date, From 4809efc6bb46d514b43ce41c5317b6100ac7be64 Mon Sep 17 00:00:00 2001 From: Luc Bolduc Date: Fri, 10 Nov 2017 15:32:24 -0500 Subject: [PATCH 182/389] #45355 - Remove filmstrip_image download test (#156) Originally, there was a bug and the filmstrip_image url returned was bogus but it was a signed url which returned 200 and image/jpeg. This was fixed and now, in NFS mode only, filmstrip_image returns a valid redirect url on the filmstrip_image. That url isn't a signed url and requires login credential so we now use sg.download_attachment to download it and we validate status differently. Note that this is not an issue in s3 mode since the filmstrip_image s3 url is returned. --- tests/test_api.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index b76cb1717..52b362108 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -257,10 +257,11 @@ def test_upload_thumbnail_in_create(self): self.assertEqual(new_version.get('project'), self.project) self.assertTrue(new_version.get('filmstrip_image') is not None) - h = Http(".cache") - filmstrip_thumb_resp, content = h.request(new_version.get('filmstrip_image'), "GET") - self.assertEqual(filmstrip_thumb_resp['status'], '200') - self.assertEqual(filmstrip_thumb_resp['content-type'], 'image/jpeg') + url = new_version.get('filmstrip_image') + data = self.sg.download_attachment({'url': url}) + self.assertTrue(isinstance(data, str)) + # check that the credential did work and that we don't have the login page + self.assertFalse('login' in data.lower()) self.sg.delete("Version", new_version['id']) # end test_upload_thumbnail_in_create From 4e90bccdadfa87ea36b3484a9ca745c05f0c7bdd Mon Sep 17 00:00:00 2001 From: Luc Bolduc Date: Fri, 10 Nov 2017 16:58:08 -0500 Subject: [PATCH 183/389] unit test fix --- tests/test_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index 52b362108..91f26b2ed 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -261,7 +261,7 @@ def test_upload_thumbnail_in_create(self): data = self.sg.download_attachment({'url': url}) self.assertTrue(isinstance(data, str)) # check that the credential did work and that we don't have the login page - self.assertFalse('login' in data.lower()) + self.assertTrue(('login' in data.lower()) == None) self.sg.delete("Version", new_version['id']) # end test_upload_thumbnail_in_create From 41c53698d3bf0683c3eb3604f7c1c9bb17e4461c Mon Sep 17 00:00:00 2001 From: Luc Bolduc Date: Fri, 10 Nov 2017 20:58:44 -0500 Subject: [PATCH 184/389] remove unstable unit test assert --- tests/test_api.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 91f26b2ed..a6bd6aa5f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -260,8 +260,6 @@ def test_upload_thumbnail_in_create(self): url = new_version.get('filmstrip_image') data = self.sg.download_attachment({'url': url}) self.assertTrue(isinstance(data, str)) - # check that the credential did work and that we don't have the login page - self.assertTrue(('login' in data.lower()) == None) self.sg.delete("Version", new_version['id']) # end test_upload_thumbnail_in_create From 8eb9e3d10f1d01a1ebb1f90f6996c853f7e90d9f Mon Sep 17 00:00:00 2001 From: Patrick Hubert Date: Mon, 20 Nov 2017 13:24:28 -0500 Subject: [PATCH 185/389] Added handling of SSO by creating a new exception (#159) --- shotgun_api3/__init__.py | 3 +- shotgun_api3/shotgun.py | 142 +++++++++++++++++++++------------------ 2 files changed, 79 insertions(+), 66 deletions(-) diff --git a/shotgun_api3/__init__.py b/shotgun_api3/__init__.py index 3aa996e24..4f0890628 100644 --- a/shotgun_api3/__init__.py +++ b/shotgun_api3/__init__.py @@ -1,5 +1,6 @@ -from shotgun import (Shotgun, ShotgunError, ShotgunFileDownloadError, Fault, +from shotgun import (Shotgun, ShotgunError, ShotgunFileDownloadError, Fault, AuthenticationFault, MissingTwoFactorAuthenticationFault, + UserCredentialsNotAllowedForSSOAuthenticationFault, ProtocolError, ResponseError, Error, __version__) from shotgun import SG_TIMEZONE as sg_timezone diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index b1db7985a..e4840efc9 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -81,7 +81,7 @@ not require the added security provided by enforcing this. """ try: - import ssl + import ssl except ImportError, e: if "SHOTGUN_FORCE_CERTIFICATE_VALIDATION" in os.environ: raise ImportError("%s. SHOTGUN_FORCE_CERTIFICATE_VALIDATION environment variable prevents " @@ -127,6 +127,13 @@ class MissingTwoFactorAuthenticationFault(Fault): """ pass +class UserCredentialsNotAllowedForSSOAuthenticationFault(Fault): + """ + Exception when the server is configured to use SSO. It is not possible to use + a username/password pair to authenticate on such server. + """ + pass + # ---------------------------------------------------------------------------- # API @@ -136,8 +143,8 @@ class ServerCapabilities(object): .. warning:: - This class is part of the internal API and its interfaces may change at any time in - the future. Therefore, usage of this class is discouraged. + This class is part of the internal API and its interfaces may change at any time in + the future. Therefore, usage of this class is discouraged. """ def __init__(self, host, meta): @@ -274,8 +281,8 @@ class ClientCapabilities(object): .. warning:: - This class is part of the internal API and its interfaces may change at any time in - the future. Therefore, usage of this class is discouraged. + This class is part of the internal API and its interfaces may change at any time in + the future. Therefore, usage of this class is discouraged. :ivar str platform: The current client platform. Valid values are ``mac``, ``linux``, ``windows``, or ``None`` (if the current platform couldn't be determined). @@ -327,8 +334,8 @@ class _Config(object): def __init__(self): self.max_rpc_attempts = 3 # From http://docs.python.org/2.6/library/httplib.html: - # If the optional timeout parameter is given, blocking operations - # (like connection attempts) will timeout after that many seconds + # If the optional timeout parameter is given, blocking operations + # (like connection attempts) will timeout after that many seconds # (if it is not given, the global default timeout setting is used) self.timeout_secs = None self.api_ver = 'api3' @@ -347,9 +354,9 @@ def __init__(self): self.scheme = None self.server = None self.api_path = None - # The raw_http_proxy reflects the exact string passed in - # to the Shotgun constructor. This can be useful if you - # need to construct a Shotgun API instance based on + # The raw_http_proxy reflects the exact string passed in + # to the Shotgun constructor. This can be useful if you + # need to construct a Shotgun API instance based on # another Shotgun API instance. self.raw_http_proxy = None # if a proxy server is being used, the proxy_handler @@ -380,7 +387,7 @@ class Shotgun(object): "(\D?([01]\d|2[0-3])\D?([0-5]\d)\D?([0-5]\d)?\D?(\d{3})?)?$") _MULTIPART_UPLOAD_CHUNK_SIZE = 20000000 - + def __init__(self, base_url, script_name=None, @@ -484,7 +491,7 @@ def __init__(self, if login is not None or password is not None: raise ValueError("cannot provide both session_token " "and login/password") - + if login is not None or password is not None: if script_name is not None or api_key is not None: raise ValueError("cannot provide both login/password " @@ -581,7 +588,7 @@ def __init__(self, self._json_loads = self._json_loads_ascii self.client_caps = ClientCapabilities() - # this relies on self.client_caps being set first + # this relies on self.client_caps being set first self.reset_user_agent() self._server_caps = None @@ -881,7 +888,7 @@ def find(self, entity_type, filters, fields=None, order=None, while has_next_page: result = self._call_rpc("read", params) records.extend(result.get("entities")) - + if limit and len(records) >= limit: records = records[:limit] break @@ -1604,12 +1611,12 @@ def follow(self, user, entity): if not self.server_caps.version or self.server_caps.version < (5, 1, 22): raise ShotgunError("Follow support requires server version 5.2 or "\ "higher, server is %s" % (self.server_caps.version,)) - + params = dict( user=user, entity=entity ) - + return self._call_rpc('follow', params) def unfollow(self, user, entity): @@ -1632,12 +1639,12 @@ def unfollow(self, user, entity): if not self.server_caps.version or self.server_caps.version < (5, 1, 22): raise ShotgunError("Follow support requires server version 5.2 or "\ "higher, server is %s" % (self.server_caps.version,)) - + params = dict( user=user, entity=entity ) - + return self._call_rpc('unfollow', params) def followers(self, entity): @@ -1661,11 +1668,11 @@ def followers(self, entity): if not self.server_caps.version or self.server_caps.version < (5, 1, 22): raise ShotgunError("Follow support requires server version 5.2 or "\ "higher, server is %s" % (self.server_caps.version,)) - + params = dict( entity=entity ) - + return self._call_rpc('followers', params) def following(self, user, project=None, entity_type=None): @@ -1986,13 +1993,13 @@ def reset_user_agent(self): ua_platform = "Unknown" if self.client_caps.platform is not None: ua_platform = self.client_caps.platform.capitalize() - + # create ssl validation string based on settings validation_str = "validate" if self.config.no_ssl_validation: validation_str = "no-validate" - + self._user_agents = ["shotgun-json (%s)" % __version__, "Python %s (%s)" % (self.client_caps.py_version, ua_platform), "ssl %s (%s)" % (self.client_caps.ssl_version, validation_str)] @@ -2378,7 +2385,7 @@ def _get_attachment_upload_info(self, is_thumbnail, filename, is_multipart_uploa :param str filename: name of the file that will be uploaded. :param bool is_multipart_upload: Indicates if we want multi-part upload information back. - :returns: dictionary containing upload details from the server. + :returns: dictionary containing upload details from the server. These details are used throughout the upload process. :rtype: dict """ @@ -2452,7 +2459,7 @@ def download_attachment(self, attachment=False, file_path=None, attachment_id=No ``file_path`` is ``None``, returns the actual data of the file as a string. :rtype: str """ - # backwards compatibility when passed via keyword argument + # backwards compatibility when passed via keyword argument if attachment is False: if type(attachment_id) == int: attachment = attachment_id @@ -2466,7 +2473,7 @@ def download_attachment(self, attachment=False, file_path=None, attachment_id=No fp = open(file_path, 'wb') except IOError, e: raise IOError("Unable to write Attachment to disk using "\ - "file_path. %s" % e) + "file_path. %s" % e) url = self.get_attachment_download_url(attachment) if url is None: @@ -2475,7 +2482,7 @@ def download_attachment(self, attachment=False, file_path=None, attachment_id=No # We only need to set the auth cookie for downloads from Shotgun server if self.config.server in url: self.set_up_auth_cookie() - + try: request = urllib2.Request(url) request.add_header('user-agent', "; ".join(self._user_agents)) @@ -2494,7 +2501,7 @@ def download_attachment(self, attachment=False, file_path=None, attachment_id=No if e.code == 400: err += "\nAttachment may not exist or is a local file?" elif e.code == 403: - # Only parse the body if it is an Amazon S3 url. + # Only parse the body if it is an Amazon S3 url. if url.find('s3.amazonaws.com') != -1 \ and e.headers['content-type'] == 'application/xml': body = e.readlines() @@ -2561,7 +2568,7 @@ def get_attachment_download_url(self, attachment): try: url = attachment['url'] except KeyError: - if ('id' in attachment and 'type' in attachment and + if ('id' in attachment and 'type' in attachment and attachment['type'] == 'Attachment'): attachment_id = attachment['id'] else: @@ -2572,7 +2579,7 @@ def get_attachment_download_url(self, attachment): raise TypeError("Unable to determine download url. Expected "\ "dict, int, or NoneType. Instead got %s" % type(attachment)) - if attachment_id: + if attachment_id: url = urlparse.urlunparse((self.config.scheme, self.config.server, "/file_serve/attachment/%s" % urllib.quote(str(attachment_id)), None, None, None)) @@ -2736,10 +2743,10 @@ def note_thread_read(self, note_id, entity_fields=None): "higher, server is %s" % (self.server_caps.version,)) entity_fields = entity_fields or {} - + if not isinstance(entity_fields, dict): raise ValueError("entity_fields parameter must be a dictionary") - + params = { "note_id": note_id, "entity_fields": entity_fields } record = self._call_rpc("note_thread_contents", params) @@ -2806,25 +2813,25 @@ def text_search(self, text, entity_types, project_ids=None, limit=None): if self.server_caps.version and self.server_caps.version < (6, 2, 0): raise ShotgunError("auto_complete requires server version 6.2.0 or "\ "higher, server is %s" % (self.server_caps.version,)) - - # convert entity_types structure into the form + + # convert entity_types structure into the form # that the API endpoint expects if not isinstance(entity_types, dict): raise ValueError("entity_types parameter must be a dictionary") - + api_entity_types = {} for (entity_type, filter_list) in entity_types.iteritems(): if isinstance(filter_list, (list, tuple)): resolved_filters = _translate_filters(filter_list, filter_operator=None) - api_entity_types[entity_type] = resolved_filters + api_entity_types[entity_type] = resolved_filters else: raise ValueError("value of entity_types['%s'] must " "be a list or tuple." % entity_type) - + project_ids = project_ids or [] - params = { "text": text, + params = { "text": text, "entity_types": api_entity_types, "project_ids": project_ids, "max_results": limit } @@ -2906,10 +2913,10 @@ def activity_stream_read(self, entity_type, entity_id, entity_fields=None, min_i # set up parameters to send to server. entity_fields = entity_fields or {} - + if not isinstance(entity_fields, dict): raise ValueError("entity_fields parameter must be a dictionary") - + params = { "type": entity_type, "id": entity_id, "max_id": max_id, @@ -3022,9 +3029,9 @@ def _turn_off_ssl_validation(self): self.config.no_ssl_validation = True NO_SSL_VALIDATION = True # reset ssl-validation in user-agents - self._user_agents = ["ssl %s (no-validate)" % self.client_caps.ssl_version - if ua.startswith("ssl ") else ua - for ua in self._user_agents] + self._user_agents = ["ssl %s (no-validate)" % self.client_caps.ssl_version + if ua.startswith("ssl ") else ua + for ua in self._user_agents] # Deprecated methods from old wrapper def schema(self, entity_type): @@ -3113,8 +3120,8 @@ def _auth_params(self): auth_params = {"session_token" : str(self.config.session_token)} - # Request server side to raise exception for expired sessions. - # This was added in as part of Shotgun 5.4.4 + # Request server side to raise exception for expired sessions. + # This was added in as part of Shotgun 5.4.4 if self.server_caps.version and self.server_caps.version > (5, 4, 3): auth_params["reject_if_expired"] = True @@ -3206,24 +3213,24 @@ def _make_call(self, verb, path, body, headers): return self._http_request(verb, path, body, req_headers) except SSLHandshakeError, e: # Test whether the exception is due to the fact that this is an older version of - # Python that cannot validate certificates encrypted with SHA-2. If it is, then + # Python that cannot validate certificates encrypted with SHA-2. If it is, then # fall back on disabling the certificate validation and try again - unless the - # SHOTGUN_FORCE_CERTIFICATE_VALIDATION environment variable has been set by the - # user. In that case we simply raise the exception. Any other exceptions simply - # get raised as well. + # SHOTGUN_FORCE_CERTIFICATE_VALIDATION environment variable has been set by the + # user. In that case we simply raise the exception. Any other exceptions simply + # get raised as well. # # For more info see: # http://blog.shotgunsoftware.com/2016/01/important-ssl-certificate-renewal-and.html # - # SHA-2 errors look like this: + # SHA-2 errors look like this: # [Errno 1] _ssl.c:480: error:0D0C50A1:asn1 encoding routines:ASN1_item_verify: # unknown message digest algorithm - # + # # Any other exceptions simply get raised. if not str(e).endswith("unknown message digest algorithm") or \ "SHOTGUN_FORCE_CERTIFICATE_VALIDATION" in os.environ: raise - + if self.config.no_ssl_validation is False: LOG.warning("SSLHandshakeError: this Python installation is incompatible with " "certificates signed with SHA-2. Disabling certificate validation. " @@ -3232,7 +3239,7 @@ def _make_call(self, verb, path, body, headers): self._turn_off_ssl_validation() # reload user agent to reflect that we have turned off ssl validation req_headers["user-agent"] = "; ".join(self._user_agents) - + self._close_connection() if attempt == max_rpc_attempts: raise @@ -3352,14 +3359,19 @@ def _response_errors(self, sg_response): ERR_AUTH = 102 # error code for authentication related problems ERR_2FA = 106 # error code when 2FA authentication is required but no 2FA token provided. + ERR_SSO = 108 # error code when SSO is activated on the site, preventing the use of username/password for authentication. if isinstance(sg_response, dict) and sg_response.get("exception"): if sg_response.get("error_code") == ERR_AUTH: raise AuthenticationFault(sg_response.get("message", "Unknown Authentication Error")) elif sg_response.get("error_code") == ERR_2FA: raise MissingTwoFactorAuthenticationFault(sg_response.get("message", "Unknown 2FA Authentication Error")) + elif sg_response.get("error_code") == ERR_SSO: + raise UserCredentialsNotAllowedForSSOAuthenticationFault( + sg_response.get("message", "Authentication using username/password is not allowed for an SSO-enabled Shotgun site") + ) else: - # raise general Fault + # raise general Fault raise Fault(sg_response.get("message", "Unknown Error")) return @@ -3616,9 +3628,9 @@ def _dict_to_extra_data(self, d, key_name="value"): def _upload_file_to_storage(self, path, storage_url): """ Internal function to upload an entire file to the Cloud storage. - + :param str path: Full path to an existing non-empty file on disk to upload. - :param str storage_url: Target URL for the uploaded file. + :param str storage_url: Target URL for the uploaded file. """ filename = os.path.basename(path) @@ -3688,8 +3700,8 @@ def _get_upload_part_link(self, upload_info, filename, part_number): "/upload/api_get_upload_link_for_part", None, None, None)) result = self._send_form(url, params) - # Response is of the form: 1\n (for success) or 0\n (for failure). - # In case of success, we know we the second line of the response contains the + # Response is of the form: 1\n (for success) or 0\n (for failure). + # In case of success, we know we the second line of the response contains the # requested URL. if not str(result).startswith("1"): raise ShotgunError("Unable get upload part link: %s" % result) @@ -3700,11 +3712,11 @@ def _get_upload_part_link(self, upload_info, filename, part_number): def _upload_data_to_storage(self, data, content_type, size, storage_url): """ Internal function to upload data to Cloud storage. - + :param stream data: Contains details received from the server, about the upload. :param str content_type: Content type of the data stream. :param int size: Number of bytes in the data stream. - :param str storage_url: Target URL for the uploaded file. + :param str storage_url: Target URL for the uploaded file. :returns: upload url. :rtype: str """ @@ -3762,7 +3774,7 @@ def _send_form(self, url, params): """ params.update(self._auth_params()) - + opener = self._build_opener(FormPostHandler) # Perform the request @@ -3851,7 +3863,7 @@ def _translate_filters(filters, filter_operator): def _translate_filters_dict(sg_filter): new_filters = {} filter_operator = sg_filter.get("filter_operator") - + if filter_operator == "all" or filter_operator == "and": new_filters["logical_operator"] = "and" elif filter_operator == "any" or filter_operator == "or": @@ -3864,12 +3876,12 @@ def _translate_filters_dict(sg_filter): % sg_filter["filters"]) new_filters["conditions"] = _translate_filters_list(sg_filter["filters"]) - + return new_filters - + def _translate_filters_list(filters): conditions = [] - + for sg_filter in filters: if isinstance(sg_filter, (list,tuple)): conditions.append(_translate_filters_simple(sg_filter)) @@ -3886,7 +3898,7 @@ def _translate_filters_simple(sg_filter): "path": sg_filter[0], "relation": sg_filter[1] } - + values = sg_filter[2:] if len(values) == 1 and isinstance(values[0], (list, tuple)): values = values[0] From 9069888f37d638e6b09b1497f075f7bbabe24ca1 Mon Sep 17 00:00:00 2001 From: Patrick Hubert Date: Fri, 8 Dec 2017 13:30:49 -0500 Subject: [PATCH 186/389] Preparing release v3.0.35 (#161) --- HISTORY.rst | 7 +++++++ setup.py | 4 ++-- shotgun_api3/shotgun.py | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index e69bb0bb3..620b50eea 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,13 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.35 (2017 December 8) +===================== + +- Add exception UserCredentialsNotAllowedForSSOAuthenticationFault. + Triggered when attempting to initiate a connection with a username/password + pair on an SSO-enabled Shotgun site. + v3.0.34 (2017 September 18) ===================== diff --git a/setup.py b/setup.py index a1eaa21f7..44faa0d2b 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.34', + version='3.0.35', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', @@ -27,6 +27,6 @@ packages=find_packages(exclude=('tests',)), script_args=script_args, include_package_data=True, - package_data={'': [ 'cacerts.txt']}, + package_data={'': ['cacerts.txt']}, zip_safe=False, ) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index e4840efc9..a23278e7a 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -91,7 +91,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.34" +__version__ = "3.0.35" # ---------------------------------------------------------------------------- # Errors From 6591860c7e2e1bac3e3f6c09c21b6c7a1253a0d1 Mon Sep 17 00:00:00 2001 From: Patrick Hubert Date: Tue, 12 Dec 2017 09:00:52 -0500 Subject: [PATCH 187/389] Added get_session_token to mockgun (#163) --- shotgun_api3/lib/mockgun/mockgun.py | 121 ++++++++++++++-------------- 1 file changed, 62 insertions(+), 59 deletions(-) diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index 9eb5a8bfa..44ba35414 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -32,56 +32,56 @@ ----------------------------------------------------------------------------- -M O C K G U N +M O C K G U N ----------------------------------------------------------------------------- Experimental software ahead! ---------------------------- -Disclaimer! Mockgun is in its early stages of development. It is not fully -compatible with the Shotgun API yet and we offer no guarantees at this point -that future versions of Mockgun will be backwards compatible. Consider this -alpha level software and use at your own risk. +Disclaimer! Mockgun is in its early stages of development. It is not fully +compatible with the Shotgun API yet and we offer no guarantees at this point +that future versions of Mockgun will be backwards compatible. Consider this +alpha level software and use at your own risk. What is Mockgun? ---------------- Mockgun is a Shotgun API mocker. It's a class that has got *most* of the same -methods and parameters that the Shotgun API has got. Mockgun is essentially a +methods and parameters that the Shotgun API has got. Mockgun is essentially a Shotgun *emulator* that (for basic operations) looks and feels like Shotgun. The primary purpose of Mockgun is to drive unit test rigs where it becomes -too slow, cumbersome or non-practical to connect to a real Shotgun. Using a -Mockgun for unit tests means that a test can be rerun over and over again +too slow, cumbersome or non-practical to connect to a real Shotgun. Using a +Mockgun for unit tests means that a test can be rerun over and over again from exactly the same database state. This can be hard to do if you connect -to a live Shotgun instance. +to a live Shotgun instance. How do I use Mockgun? --------------------- First of all, you need a Shotgun schema to run against. This will define -all the fields and entities that mockgun will use. Simply connect to +all the fields and entities that mockgun will use. Simply connect to your Shotgun site and use the generate_schema() method to download the schema data: # connect to your site from shotgun_api3 import Shotgun sg = Shotgun("https://mysite.shotgunstudio.com", script_name="xyz", api_key="abc") - + # write out schema data to files from shotgun_api3.lib import mockgun mockgun.generate_schema(sg, "/tmp/schema", "/tmp/entity_schema") - + Now that you have a schema, you can tell your mockgun instance about it. -We do this as a class-level operation, so that the consctructor can be +We do this as a class-level operation, so that the consctructor can be exactly like the real Shotgun one: from shotgun_api3.lib import mockgun - + # tell mockgun about the schema mockgun.Shotgun.set_schema_paths("/tmp/schema", "/tmp/entity_schema") - - # we are ready to mock! - # this call will not connect to mysite, but instead create a + + # we are ready to mock! + # this call will not connect to mysite, but instead create a # mockgun instance which is connected to an *empty* shotgun site # which has got the same schema as mysite. sg = mockgun.Shotgun("https://mysite.shotgunstudio.com", script_name="xyz", api_key="abc") @@ -89,15 +89,15 @@ # now you can start putting stuff in print sg.create("HumanUser", {"firstname": "John", "login": "john"}) # prints {'login': 'john', 'type': 'HumanUser', 'id': 1, 'firstname': 'John'} - + # and find what you have created print sg.find("HumanUser", [["login", "is", "john"]]) prints [{'type': 'HumanUser', 'id': 1}] - + That's it! Mockgun is used to run the Shotgun Pipeline Toolkit unit test rig. Mockgun has a 'database' in the form of a dictionary stored in Mockgun._db -By editing this directly, you can modify the database without going through +By editing this directly, you can modify the database without going through the API. @@ -135,13 +135,13 @@ class Shotgun(object): It generates an object which looks and feels like a normal Shotgun API instance. Instead of connecting to a real server, it keeps all its data in memory in a way which makes it easy to introspect and test. - + The methods presented in this class reflect the Shotgun API and are therefore sparsely documented. - + Please note that this class is built for test purposes only and only creates an - object which *roughly* resembles the Shotgun API - however, for most common - use cases, this is enough to be able to perform relevant and straight forward + object which *roughly* resembles the Shotgun API - however, for most common + use cases, this is enough to be able to perform relevant and straight forward testing of code. """ @@ -155,7 +155,7 @@ def set_schema_paths(cls, schema_path, schema_entity_path): level so all Shotgun instances will share the same schema. The responsability to generate and load these files is left to the user changing the default value. - + :param schema_path: Directory path where schema files are. """ cls.__schema_path = schema_path @@ -166,7 +166,7 @@ def get_schema_paths(cls): """ Returns a tuple with paths to the files which are part of the schema. These paths can then be used in generate_schema if needed. - + :returns: A tuple with schema_file_path and schema_entity_file_path """ return (cls.__schema_path, cls.__schema_entity_path) @@ -191,7 +191,7 @@ def __init__(self, # having them present means code and get and set them # they way they would expect to in the real API. self.config = _Config() - + # load in the shotgun schema to associate with this Shotgun (schema_path, schema_entity_path) = self.get_schema_paths() @@ -199,7 +199,7 @@ def __init__(self, raise MockgunError("Cannot create Mockgun instance because no schema files have been defined. " "Before creating a Mockgun instance, please call Mockgun.set_schema_paths() " "in order to specify which Shotgun schema Mockgun should operate against.") - + self._schema, self._schema_entity = SchemaFactory.get_schemas(schema_path, schema_entity_path) # initialize the "database" @@ -207,7 +207,7 @@ def __init__(self, # set some basic public members that exist in the Shotgun API self.base_url = base_url - + # bootstrap the event log # let's make sure there is at least one event log id in our mock db data = {} @@ -221,18 +221,21 @@ def __init__(self, # public API methods + def get_session_token(self): + return "bogus_session_token" + def schema_read(self): return self._schema def schema_field_create(self, entity_type, data_type, display_name, properties=None): raise NotImplementedError - + def schema_field_update(self, entity_type, field_name, properties): raise NotImplementedError def schema_field_delete(self, entity_type, field_name): raise NotImplementedError - + def schema_entity_read(self): return self._schema_entity @@ -244,7 +247,7 @@ def schema_field_read(self, entity_type, field_name=None): def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0): - + self.finds += 1 @@ -311,12 +314,12 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No val = [dict((field, self._get_field_from_row(entity_type, row, field)) for field in fields) for row in results] return val - - + + def find_one(self, entity_type, filters, fields=None, order=None, filter_operator=None, retired_only=False): results = self.find(entity_type, filters, fields=fields, order=order, filter_operator=filter_operator, retired_only=retired_only) return results[0] if results else None - + def batch(self, requests): results = [] for request in requests: @@ -332,14 +335,14 @@ def batch(self, requests): return results def create(self, entity_type, data, return_fields=None): - + # special handling of storage fields - if a field value - # is a dict with a key local_path, then add fields - # local_path_linux, local_path_windows, local_path_mac + # is a dict with a key local_path, then add fields + # local_path_linux, local_path_windows, local_path_mac # as a reflection of this for d in data: if isinstance(data[d], dict) and "local_path" in data[d]: - # partly imitate some of the business logic happening on the + # partly imitate some of the business logic happening on the # server side of shotgun when a file/link entity value is created if "local_storage" not in data[d]: data[d]["local_storage"] = {"id": 0, "name": "auto_generated_by_mockgun", "type": "LocalStorage"} @@ -349,7 +352,7 @@ def create(self, entity_type, data, return_fields=None): data[d]["local_path_windows"] = data[d]["local_path"] if "local_path_mac" not in data[d]: data[d]["local_path_mac"] = data[d]["local_path"] - + self._validate_entity_type(entity_type) self._validate_entity_data(entity_type, data) self._validate_entity_fields(entity_type, return_fields) @@ -358,14 +361,14 @@ def create(self, entity_type, data, return_fields=None): next_id = max(self._db[entity_type]) + 1 except ValueError: next_id = 1 - + row = self._get_new_row(entity_type) - - self._update_row(entity_type, row, data) + + self._update_row(entity_type, row, data) row["id"] = next_id - + self._db[entity_type][next_id] = row - + if return_fields is None: result = dict((field, self._get_field_from_row(entity_type, row, field)) for field in data) else: @@ -373,7 +376,7 @@ def create(self, entity_type, data, return_fields=None): result["type"] = row["type"] result["id"] = row["id"] - + return result def update(self, entity_type, entity_id, data): @@ -389,28 +392,28 @@ def update(self, entity_type, entity_id, data): def delete(self, entity_type, entity_id): self._validate_entity_type(entity_type) self._validate_entity_exists(entity_type, entity_id) - + row = self._db[entity_type][entity_id] if not row["__retired"]: row["__retired"] = True return True else: return False - + def revive(self, entity_type, entity_id): self._validate_entity_type(entity_type) self._validate_entity_exists(entity_type, entity_id) - + row = self._db[entity_type][entity_id] if row["__retired"]: row["__retired"] = False return True else: return False - + def upload(self, entity_type, entity_id, path, field_name=None, display_name=None, tag_list=None): raise NotImplementedError - + def upload_thumbnail(self, entity_type, entity_id, path, **kwargs): pass @@ -420,7 +423,7 @@ def upload_thumbnail(self, entity_type, entity_id, path, **kwargs): def _validate_entity_type(self, entity_type): if entity_type not in self._schema: raise ShotgunError("%s is not a valid entity" % entity_type) - + def _validate_entity_data(self, entity_type, data): if "id" in data or "type" in data: raise ShotgunError("Can't set id or type on create or update") @@ -428,11 +431,11 @@ def _validate_entity_data(self, entity_type, data): self._validate_entity_fields(entity_type, data.keys()) for field, item in data.items(): - + if item is None: # none is always ok continue - + field_info = self._schema[entity_type][field] if field_info["data_type"]["value"] == "multi_entity": @@ -444,8 +447,8 @@ def _validate_entity_data(self, entity_type, data): raise ShotgunError("%s.%s is of type multi-entity, but an item in data %s does not contain 'type' and 'id'" % (entity_type, field, item)) elif item and any(sub_item["type"] not in field_info["properties"]["valid_types"]["value"] for sub_item in item): raise ShotgunError("%s.%s is of multi-type entity, but an item in data %s has an invalid type (expected one of %s)" % (entity_type, field, item, field_info["properties"]["valid_types"]["value"])) - - + + elif field_info["data_type"]["value"] == "entity": if not isinstance(item, dict): raise ShotgunError("%s.%s is of type entity, but data %s is not a dictionary" % (entity_type, field, item)) @@ -469,8 +472,8 @@ def _validate_entity_data(self, entity_type, data): "status_list": basestring, "url": dict}[sg_type] except KeyError: - raise ShotgunError("Field %s.%s: Handling for Shotgun type %s is not implemented" % (entity_type, field, sg_type)) - + raise ShotgunError("Field %s.%s: Handling for Shotgun type %s is not implemented" % (entity_type, field, sg_type)) + if not isinstance(item, python_type): raise ShotgunError("%s.%s is of type %s, but data %s is not of type %s" % (entity_type, field, type(item), sg_type, python_type)) @@ -776,7 +779,7 @@ def _update_row(self, entity_type, row, data): row[field] = [{"type": item["type"], "id": item["id"]} for item in data[field]] else: row[field] = data[field] - + def _validate_entity_exists(self, entity_type, entity_id): if entity_id not in self._db[entity_type]: From 7391cbf320c5452d2430c17a2b426f7be7c1e921 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Tue, 20 Feb 2018 11:17:37 +0100 Subject: [PATCH 188/389] [docs] Fixing quotes typo in introduction example --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index ac6184014..13afa74f2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -27,7 +27,7 @@ Quicktimes, etc. sg = shotgun_api3.Shotgun("https://piedpiper.shotgunstudio.com", login="rhendriks", password="c0mPre$Hi0n") - sg.find("Shot", filters=[["sg_status_list", "is", "ip"]], fields=["code", "sg_status_list]) + sg.find("Shot", filters=[["sg_status_list", "is", "ip"]], fields=["code", "sg_status_list"]) **Output**:: From 2909f88c8771fd91e40ab9a1e35aa39f728b4e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Thu, 15 Mar 2018 11:33:17 +0000 Subject: [PATCH 189/389] [minor] updated python requirements. Support for python versions older than 2.6 were discontinued in April 2017, but we didn't update the readme file at the time. --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cd15c0baa..8272db41f 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,11 @@ The latest version can always be found at http://github.com/shotgunsoftware/pyth ## Minimum Requirements * Shotgun server v2.4.12+. -* Python v2.4 - v2.7. +* Python v2.6 - v2.7. ## High Performance Requirements -* For Python 2.4 and 2.5, install [simplejson 2.0.9](http://pypi.python.org/pypi/simplejson/2.0.9) -* For Python 2.6 and higher, install [simplejson 2.1.6](http://pypi.python.org/pypi/simplejson/2.1.6) +* Install [simplejson 2.1.6](http://pypi.python.org/pypi/simplejson/2.1.6) ## Documentation Tutorials and detailed documentation about the Python API are available at http://developer.shotgunsoftware.com/python-api). From b0f875d0f145230b0f476909dbd7ac27b6ab0aa8 Mon Sep 17 00:00:00 2001 From: Mike De Wolfe Date: Thu, 15 Mar 2018 12:44:45 -0400 Subject: [PATCH 190/389] SG-1279 Malware Status (#167) Adds handling for status codes returned when a file is pending, or failed, a malware scan. --- shotgun_api3/shotgun.py | 7 +++++++ tests/test_api_long.py | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a23278e7a..7c968c4b8 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2512,6 +2512,13 @@ def download_attachment(self, attachment=False, file_path=None, attachment_id=No match = re.search('(.*)', xml) if match: err += ' - %s' % (match.group(1)) + elif e.code == 409 or e.code == 410: + # we may be dealing with a file that is pending/failed a malware scan, e.g: + # 409: This file is undergoing a malware scan, please try again in a few minutes + # 410: File scanning has detected malware and the file has been quarantined + lines = e.readlines() + if lines: + err += "\n%s\n" % ''.join(lines) raise ShotgunFileDownloadError(err) else: if file_path: diff --git a/tests/test_api_long.py b/tests/test_api_long.py index a5fb21f85..12419ea78 100644 --- a/tests/test_api_long.py +++ b/tests/test_api_long.py @@ -6,6 +6,8 @@ import base import random import shotgun_api3 +import os +import time class TestShotgunApiLong(base.LiveTestBase): @@ -143,6 +145,5 @@ def test_schema_with_project(self): self.assertTrue('user' in schema) self.assertTrue('visible' in schema['user']) - if __name__ == '__main__': base.unittest.main() From 1aea8b9ab51a2e3d2fb09153b18e82b3fab7cc37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 20 Mar 2018 08:10:04 -0400 Subject: [PATCH 191/389] For #46997, fix connect false (#168) Implemented lazy-loading of records_per_page so we can honor the `connect=False` flag in the `__init__`. --- shotgun_api3/lib/mockgun/mockgun.py | 2 +- shotgun_api3/shotgun.py | 24 ++++++++++++++++++------ tests/test_client.py | 5 ----- tests/tests_unit.py | 0 4 files changed, 19 insertions(+), 12 deletions(-) mode change 100755 => 100644 tests/tests_unit.py diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index 44ba35414..1122c4136 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -190,7 +190,7 @@ def __init__(self, # these settings won't make sense for mockgun, but # having them present means code and get and set them # they way they would expect to in the real API. - self.config = _Config() + self.config = _Config(self) # load in the shotgun schema to associate with this Shotgun (schema_path, schema_entity_path) = self.get_schema_paths() diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 7c968c4b8..01847a680 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -331,7 +331,11 @@ class _Config(object): Container for the client configuration. """ - def __init__(self): + def __init__(self, sg): + """ + :param sg: Shotgun connection. + """ + self._sg = sg self.max_rpc_attempts = 3 # From http://docs.python.org/2.6/library/httplib.html: # If the optional timeout parameter is given, blocking operations @@ -340,7 +344,7 @@ def __init__(self): self.timeout_secs = None self.api_ver = 'api3' self.convert_datetimes_to_utc = True - self.records_per_page = 500 + self._records_per_page = None self.api_key = None self.script_name = None self.user_login = None @@ -371,6 +375,17 @@ def __init__(self): self.authorization = None self.no_ssl_validation = False + @property + def records_per_page(self): + """ + The records per page value from the server. + """ + if self._records_per_page is None: + # Check for api_max_entities_per_page in the server info and change the record per page + # value if it is supplied. + self._records_per_page = self._sg.server_info.get('api_max_entities_per_page') or 500 + return self._records_per_page + class Shotgun(object): """ @@ -519,7 +534,7 @@ def __init__(self, if connect: raise ValueError("must provide login/password, session_token or script_name/api_key") - self.config = _Config() + self.config = _Config(self) self.config.api_key = api_key self.config.script_name = script_name self.config.user_login = login @@ -597,9 +612,6 @@ def __init__(self, if connect: self.server_caps - # Check for api_max_entities_per_page in the server info and change the record per page value if it is supplied. - self.config.records_per_page = self.server_info.get('api_max_entities_per_page') or self.config.records_per_page - # When using auth_token in a 2FA scenario we need to switch to session-based # authentication because the auth token will no longer be valid after a first use. if self.config.auth_token is not None: diff --git a/tests/test_client.py b/tests/test_client.py index e3e85d401..5f83cac82 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -132,11 +132,6 @@ def auth_args(): self.assertRaises(api.Fault, self.sg.delete, "FakeType", 1) self.assertEqual(my_uuid, auth_args()["session_uuid"]) - def test_config(self): - """Client config can be created""" - x = api.shotgun._Config() - self.assertTrue(x is not None) - def test_url(self): """Server url is parsed correctly""" login = self.human_user['login'] diff --git a/tests/tests_unit.py b/tests/tests_unit.py old mode 100755 new mode 100644 From 8c2584b150e931624f1c66ab5bc4e26a1cd81155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Wed, 21 Mar 2018 15:30:34 -0400 Subject: [PATCH 192/389] For #46920, custom CA certs for file transfer (#171) This allows to upload and download files from local Shotgun sites using HTTPS with a custom certificate authority certificate. --- shotgun_api3/shotgun.py | 59 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 01847a680..e3895f7e8 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -46,6 +46,7 @@ import urllib2 # used for image upload import urlparse import shutil # used for attachment download +import httplib # Used for secure file upload. # use relative import for versions >=2.5 and package import for python versions <2.5 if (sys.version_info[0] > 2) or (sys.version_info[0] == 2 and sys.version_info[1] >= 6): @@ -3034,11 +3035,15 @@ def _build_opener(self, handler): """ Build urllib2 opener with appropriate proxy handler. """ + handlers = [] + if self.__ca_certs and not NO_SSL_VALIDATION: + handlers.append(CACertsHTTPSHandler(self.__ca_certs)) + if self.config.proxy_handler: - opener = urllib2.build_opener(self.config.proxy_handler, handler) - else: - opener = urllib2.build_opener(handler) - return opener + handlers.append(self.config.proxy_handler) + + handlers.append(handler) + return urllib2.build_opener(*handlers) def _turn_off_ssl_validation(self): """ @@ -3810,8 +3815,52 @@ def _send_form(self, url, params): return result -# Helpers from the previous API, left as is. +class CACertsHTTPSConnection(httplib.HTTPConnection): + """" + This class allows to create an HTTPS connection that uses the custom certificates + passed in. + """ + + default_port = httplib.HTTPS_PORT + + def __init__(self, *args, **kwargs): + """ + :param args: Positional arguments passed down to the base class. + :param ca_certs: Path to the custom CA certs file. + :param kwargs: Keyword arguments passed down to the bas class + """ + # Pop that argument, + self.__ca_certs = kwargs.pop("ca_certs") + httplib.HTTPConnection.__init__(self, *args, **kwargs) + + def connect(self): + "Connect to a host on a given (SSL) port." + httplib.HTTPConnection.connect(self) + # Now that the regular HTTP socket has been created, wrap it with our SSL certs. + self.sock = ssl.wrap_socket( + self.sock, + ca_certs=self.__ca_certs, + cert_reqs=ssl.CERT_REQUIRED + ) + + +class CACertsHTTPSHandler(urllib2.HTTPSHandler): + """ + Handler that ensures https connections are created with the custom CA certs. + """ + def __init__(self, cacerts): + urllib2.HTTPSHandler.__init__(self) + self.__ca_certs = cacerts + + def https_open(self, req): + return self.do_open(self.create_https_connection, req) + + def create_https_connection(self, *args, **kwargs): + return CACertsHTTPSConnection(*args, ca_certs=self.__ca_certs, **kwargs) + + +# Helpers from the previous API, left as is. # Based on http://code.activestate.com/recipes/146306/ class FormPostHandler(urllib2.BaseHandler): """ From 21dc3a946505c20884a4558051080ed6fe8a02bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 22 Mar 2018 15:33:17 -0400 Subject: [PATCH 193/389] Bumps version to development version. This should have been done the last time we released. --- HISTORY.rst | 7 +++++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 620b50eea..acd9f74c0 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,13 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.36.dev (TBD) +===================== + +- Fixes an error where ``connect=False`` during ``__init__`` would still connect to Shotgun. +- Adds support for ``SHOTGUN_API_CACERTS`` when uploading and downloading files. +- Properly handles failed downloads due to malware scanning. + v3.0.35 (2017 December 8) ===================== diff --git a/setup.py b/setup.py index 44faa0d2b..e184eae20 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.35', + version='3.0.36.dev', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index e3895f7e8..d90f5b04b 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.35" +__version__ = "3.0.36.dev" # ---------------------------------------------------------------------------- # Errors From 4b5764b726b3f9d700cc36c55c3a0403edd3f80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Fri, 23 Mar 2018 09:20:11 -0400 Subject: [PATCH 194/389] For #46904, site wide tk-config-default2 (#172) Adds support for a None entity link during sub-entity searches in Mockgun and PEP8ed mockgun.py --- shotgun_api3/lib/mockgun/mockgun.py | 90 +++++++++++++++++++---------- tests/test_mockgun.py | 14 ++++- 2 files changed, 72 insertions(+), 32 deletions(-) diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index 1122c4136..d3c73c865 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -116,7 +116,7 @@ import datetime -from ... import sg_timezone, ShotgunError +from ... import ShotgunError from ...shotgun import _Config from .errors import MockgunError from .schema import SchemaFactory @@ -220,7 +220,6 @@ def __init__(self, ################################################################################################### # public API methods - def get_session_token(self): return "bogus_session_token" @@ -245,15 +244,16 @@ def schema_field_read(self, entity_type, field_name=None): else: return dict((k, v) for k, v in self._schema[entity_type].items() if k == field_name) - - def find(self, entity_type, filters, fields=None, order=None, filter_operator=None, limit=0, retired_only=False, page=0): - + def find( + self, entity_type, filters, fields=None, order=None, filter_operator=None, + limit=0, retired_only=False, page=0 + ): self.finds += 1 self._validate_entity_type(entity_type) # do not validate custom fields - this makes it hard to mock up a field quickly - #self._validate_entity_fields(entity_type, fields) + # self._validate_entity_fields(entity_type, fields) # FIXME: This should be refactored so that we can use the complex filer # style in nested filter operations. @@ -271,10 +271,10 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No if len(f["values"]) != 1: # {'path': 'id', 'relation': 'in', 'values': [1,2,3]} --> ["id", "in", [1,2,3]] - resolved_filters.append([ f["path"], f["relation"], f["values"] ]) + resolved_filters.append([f["path"], f["relation"], f["values"]]) else: # {'path': 'id', 'relation': 'is', 'values': [3]} --> ["id", "is", 3] - resolved_filters.append([ f["path"], f["relation"], f["values"][0] ]) + resolved_filters.append([f["path"], f["relation"], f["values"][0]]) else: # traditiona style sg filters @@ -315,9 +315,14 @@ def find(self, entity_type, filters, fields=None, order=None, filter_operator=No return val - - def find_one(self, entity_type, filters, fields=None, order=None, filter_operator=None, retired_only=False): - results = self.find(entity_type, filters, fields=fields, order=order, filter_operator=filter_operator, retired_only=retired_only) + def find_one( + self, entity_type, filters, fields=None, order=None, filter_operator=None, + retired_only=False + ): + results = self.find( + entity_type, filters, fields=fields, + order=order, filter_operator=filter_operator, retired_only=retired_only + ) return results[0] if results else None def batch(self, requests): @@ -440,22 +445,44 @@ def _validate_entity_data(self, entity_type, data): if field_info["data_type"]["value"] == "multi_entity": if not isinstance(item, list): - raise ShotgunError("%s.%s is of type multi_entity, but data %s is not a list" % (entity_type, field, item)) + raise ShotgunError( + "%s.%s is of type multi_entity, but data %s is not a list" % + (entity_type, field, item) + ) elif item and any(not isinstance(sub_item, dict) for sub_item in item): - raise ShotgunError("%s.%s is of type multi_entity, but data %s contains a non-dictionary" % (entity_type, field, item)) + raise ShotgunError( + "%s.%s is of type multi_entity, but data %s contains a non-dictionary" % + (entity_type, field, item) + ) elif item and any("id" not in sub_item or "type" not in sub_item for sub_item in item): - raise ShotgunError("%s.%s is of type multi-entity, but an item in data %s does not contain 'type' and 'id'" % (entity_type, field, item)) - elif item and any(sub_item["type"] not in field_info["properties"]["valid_types"]["value"] for sub_item in item): - raise ShotgunError("%s.%s is of multi-type entity, but an item in data %s has an invalid type (expected one of %s)" % (entity_type, field, item, field_info["properties"]["valid_types"]["value"])) - + raise ShotgunError( + "%s.%s is of type multi-entity, but an item in data %s does not contain 'type' and 'id'" % + (entity_type, field, item) + ) + elif item and any( + sub_item["type"] not in field_info["properties"]["valid_types"]["value"] for sub_item in item + ): + raise ShotgunError( + "%s.%s is of multi-type entity, but an item in data %s has an invalid type (expected one of %s)" + % (entity_type, field, item, field_info["properties"]["valid_types"]["value"]) + ) elif field_info["data_type"]["value"] == "entity": if not isinstance(item, dict): - raise ShotgunError("%s.%s is of type entity, but data %s is not a dictionary" % (entity_type, field, item)) + raise ShotgunError( + "%s.%s is of type entity, but data %s is not a dictionary" % + (entity_type, field, item) + ) elif "id" not in item or "type" not in item: - raise ShotgunError("%s.%s is of type entity, but data %s does not contain 'type' and 'id'" % (entity_type, field, item)) - #elif item["type"] not in field_info["properties"]["valid_types"]["value"]: - # raise ShotgunError("%s.%s is of type entity, but data %s has an invalid type (expected one of %s)" % (entity_type, field, item, field_info["properties"]["valid_types"]["value"])) + raise ShotgunError( + "%s.%s is of type entity, but data %s does not contain 'type' and 'id'" + % (entity_type, field, item) + ) + # elif item["type"] not in field_info["properties"]["valid_types"]["value"]: + # raise ShotgunError( + # "%s.%s is of type entity, but data %s has an invalid type (expected one of %s)" % + # (entity_type, field, item, field_info["properties"]["valid_types"]["value"]) + # ) else: try: @@ -472,10 +499,16 @@ def _validate_entity_data(self, entity_type, data): "status_list": basestring, "url": dict}[sg_type] except KeyError: - raise ShotgunError("Field %s.%s: Handling for Shotgun type %s is not implemented" % (entity_type, field, sg_type)) + raise ShotgunError( + "Field %s.%s: Handling for Shotgun type %s is not implemented" % + (entity_type, field, sg_type) + ) if not isinstance(item, python_type): - raise ShotgunError("%s.%s is of type %s, but data %s is not of type %s" % (entity_type, field, type(item), sg_type, python_type)) + raise ShotgunError( + "%s.%s is of type %s, but data %s is not of type %s" % + (entity_type, field, type(item), sg_type, python_type) + ) # TODO: add check for correct timezone @@ -641,6 +674,9 @@ def _get_field_from_row(self, entity_type, row, field): sub_field_value = self._get_field_from_row(entity_type2, entity, field3) values.append(sub_field_value) return values + # The field is not set, so return None. + elif field_value is None: + return None # not multi entity, must be entity. elif not isinstance(field_value, dict): raise ShotgunError("Invalid deep query field %s.%s" % (entity_type, field)) @@ -652,7 +688,7 @@ def _get_field_from_row(self, entity_type, row, field): # ok so looks like the value is an entity link # e.g. db contains: {"sg_sequence": {"type":"Sequence", "id": 123 } } - linked_row = self._db[ field_value["type"] ][ field_value["id"] ] + linked_row = self._db[field_value["type"]][field_value["id"]] return self._get_field_from_row(entity_type2, linked_row, field3) else: @@ -769,7 +805,6 @@ def _row_matches_filters(self, entity_type, row, filters, filter_operator, retir else: raise ShotgunError("%s is not a valid filter operator" % filter_operator) - def _update_row(self, entity_type, row, data): for field in data: field_type = self._get_field_type(entity_type, field) @@ -780,11 +815,6 @@ def _update_row(self, entity_type, row, data): else: row[field] = data[field] - def _validate_entity_exists(self, entity_type, entity_id): if entity_id not in self._db[entity_type]: raise ShotgunError("No entity of type %s exists with id %s" % (entity_type, entity_id)) - - - - diff --git a/tests/test_mockgun.py b/tests/test_mockgun.py index 5a5d34117..2bd4ae108 100644 --- a/tests/test_mockgun.py +++ b/tests/test_mockgun.py @@ -148,12 +148,12 @@ def setUp(self): """ self._mockgun = Mockgun("https://test.shotgunstudio.com", login="user", password="1234") - self._project_link = self._mockgun.create("Project", {"name": "project"}) + self._project_link = self._mockgun.create("Project", {"name": "project", "archived": False}) # This entity will ensure that a populated link field will be comparable. self._mockgun.create( "PipelineConfiguration", - {"code": "with_project", "project": self._project_link} + {"code": "with_project", "project": self._project_link, } ) # This entity will ensure that an unpopulated link field will be comparable. @@ -180,6 +180,16 @@ def test_searching_for_initialized_entity_field(self): items = self._mockgun.find("PipelineConfiguration", [["project", "is_not", self._project_link]]) self.assertEqual(len(items), 1) + def test_find_entity_with_none_link(self): + """ + Make sure that we can search for sub entity fields on entities that have the field not set. + """ + # The pipeline configuration without_project doesn't have the project field set, so we're expecting + # it to not be returned here. + items = self._mockgun.find("PipelineConfiguration", [["project.Project.archived", "is", False]]) + self.assertEqual(len(items), 1) + self.assertEqual(items[0]["id"], self._project_link["id"]) + class TestTextFieldOperators(TestBaseWithExceptionTests): """ From 9af9315dbaf69b838d28f96d085360457f8a6a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 3 Apr 2018 13:13:33 -0400 Subject: [PATCH 195/389] Official release v3.0.36. --- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index e184eae20..f3f7aa96e 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.36.dev', + version='3.0.36', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index d90f5b04b..a3e8c1d20 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.36.dev" +__version__ = "3.0.36" # ---------------------------------------------------------------------------- # Errors From edce21b8d0d15e5d462e0670499cdf64dfede091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 3 Apr 2018 13:17:44 -0400 Subject: [PATCH 196/389] Updated history. --- HISTORY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index acd9f74c0..8d2bcaaa0 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,7 +4,7 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. -v3.0.36.dev (TBD) +v3.0.36 ===================== - Fixes an error where ``connect=False`` during ``__init__`` would still connect to Shotgun. From 2704880ae97b0fa4b771a9f7ea0d51915e75e363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Mon, 9 Apr 2018 14:38:03 -0400 Subject: [PATCH 197/389] For #47048, setup CI (#173) Beefs up the CI around the API: - HoundCI will do PEP8 validation - AppVeyor will do Windows builds - coveralls.io will offer code coverage - badges feature more prominently now on the README. --- .coveragerc | 23 +++++++++++++++--- .flake8 | 49 +++++++++++++++++++++++++++++++++++++++ .hound.yml | 16 +++++++++++++ .travis.yml | 5 ++-- README.md | 11 ++++++--- appveyor.yml | 39 +++++++++++++++++++++++++++++++ tests/ci_requirements.txt | 2 ++ tests/run_appveyor.bat | 17 ++++++++++++++ tests/test_api.py | 13 ++++++++++- 9 files changed, 166 insertions(+), 9 deletions(-) create mode 100644 .flake8 create mode 100644 .hound.yml create mode 100644 appveyor.yml create mode 100644 tests/ci_requirements.txt create mode 100644 tests/run_appveyor.bat diff --git a/.coveragerc b/.coveragerc index 3e35ad8a5..5878223d2 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,3 +1,20 @@ -[report] -source = shotgun_api3 -omit = shotgun_api3/lib/* +# Copyright (c) 2018 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. +# +# coverage configuration - used by https://coveralls.io/ integration +# +# + +[run] +source=shotgun_api3 +omit= + shotgun_api3/lib/httplib2/* + shotgun_api3/lib/simplejson/* + shotgun_api3/lib/xmlrpclib.py diff --git a/.flake8 b/.flake8 new file mode 100644 index 000000000..bbe740dfb --- /dev/null +++ b/.flake8 @@ -0,0 +1,49 @@ +# Copyright (c) 2018 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +# Flake 8 PEP and lint configuration - https://gitlab.com/pycqa/flake8 +# +# This defines the official lint and PEP8 rules for this repository +# +# You can run this locally by doing pep install flake8 and then +# >flake8 /path/to/core +# +# This is also used by the hound CI - see the .hound.yml config file. +# +# +[flake8] + +# things we don't want to lint +exclude = + .git, + .flake8, + .gitignore, + .travis.yml, + .cache, + .eggs, + *.rst, + *.yml, + *.pyc, + *.pyo, + *.egg-info, + __pycache__, + # Those are our third parties, do not lint them! + shotgun_api3/lib/httplib2/*.py, + shotgun_api3/lib/simplejson/*.py, + shotgun_api3/lib/xmlrpclib.py + +# exceptions +# +# E501 line too long (112 > 79 characters) +# E402 module level import not top of file +# E999 SyntaxError: invalid syntax (hack for hound CI which runs python 3.x) + +ignore = E501, E402, E999 + diff --git a/.hound.yml b/.hound.yml new file mode 100644 index 000000000..18025a112 --- /dev/null +++ b/.hound.yml @@ -0,0 +1,16 @@ +# Copyright (c) 2017 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +# https://houndci.com configuration file for linting and PEP8 + +python: + enabled: true + config_file: .flake8 + diff --git a/.travis.yml b/.travis.yml index 7caeb2ff6..d8bfa73f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,12 @@ python: - "2.7" # command to install dependencies install: - - pip install nose + - pip install -r tests/ci_requirements.txt before_script: - cp ./tests/example_config ./tests/config # command to run tests -script: nosetests -v +script: coverage run -m nose +after_success: coveralls notifications: email: - api@shotgunsoftware.com diff --git a/README.md b/README.md index 8272db41f..761006f52 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ +[![VFX Platform](https://img.shields.io/badge/vfxplatform-2018-yellow.svg)](http://www.vfxplatform.com/) +[![Reference Documentation](http://img.shields.io/badge/doc-reference-blue.svg)](http://developer.shotgunsoftware.com/python-api) +[![Build Status Linux](https://secure.travis-ci.org/shotgunsoftware/python-api.svg?branch=master)](http://travis-ci.org/shotgunsoftware/python-api) +[![Build status Windows](https://ci.appveyor.com/api/projects/status/slvw7u4jatvdly98/branch/master?svg=true +)](https://ci.appveyor.com/project/jfboismenu/python-api/branch/master) +[![Coverage Status](https://coveralls.io/repos/github/shotgunsoftware/python-api/badge.svg?branch=master)](https://coveralls.io/github/shotgunsoftware/python-api?branch=master) +[![Linting](https://img.shields.io/badge/PEP8%20by-Hound%20CI-a873d1.svg)](https://houndci.com) + # Shotgun Python API Shotgun provides a simple Python-based API for accessing Shotgun and integrating with other tools. This is the official API that is maintained by Shotgun Software (support@shotgunsoftware.com) @@ -32,9 +40,6 @@ You can see the [full history of the Python API on the documentation site](http: Integration and unit tests are provided. -[![Build Status](https://secure.travis-ci.org/shotgunsoftware/python-api.svg?branch=master)](http://travis-ci.org/shotgunsoftware/python-api) - - - All tests require the [nose unit testing tools](http://nose.readthedocs.org), and a `tests/config` file (you can copy an example from `tests/example_config`). - Tests can be run individually like this: `nosetest tests/test_client.py` - `test_client` and `tests_unit` use mock server interaction and do not require a Shotgun instance to be available (no modifications to `tests/config` are necessary). diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..bd71103bf --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,39 @@ +# Copyright (c) 2017 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +# https://www.appveyor.com/ Windows CI configuration file. + +environment: + matrix: + - PYTHON: "C:\\Python27" + + # To update these values, visit AppVeyor's site, click the user icon and scroll down to Encrypt Data. + SG_SERVER_URL: + secure: lIYAxmyz5GEvnbxqE1pAoNuU5+04RYsSzfjRxjqV7vI= + SG_HUMAN_LOGIN: appveyor + SG_HUMAN_NAME: App Veyor + SG_HUMAN_PASSWORD: + secure: 0/BofzMkXtzwtRqzC94FHt3lcyMBG0rr2w0rUropeT4= + SG_SCRIPT_NAME: python-api-test + SG_API_KEY: + secure: cTW+pBjl1H17hsjDOvLaspqkc3H9juXfOhoXMvdcA2l3b5FQeJVYUBWaJUxmqTw9gEzAHmUS6R4WVvw07IWOQ9on8UFHsHqv3JkL2Ji/Oeo= + SG_PROJECT_NAME: SG unittest project for AppVeyor + +build: off + +test_script: + # Put your test command here. + # If you don't need to build C extensions on 64-bit Python 3.3 or 3.4, + # you can remove "build.cmd" from the front of the command, as it's + # only needed to support those cases. + # Note that you must use the environment variable %PYTHON% to refer to + # the interpreter you're using - Appveyor does not do anything special + # to put the Python version you want to use on PATH. + - "tests\\run_appveyor.bat" diff --git a/tests/ci_requirements.txt b/tests/ci_requirements.txt new file mode 100644 index 000000000..8bde5710a --- /dev/null +++ b/tests/ci_requirements.txt @@ -0,0 +1,2 @@ +coveralls==1.1 +nose \ No newline at end of file diff --git a/tests/run_appveyor.bat b/tests/run_appveyor.bat new file mode 100644 index 000000000..7b65b4c82 --- /dev/null +++ b/tests/run_appveyor.bat @@ -0,0 +1,17 @@ +:: Copyright (c) 2018 Shotgun Software Inc. +:: +:: CONFIDENTIAL AND PROPRIETARY +:: +:: This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +:: Source Code License included in this distribution package. See LICENSE. +:: By accessing, using, copying or modifying this work you indicate your +:: agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +:: not expressly granted therein are reserved by Shotgun Software Inc. + +:: +:: This file is run by the appveyor builds. +:: + +copy tests\example_config tests\config +%PYTHON%\Scripts\pip install -r tests/ci_requirements.txt +%PYTHON%\Scripts\nosetests.exe -v diff --git a/tests/test_api.py b/tests/test_api.py index a6bd6aa5f..e83674d43 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -560,7 +560,14 @@ def test_summary_values(self): self.sg.batch(batch_data) self.assertEqual(result['summaries'], count) - self.assertEqual(result['groups'], groups) + # Do not assume the order of the summarized results. + self.assertEqual( + sorted( + result['groups'], + key=lambda x: x["group_name"] + ), + groups + ) def test_ensure_ascii(self): '''test_ensure_ascii tests ensure_unicode flag.''' @@ -1588,6 +1595,10 @@ def test_bad_auth(self): sg = shotgun_api3.Shotgun(server_url, login=login, password='not a real password') self.assertRaises(shotgun_api3.AuthenticationFault, sg.find_one, 'Shot',[]) + # This may trigger an account lockdown. Make sure it is not locked anymore. + user = self.sg.find_one("HumanUser", [["login", "is", login]]) + self.sg.update("HumanUser", user["id"], {"locked_until": None}) + @patch('shotgun_api3.shotgun.Http.request') def test_status_not_200(self, mock_request): response = MagicMock(name="response mock", spec=dict) From f161241e5f3bbb903ccb25ecb52e495f555ee5aa Mon Sep 17 00:00:00 2001 From: Kenny Kwan <37555130+KwanK1@users.noreply.github.com> Date: Fri, 1 Jun 2018 12:45:09 -0400 Subject: [PATCH 198/389] For SG-6337 - Add validation for username/password when Oxygen is enabled (#176) --- shotgun_api3/shotgun.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index a3e8c1d20..b600f059f 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -135,6 +135,13 @@ class UserCredentialsNotAllowedForSSOAuthenticationFault(Fault): """ pass +class UserCredentialsNotAllowedForOxygenAuthenticationFault(Fault): + """ + Exception when the server is configured to use Oxygen. It is not possible to use + a username/password pair to authenticate on such server. + """ + pass + # ---------------------------------------------------------------------------- # API @@ -3384,6 +3391,7 @@ def _response_errors(self, sg_response): ERR_AUTH = 102 # error code for authentication related problems ERR_2FA = 106 # error code when 2FA authentication is required but no 2FA token provided. ERR_SSO = 108 # error code when SSO is activated on the site, preventing the use of username/password for authentication. + ERR_OXYG = 110 # error code when Oxygen is activated on the site, preventing the use of username/password for authentication. if isinstance(sg_response, dict) and sg_response.get("exception"): if sg_response.get("error_code") == ERR_AUTH: @@ -3394,6 +3402,10 @@ def _response_errors(self, sg_response): raise UserCredentialsNotAllowedForSSOAuthenticationFault( sg_response.get("message", "Authentication using username/password is not allowed for an SSO-enabled Shotgun site") ) + elif sg_response.get("error_code") == ERR_OXYG: + raise UserCredentialsNotAllowedForOxygenAuthenticationFault( + sg_response.get("message", "Authentication using username/password is not allowed for an Autodesk Identity enabled Shotgun site") + ) else: # raise general Fault raise Fault(sg_response.get("message", "Unknown Error")) From 387c7bf8513c28279ebc356d9c82d3b3bd192563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 14 Jun 2018 11:35:12 -0400 Subject: [PATCH 199/389] Ensures the password is properly unquoted for the (#178) --- tests/test_client.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_client.py b/tests/test_client.py index 5f83cac82..72d59a445 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -4,6 +4,7 @@ import base64 import datetime +import urllib import re try: import simplejson as json @@ -147,7 +148,7 @@ def test_url(self): # login:password@domain auth_url = "%s%s@%s" % (self.uri_prefix, login_password, self.domain) sg = api.Shotgun(auth_url, None, None, connect=False) - expected = "Basic " + base64.encodestring(login_password).strip() + expected = "Basic " + base64.encodestring(urllib.unquote(login_password)).strip() self.assertEqual(expected, sg.config.authorization) def test_authorization(self): @@ -167,7 +168,7 @@ def test_authorization(self): args, _ = self.sg._http_request.call_args verb, path, body, headers = args - expected = "Basic " + base64.encodestring(login_password).strip() + expected = "Basic " + base64.encodestring(urllib.unquote(login_password)).strip() self.assertEqual(expected, headers.get("Authorization")) def test_user_agent(self): From e13d30dd6386cfdd5f8bb43a3bd520a74f88a956 Mon Sep 17 00:00:00 2001 From: Brandon Ashworth Date: Mon, 18 Jun 2018 14:49:18 -0700 Subject: [PATCH 200/389] Ticket/sg 4335 pref access via api (#177) * For SG-4335 - Added support for querying a subset of site preferences. * For SG-4335 - Fixed test to only run on the correct versions of Shotgun. * Addressing code review note --- shotgun_api3/shotgun.py | 20 ++++++++++++++ tests/test_api.py | 60 ++++++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index b600f059f..4a54e72a6 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -3038,6 +3038,26 @@ def get_session_token(self): return session_token + def preferences_read(self, prefs=None): + """ + Get a subset of the site preferences. + + >>> sg.preferences_read() + { + "pref_name": "pref value" + } + :param list prefs: An optional list of preference names to return. + :returns: Dictionary of preferences and their values. + :rtype: dict + """ + if self.server_caps.version and self.server_caps.version < (7, 10, 0): + raise ShotgunError("preferences_read requires server version 7.10.0 or "\ + "higher, server is %s" % (self.server_caps.version,)) + + prefs = prefs or [] + + return self._call_rpc("preferences_read", { "prefs": prefs }) + def _build_opener(self, handler): """ Build urllib2 opener with appropriate proxy handler. diff --git a/tests/test_api.py b/tests/test_api.py index e83674d43..a5408412a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -650,6 +650,48 @@ def test_work_schedule(self): work_schedule['2012-01-04'] = {"reason": "USER_EXCEPTION", "working": False, "description": "Artist Holiday"} self.assertEqual(work_schedule, resp) + def test_preferences_read(self): + # Only run the tests on a server with the feature. + if not self.sg.server_caps.version or self.sg.server_caps.version < (7, 10, 0): + return + + # all prefs + resp = self.sg.preferences_read() + + expected = { + 'date_component_order': 'month_day', + 'format_currency_fields_decimal_options': '$1,000.99', + 'format_currency_fields_display_dollar_sign': False, + 'format_currency_fields_negative_options': '- $1,000', + 'format_date_fields': '08/04/22 OR 04/08/22 (depending on the Month order preference)', + 'format_float_fields': '9,999.99', + 'format_float_fields_rounding': '9.999999', + 'format_footage_fields': '10-05', + 'format_number_fields': '1,000', + 'format_time_hour_fields': '12 hour', + 'support_local_storage': False + } + self.assertEqual(expected, resp) + + # all filtered + resp = self.sg.preferences_read(['date_component_order', 'support_local_storage']) + + expected = { + 'date_component_order': 'month_day', + 'support_local_storage': False + } + self.assertEqual(expected, resp) + + # all filtered with invalid pref + resp = self.sg.preferences_read(['date_component_order', 'support_local_storage', 'email_notifications']) + + expected = { + 'date_component_order': 'month_day', + 'support_local_storage': False + } + self.assertEqual(expected, resp) + + class TestDataTypes(base.LiveTestBase): '''Test fields representing the different data types mapped on the server side. @@ -1543,18 +1585,18 @@ def test_following(self): [["id","is",self.task["id"]]], ["project.Project.id"])["project.Project.id"] project_count = 2 if shot_project_id == task_project_id else 1 - result = self.sg.following(self.human_user, + result = self.sg.following(self.human_user, project={"type":"Project", "id":shot_project_id}) self.assertEqual( project_count, len(result) ) - result = self.sg.following(self.human_user, + result = self.sg.following(self.human_user, project={"type":"Project", "id":task_project_id}) self.assertEqual( project_count, len(result) ) - result = self.sg.following(self.human_user, - project={"type":"Project", "id":shot_project_id}, + result = self.sg.following(self.human_user, + project={"type":"Project", "id":shot_project_id}, entity_type="Shot") self.assertEqual( 1, len(result) ) - result = self.sg.following(self.human_user, - project={"type":"Project", "id":task_project_id}, + result = self.sg.following(self.human_user, + project={"type":"Project", "id":task_project_id}, entity_type="Task") self.assertEqual( 1, len(result) ) @@ -1701,7 +1743,7 @@ def test_upload_empty_file(self): path = os.path.abspath(os.path.expanduser(os.path.join(this_dir,"empty.txt"))) self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload, 'Version', 123, path) self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_thumbnail, 'Version', 123, path) - self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_filmstrip_thumbnail, 'Version', + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_filmstrip_thumbnail, 'Version', 123, path) def test_upload_missing_file(self): @@ -1711,7 +1753,7 @@ def test_upload_missing_file(self): path = "/path/to/nowhere/foo.txt" self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload, 'Version', 123, path) self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_thumbnail, 'Version', 123, path) - self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_filmstrip_thumbnail, 'Version', + self.assertRaises(shotgun_api3.ShotgunError, self.sg.upload_filmstrip_thumbnail, 'Version', 123, path) # def test_malformed_response(self): @@ -2525,7 +2567,7 @@ def _has_unicode(data): def _get_path(url): """Returns path component of a url without the sheme, host, query, anchor, or any other - additional elements. + additional elements. For example, the url "https://foo.shotgunstudio.com/page/2128#Shot_1190_sr10101_034" returns "/page/2128" """ From a7d1790b98b02e841361fa318d1a90f41f491de6 Mon Sep 17 00:00:00 2001 From: dallum Date: Sat, 23 Jun 2018 01:27:12 +0100 Subject: [PATCH 201/389] Date change Date change. --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 4a54e72a6..5557246fc 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ ----------------------------------------------------------------------------- - Copyright (c) 2009-2017, Shotgun Software Inc. + Copyright (c) 2009-2018, Shotgun Software Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From d589f4b3240fc9d71aa0738a4afb8eb57c0d2d31 Mon Sep 17 00:00:00 2001 From: Jeffery Beeland Date: Tue, 26 Jun 2018 16:04:07 -0700 Subject: [PATCH 202/389] SG-4483: Handles non-ascii unicode and utf-8 string paths gracefully during upload. (#179) For the various upload-related methods, we now properly support file paths given as unicode, ascii, or utf-8 encoded strings. Any string encoding used that is not supported will result in a sane error message from the api that will aid in debugging the problem. --- shotgun_api3/shotgun.py | 48 +++++++++++++++++++++++++-- "tests/No\303\253l.jpg" | Bin 0 -> 11361 bytes tests/test_api.py | 58 +++++++++++++++++++++++++++++++++ "tests/\343\201\224.shift-jis" | Bin 0 -> 11361 bytes 4 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 "tests/No\303\253l.jpg" create mode 100644 "tests/\343\201\224.shift-jis" diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 5557246fc..27aebdab4 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2251,6 +2251,23 @@ def upload(self, entity_type, entity_id, path, field_name=None, display_name=Non """ # Basic validations of the file to upload. path = os.path.abspath(os.path.expanduser(path or "")) + + # We need to check for string encodings that we aren't going to be able + # to support later in the upload process. If the given path wasn't already + # unicode, we will try to decode it as utf-8, and if that fails then we + # have to raise a sane exception. This will always work for ascii and utf-8 + # encoded strings, but will fail on some others if the string includes non + # ascii characters. + if not isinstance(path, unicode): + try: + path = path.decode("utf-8") + except UnicodeDecodeError: + raise ShotgunError( + "Could not upload the given file path. It is encoded as " + "something other than utf-8 or ascii. To upload this file, " + "it can be string encoded as utf-8, or given as unicode: %s" % path + ) + if not os.path.isfile(path): raise ShotgunError("Path must be a valid file, got '%s'" % path) if os.path.getsize(path) == 0: @@ -2365,10 +2382,27 @@ def _upload_to_sg(self, entity_type, entity_id, path, field_name, display_name, params.update(self._auth_params()) + # If we ended up with a unicode string path, we need to encode it + # as a utf-8 string. If we don't, there's a chance that there will + # will be an attempt later on to encode it as an ascii string, and + # that will fail ungracefully if the path contains any non-ascii + # characters. + # + # On Windows, if the path contains non-ascii characters, the calls + # to open later in this method will fail to find the file if given + # a non-ascii-encoded string path. In that case, we're going to have + # to call open on the unicode path, but we'll use the encoded string + # for everything else. + path_to_open = path + if isinstance(path, unicode): + path = path.encode("utf-8") + if sys.platform != "win32": + path_to_open = path + if is_thumbnail: url = urlparse.urlunparse((self.config.scheme, self.config.server, "/upload/publish_thumbnail", None, None, None)) - params["thumb_image"] = open(path, "rb") + params["thumb_image"] = open(path_to_open, "rb") if field_name == "filmstrip_thumb_image" or field_name == "filmstrip_image": params["filmstrip"] = True @@ -2385,7 +2419,7 @@ def _upload_to_sg(self, entity_type, entity_id, path, field_name, display_name, if tag_list: params["tag_list"] = tag_list - params["file"] = open(path, "rb") + params["file"] = open(path_to_open, "rb") result = self._send_form(url, params) @@ -3929,7 +3963,15 @@ def encode(self, params, files, boundary=None, buffer=None): buffer.write('Content-Disposition: form-data; name="%s"' % key) buffer.write('\r\n\r\n%s\r\n' % value) for (key, fd) in files: - filename = fd.name.split('/')[-1] + # On Windows, it's possible that we were forced to open a file + # with non-ascii characters as unicode. In that case, we need to + # encode it as a utf-8 string to remove unicode from the equation. + # If we don't, the mix of unicode and strings going into the + # buffer can cause UnicodeEncodeErrors to be raised. + filename = fd.name + if isinstance(filename, unicode): + filename = filename.encode("utf-8") + filename = filename.split('/')[-1] content_type = mimetypes.guess_type(filename)[0] content_type = content_type or 'application/octet-stream' file_size = os.fstat(fd.fileno())[stat.ST_SIZE] diff --git "a/tests/No\303\253l.jpg" "b/tests/No\303\253l.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..7a8aaf9677c755850ca6a0419e69de44a9c8a153 GIT binary patch literal 11361 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 oN1y5)efl-o59ZbMCq4p1Ys9 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 oN1y5)efl Date: Thu, 5 Jul 2018 16:00:50 -0700 Subject: [PATCH 203/389] SG-4483: Fixes a problem with a test fixture causing pip install problems on Windows. (#180) There was a file included in the tests used the check compatibility with a non-standard string encoding and non-ascii characters in file names that caused problems with pip install on Windows. The file has been removed from the repo, and is now created by the relevant test on the fly. --- HISTORY.rst | 6 ++++++ tests/test_api.py | 18 ++++++++++++++++++ "tests/\343\201\224.shift-jis" | Bin 11361 -> 0 bytes 3 files changed, 24 insertions(+) delete mode 100644 "tests/\343\201\224.shift-jis" diff --git a/HISTORY.rst b/HISTORY.rst index 8d2bcaaa0..e4c5faa9c 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,12 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.37 +===================== + +- Proper support added for unicode and utf-8 string paths given to upload methods, and a sane error is raised when an unusable string encoding is used. +- Adds support for querying preferences from Shotgun via the new preferences_read method. + v3.0.36 ===================== diff --git a/tests/test_api.py b/tests/test_api.py index b84f35dcb..a4f566e5c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -252,6 +252,23 @@ def test_upload_download(self): # Make sure that non-utf-8 encoded paths raise when they can't be # converted to utf-8. + # + # We need to touch the file we're going to test with first. We can't + # bundle a file with this filename in the repo due to some pip install + # problems on Windows. Note that the path below is utf-8 encoding of + # what we'll eventually encode as shift-jis. + file_path_s = os.path.join(this_dir, "./\xe3\x81\x94.shift-jis") + file_path_u = file_path_s.decode("utf-8") + if sys.platform.startswith("win"): + fh = open(file_path_u, "w") + else: + fh = open(file_path_s, "w") + + try: + fh.write("This is just a test file with some random data in it.") + finally: + fh.close() + u_path = os.path.abspath( os.path.expanduser( glob.glob(os.path.join(unicode(this_dir), u'*.shift-jis'))[0] @@ -278,6 +295,7 @@ def test_upload_download(self): # cleanup os.remove(file_path) + os.remove(u_path) def test_upload_thumbnail_in_create(self): """Upload a thumbnail via the create method""" diff --git "a/tests/\343\201\224.shift-jis" "b/tests/\343\201\224.shift-jis" deleted file mode 100644 index 7a8aaf9677c755850ca6a0419e69de44a9c8a153..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11361 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 oN1y5)efl Date: Thu, 19 Jul 2018 18:23:10 -0400 Subject: [PATCH 204/389] SG-6892 - Use s3_enabled_upload_types for cloud uploads (#181) Makes use of the s3_enabled_upload_types info object to see if an upload supports and should be sent to cloud storage. This change is backwards compatible with older versions of Shotgun, and should be transparent to users. --- shotgun_api3/shotgun.py | 47 ++++++++++++++++++++++++++++--- tests/test_api.py | 62 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 4 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 27aebdab4..c7a4921c9 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -2276,10 +2276,8 @@ def upload(self, entity_type, entity_id, path, field_name=None, display_name=Non is_thumbnail = (field_name in ["thumb_image", "filmstrip_thumb_image", "image", "filmstrip_image"]) - # Version.sg_uploaded_movie is handled as a special case and uploaded - # directly to Cloud storage - if self.server_info.get("s3_direct_uploads_enabled", False) \ - and entity_type == "Version" and field_name == "sg_uploaded_movie": + # Supported types can be directly uploaded to Cloud storage + if self._requires_direct_s3_upload(entity_type, field_name): return self._upload_to_storage(entity_type, entity_id, path, field_name, display_name, tag_list, is_thumbnail) else: @@ -3853,6 +3851,47 @@ def _complete_multipart_upload(self, upload_info, filename, etags): if not str(result).startswith("1"): raise ShotgunError("Unable get upload part link: %s" % result) + def _requires_direct_s3_upload(self, entity_type, field_name): + """ + Internal function that determines if an entity_type + field_name combination + should be uploaded to cloud storage. + + The info endpoint should return `s3_enabled_upload_types` which contains an object like the following: + { + 'Version': ['sg_uploaded_movie'], + 'Attachment': '*', + '*': ['this_file'] + } + + :param str entity_type: The entity type of the file being uploaded. + :param str field_name: The matching field name for the file being uploaded. + + :returns: Whether the field + entity type combination should be uploaded to cloud storage. + :rtype: bool + """ + supported_s3_types = self.server_info.get('s3_enabled_upload_types') or {} + supported_fields = supported_s3_types.get(entity_type) or [] + supported_star_fields = supported_s3_types.get("*") or [] + # If direct uploads are enabled + if self.server_info.get("s3_direct_uploads_enabled", False): + # If field_name is part of a supported entity_type + if field_name in supported_fields or field_name in supported_star_fields: + return True + # If supported_fields is a string or a list with * + if isinstance(supported_fields, list) and "*" in supported_fields: + return True + elif supported_fields == "*": + return True + # If supported_star_fields is a list containing * or * as a string + if isinstance(supported_star_fields, list) and "*" in supported_star_fields: + return True + elif supported_star_fields == "*": + return True + # Support direct upload for old versions of shotgun + return entity_type == "Version" and field_name == "sg_uploaded_movie" + else: + return False + def _send_form(self, url, params): """ Utility function to send a Form to Shotgun and process any HTTP errors that diff --git a/tests/test_api.py b/tests/test_api.py index a4f566e5c..12a3673b3 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -415,6 +415,68 @@ def test_upload_thumbnail_with_upload_function(self): f_thumb_id = self.sg.upload("Task", self.task['id'], path, 'filmstrip_image') self.assertTrue(isinstance(f_thumb_id, int)) + def test_requires_direct_s3_upload(self): + """Test _requires_direct_s3_upload""" + + upload_types = self.sg.server_info.get("s3_enabled_upload_types") + direct_uploads_enabled = self.sg.server_info.get("s3_direct_uploads_enabled") + + self.sg.server_info["s3_enabled_upload_types"] = None + self.sg.server_info["s3_direct_uploads_enabled"] = None + + # Test s3_enabled_upload_types and s3_direct_uploads_enabled not set + self.assertFalse(self.sg._requires_direct_s3_upload("Version", "sg_uploaded_movie")) + + self.sg.server_info["s3_enabled_upload_types"] = { + "Version": ["sg_uploaded_movie"] + } + + # Test direct_uploads_enabled not set + self.assertFalse(self.sg._requires_direct_s3_upload("Version", "sg_uploaded_movie")) + + self.sg.server_info["s3_direct_uploads_enabled"] = True + + # Test regular path + self.assertTrue(self.sg._requires_direct_s3_upload("Version", "sg_uploaded_movie")) + self.assertFalse(self.sg._requires_direct_s3_upload("Version", "abc")) + self.assertFalse(self.sg._requires_direct_s3_upload("Abc", "abc")) + + # Test star field wildcard and arrays of fields + self.sg.server_info["s3_enabled_upload_types"] = { + "Version": ["sg_uploaded_movie", "test", "other"], + "Test": ["*"], + "Asset": "*" + } + + self.assertTrue(self.sg._requires_direct_s3_upload("Version", "sg_uploaded_movie")) + self.assertTrue(self.sg._requires_direct_s3_upload("Version", "test")) + self.assertTrue(self.sg._requires_direct_s3_upload("Version", "other")) + self.assertTrue(self.sg._requires_direct_s3_upload("Test", "abc")) + self.assertTrue(self.sg._requires_direct_s3_upload("Asset", "test")) + + # Test default allowed upload type + self.sg.server_info["s3_enabled_upload_types"] = None + self.assertTrue(self.sg._requires_direct_s3_upload("Version", "sg_uploaded_movie")) + self.assertFalse(self.sg._requires_direct_s3_upload("Version", "test")) + + # Test star entity_type + self.sg.server_info["s3_enabled_upload_types"] = { + "*": ["sg_uploaded_movie", "test"] + } + self.assertTrue(self.sg._requires_direct_s3_upload("Something", "sg_uploaded_movie")) + self.assertTrue(self.sg._requires_direct_s3_upload("Version", "test")) + self.assertFalse(self.sg._requires_direct_s3_upload("Version", "other")) + + # Test entity_type and field_name wildcard + self.sg.server_info["s3_enabled_upload_types"] = { + "*": "*" + } + self.assertTrue(self.sg._requires_direct_s3_upload("Something", "sg_uploaded_movie")) + self.assertTrue(self.sg._requires_direct_s3_upload("Version", "abc")) + + self.sg.server_info["s3_enabled_upload_types"] = upload_types + self.sg.server_info["s3_direct_uploads_enabled"] = direct_uploads_enabled + def test_linked_thumbnail_url(self): this_dir, _ = os.path.split(__file__) path = os.path.abspath(os.path.expanduser( From c7be882272a34a7b550a45a9f090325ee9b46e8a Mon Sep 17 00:00:00 2001 From: Jeff Beeland Date: Thu, 19 Jul 2018 15:48:51 -0700 Subject: [PATCH 205/389] [minor] Prep work for release: docs updated and polished and changelog updates. --- HISTORY.rst | 1 + docs/reference.rst | 1 + shotgun_api3/shotgun.py | 1 + 3 files changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index e4c5faa9c..41d9467a5 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,6 +9,7 @@ v3.0.37 - Proper support added for unicode and utf-8 string paths given to upload methods, and a sane error is raised when an unusable string encoding is used. - Adds support for querying preferences from Shotgun via the new preferences_read method. +- Under-the-hood changes to add support for direct to s3 uploads to Shotgun. This change should be transparent to users. v3.0.36 ===================== diff --git a/docs/reference.rst b/docs/reference.rst index 39a97abce..50eb45b3e 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -140,6 +140,7 @@ also some specialized convenience methods for accessing particular types of info .. automethod:: Shotgun.update_project_last_accessed .. automethod:: Shotgun.work_schedule_read .. automethod:: Shotgun.work_schedule_update +.. automethod:: Shotgun.preferences_read Working With Files ================== diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index c7a4921c9..70da7e799 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -3078,6 +3078,7 @@ def preferences_read(self, prefs=None): { "pref_name": "pref value" } + :param list prefs: An optional list of preference names to return. :returns: Dictionary of preferences and their values. :rtype: dict From b13dd5d03b6b3c7bb946f77a9eaff7c3dc7ff324 Mon Sep 17 00:00:00 2001 From: Jeff Beeland Date: Thu, 19 Jul 2018 15:58:38 -0700 Subject: [PATCH 206/389] [minor] Updates the __version__ tag in shotgun.py. --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 70da7e799..c5ebed3d4 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.36" +__version__ = "3.0.37" # ---------------------------------------------------------------------------- # Errors From 9ceb61dd87496b46a6e70e1c8263fd1ccf41aaa6 Mon Sep 17 00:00:00 2001 From: Jeff Beeland Date: Thu, 3 Jan 2019 11:48:46 -0800 Subject: [PATCH 207/389] SG-10148: Corrects the release version in setup.py. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f3f7aa96e..1bd9159b1 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.36', + version='3.0.37', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', From 46ec4bdda2681e2fec531746022f099434432cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Thu, 17 Jan 2019 15:37:52 +0000 Subject: [PATCH 208/389] [minor] Tweaks to HoundCI config. (#186) In an effort to centralize, now uses a centralized HoundCI configuration found in tk-core instead of its own. --- .flake8 | 49 ------------------------------------------------- .hound.yml | 16 ---------------- 2 files changed, 65 deletions(-) delete mode 100644 .flake8 delete mode 100644 .hound.yml diff --git a/.flake8 b/.flake8 deleted file mode 100644 index bbe740dfb..000000000 --- a/.flake8 +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright (c) 2018 Shotgun Software Inc. -# -# CONFIDENTIAL AND PROPRIETARY -# -# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit -# Source Code License included in this distribution package. See LICENSE. -# By accessing, using, copying or modifying this work you indicate your -# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights -# not expressly granted therein are reserved by Shotgun Software Inc. - -# Flake 8 PEP and lint configuration - https://gitlab.com/pycqa/flake8 -# -# This defines the official lint and PEP8 rules for this repository -# -# You can run this locally by doing pep install flake8 and then -# >flake8 /path/to/core -# -# This is also used by the hound CI - see the .hound.yml config file. -# -# -[flake8] - -# things we don't want to lint -exclude = - .git, - .flake8, - .gitignore, - .travis.yml, - .cache, - .eggs, - *.rst, - *.yml, - *.pyc, - *.pyo, - *.egg-info, - __pycache__, - # Those are our third parties, do not lint them! - shotgun_api3/lib/httplib2/*.py, - shotgun_api3/lib/simplejson/*.py, - shotgun_api3/lib/xmlrpclib.py - -# exceptions -# -# E501 line too long (112 > 79 characters) -# E402 module level import not top of file -# E999 SyntaxError: invalid syntax (hack for hound CI which runs python 3.x) - -ignore = E501, E402, E999 - diff --git a/.hound.yml b/.hound.yml deleted file mode 100644 index 18025a112..000000000 --- a/.hound.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2017 Shotgun Software Inc. -# -# CONFIDENTIAL AND PROPRIETARY -# -# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit -# Source Code License included in this distribution package. See LICENSE. -# By accessing, using, copying or modifying this work you indicate your -# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights -# not expressly granted therein are reserved by Shotgun Software Inc. - -# https://houndci.com configuration file for linting and PEP8 - -python: - enabled: true - config_file: .flake8 - From 855dcd829df61b0af643b24639663b464c016386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 29 Jan 2019 15:09:39 -0500 Subject: [PATCH 209/389] Update README.md --- README.md | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 761006f52..a7c93da54 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,38 @@ Integration and unit tests are provided. - `test_api` and `test_api_long` *do* require a Shotgun instance, with a script key available for the tests. The server and script user values must be supplied in the `tests/config` file. The tests will add test data to your server based on information in your config. This data will be manipulated by the tests, and should not be used for other purposes. - To run all of the tests, use the shell script `run-tests`. - - - - +## Release process + +### Packaging up new release + +1) Update the Changelog in the `HISTORY.rst` file + - Add bullet points for any changes that have happened since the previous release. This may include changes you did not make so look at the commit history and make sure we don't miss anything. If you notice something was done that wasn't added to the changelog, hunt down that engineer and make them feel guilty for not doing so. This is a required step in making changes to the API. + - Try and match the language of previous change log messages. We want to keep a consistent voice. + - Make sure the date of the release matches today. We try and keep this TBD until we're ready to do a release so it's easy to catch that it needs to be updated. + - Make sure the version number is filled out and correct. We follow semantic versioning. Or more correctly, we should be following it. +2) Ensure any changes or additions to public methods are documented + - Update the Github wiki, and usually you'll need to update the Method Reference page with concise and exact documentation of the changes that are in this release. + - Ensure that doc strings are updated in the code itself to work with Sphinx and are correctly formatted. + - Examples are always good especially if this a new feature or method. + - Think about a new user to the API trying to figure out how to use the features you're documenting. +3) Update the version value in `shotgun_api3/setup.py` to match the version you are packaging. This controls what version users will get when installing via pip. +4) Update the `__version__` value in `shotgun_api3/shotgun.py` to the version you're releasing. This identified the current version within the API itself. +5) Commit these changes in master with a commit message like `packaging for the vx.x.x release`. +6) Create a tag based off of the master branch called `vx.x.x` to match the version number you're releasing. +7) Push master and your tag to Github. +8) Update the Releases page with your new release. + - The release should already be there from your tag but if not, create a new one. + - Add more detailed information regarding the changes in this release. This is a great place to add examples, and reasons for the change! + +### Letting the world know +We usually send an email to the `shotgun-dev` list with an announcement of the release and highlight the changes. + +### Prepare for the Next Dev Cycle +1) Update the `__version__` value in `shotgun_api3/shotgun.py` to the next version number with `.dev` appended to it. For example, `v3.0.24.dev` +2) Add a new section to the Changelog in the `HISTORY.rst` file with the next version number and a TBD date +``` + **v3.0.24 - TBD** + + TBD +``` +3) Commit the changes to master with a commit message like `Bump version to v3.0.24.dev` +4) Push master to Github From c6285e1ca253ee795a52d29d492ecffbcbfcac10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 29 Jan 2019 15:14:23 -0500 Subject: [PATCH 210/389] Created dev build --- HISTORY.rst | 4 ++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 41d9467a5..ebb2f65db 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,10 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.38.dev +===================== +- TBD + v3.0.37 ===================== diff --git a/setup.py b/setup.py index 1bd9159b1..d1c5c08ac 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.37', + version='3.0.38', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index c5ebed3d4..d6f8023df 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.37" +__version__ = "3.0.38.dev" # ---------------------------------------------------------------------------- # Errors From 19c1f1dc8d1e2996738cc3f709e393c2356c8e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Tue, 29 Jan 2019 15:15:41 -0500 Subject: [PATCH 211/389] For SG-9540, upgrade httplib2 (#187) This upgrades httplib2 to the most recent version (0.12.0). It has been slightly modified so the library imports parts of itself via from . import instead of from http2lib import something, as the library isn't part of the PYTHONPATH. Tests are also much faster. --- README.md | 6 + shotgun_api3/lib/httplib2/__init__.py | 1642 ++++++++----- shotgun_api3/lib/httplib2/cacerts.txt | 3246 ++----------------------- shotgun_api3/lib/httplib2/certs.py | 42 + shotgun_api3/lib/httplib2/iri2uri.py | 57 +- shotgun_api3/lib/httplib2/socks.py | 178 +- shotgun_api3/lib/requirements.txt | 32 + tests/base.py | 138 +- tests/test_api.py | 6 +- 9 files changed, 1565 insertions(+), 3782 deletions(-) create mode 100644 shotgun_api3/lib/httplib2/certs.py create mode 100644 shotgun_api3/lib/requirements.txt diff --git a/README.md b/README.md index a7c93da54..a3d2a0a7f 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,12 @@ Some useful direct links: You can see the [full history of the Python API on the documentation site](http://developer.shotgunsoftware.com/python-api/changelog.html). +## Updating HTTPLib2 + +1. Download the latest version of HTTPLib2 at https://pypi.org/project/httplib2. +2. Extract the python2/httplib2 into shotgun_api3/lib/http2lib without the test folder. +3. Scan the files for any references to importing httplib2 and make sure they import "from ." instead of "from httplib2" because the library isn't in the Python path. + ## Tests Integration and unit tests are provided. diff --git a/shotgun_api3/lib/httplib2/__init__.py b/shotgun_api3/lib/httplib2/__init__.py index 19e7cff11..b3cc0b2fb 100644 --- a/shotgun_api3/lib/httplib2/__init__.py +++ b/shotgun_api3/lib/httplib2/__init__.py @@ -1,54 +1,53 @@ -from __future__ import generators -""" -httplib2 - -A caching http interface that supports ETags and gzip -to conserve bandwidth. - -Requires Python 2.3 or later - -Changelog: -2007-08-18, Rick: Modified so it's able to use a socks proxy if needed. +"""Small, fast HTTP client library for Python. +Features persistent connections, cache, and Google App Engine Standard +Environment support. """ +from __future__ import print_function + __author__ = "Joe Gregorio (joe@bitworking.org)" __copyright__ = "Copyright 2006, Joe Gregorio" -__contributors__ = ["Thomas Broyer (t.broyer@ltgt.net)", - "James Antill", - "Xavier Verges Farrero", - "Jonathan Feinberg", - "Blair Zajac", - "Sam Ruby", - "Louis Nyffenegger"] +__contributors__ = [ + "Thomas Broyer (t.broyer@ltgt.net)", + "James Antill", + "Xavier Verges Farrero", + "Jonathan Feinberg", + "Blair Zajac", + "Sam Ruby", + "Louis Nyffenegger", + "Alex Yu", +] __license__ = "MIT" -__version__ = "0.9.1" +__version__ = '0.12.0' -import re -import sys +import base64 +import calendar +import copy import email -import email.Utils -import email.Message import email.FeedParser -import StringIO +import email.Message +import email.Utils +import errno import gzip -import zlib import httplib -import urlparse -import urllib -import base64 import os -import copy -import calendar -import time import random -import errno +import re +import StringIO +import sys +import time +import urllib +import urlparse +import zlib + try: from hashlib import sha1 as _sha, md5 as _md5 except ImportError: # prior to Python 2.5, these were separate modules import sha import md5 + _sha = sha.new _md5 = md5.new import hmac @@ -56,7 +55,7 @@ import socket try: - from httplib2 import socks + from . import socks except ImportError: try: import socks @@ -64,51 +63,91 @@ socks = None # Build the appropriate socket wrapper for ssl +ssl = None +ssl_SSLError = None +ssl_CertificateError = None try: - import ssl # python 2.6 - ssl_SSLError = ssl.SSLError - def _ssl_wrap_socket(sock, key_file, cert_file, - disable_validation, ca_certs): - if disable_validation: - cert_reqs = ssl.CERT_NONE - else: - cert_reqs = ssl.CERT_REQUIRED - # We should be specifying SSL version 3 or TLS v1, but the ssl module - # doesn't expose the necessary knobs. So we need to go with the default - # of SSLv23. - return ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file, - cert_reqs=cert_reqs, ca_certs=ca_certs) -except (AttributeError, ImportError): - ssl_SSLError = None - def _ssl_wrap_socket(sock, key_file, cert_file, - disable_validation, ca_certs): - if not disable_validation: - raise CertificateValidationUnsupported( - "SSL certificate validation is not supported without " - "the ssl module installed. To avoid this error, install " - "the ssl module, or explicity disable validation.") - ssl_sock = socket.ssl(sock, key_file, cert_file) - return httplib.FakeSocket(sock, ssl_sock) - - -if sys.version_info >= (2,3): + import ssl # python 2.6 +except ImportError: + pass +if ssl is not None: + ssl_SSLError = getattr(ssl, "SSLError", None) + ssl_CertificateError = getattr(ssl, "CertificateError", None) + + +def _ssl_wrap_socket( + sock, key_file, cert_file, disable_validation, ca_certs, ssl_version, hostname +): + if disable_validation: + cert_reqs = ssl.CERT_NONE + else: + cert_reqs = ssl.CERT_REQUIRED + if ssl_version is None: + ssl_version = ssl.PROTOCOL_SSLv23 + + if hasattr(ssl, "SSLContext"): # Python 2.7.9 + context = ssl.SSLContext(ssl_version) + context.verify_mode = cert_reqs + context.check_hostname = cert_reqs != ssl.CERT_NONE + if cert_file: + context.load_cert_chain(cert_file, key_file) + if ca_certs: + context.load_verify_locations(ca_certs) + return context.wrap_socket(sock, server_hostname=hostname) + else: + return ssl.wrap_socket( + sock, + keyfile=key_file, + certfile=cert_file, + cert_reqs=cert_reqs, + ca_certs=ca_certs, + ssl_version=ssl_version, + ) + + +def _ssl_wrap_socket_unsupported( + sock, key_file, cert_file, disable_validation, ca_certs, ssl_version, hostname +): + if not disable_validation: + raise CertificateValidationUnsupported( + "SSL certificate validation is not supported without " + "the ssl module installed. To avoid this error, install " + "the ssl module, or explicity disable validation." + ) + ssl_sock = socket.ssl(sock, key_file, cert_file) + return httplib.FakeSocket(sock, ssl_sock) + + +if ssl is None: + _ssl_wrap_socket = _ssl_wrap_socket_unsupported + +if sys.version_info >= (2, 3): from iri2uri import iri2uri else: + def iri2uri(uri): return uri -def has_timeout(timeout): # python 2.6 - if hasattr(socket, '_GLOBAL_DEFAULT_TIMEOUT'): - return (timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT) - return (timeout is not None) -__all__ = [ - 'Http', 'Response', 'ProxyInfo', 'HttpLib2Error', 'RedirectMissingLocation', - 'RedirectLimit', 'FailedToDecompressContent', - 'UnimplementedDigestAuthOptionError', - 'UnimplementedHmacDigestAuthOptionError', - 'debuglevel', 'ProxiesUnavailableError'] +def has_timeout(timeout): # python 2.6 + if hasattr(socket, "_GLOBAL_DEFAULT_TIMEOUT"): + return timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT + return timeout is not None + +__all__ = [ + "Http", + "Response", + "ProxyInfo", + "HttpLib2Error", + "RedirectMissingLocation", + "RedirectLimit", + "FailedToDecompressContent", + "UnimplementedDigestAuthOptionError", + "UnimplementedHmacDigestAuthOptionError", + "debuglevel", + "ProxiesUnavailableError", +] # The httplib debug level, set to a non-zero value to get debug output debuglevel = 0 @@ -117,11 +156,13 @@ def has_timeout(timeout): # python 2.6 RETRIES = 2 # Python 2.3 support -if sys.version_info < (2,4): +if sys.version_info < (2, 4): + def sorted(seq): seq.sort() return seq + # Python 2.3 support def HTTPResponse__getheaders(self): """Return list of (header, value) tuples.""" @@ -129,11 +170,15 @@ def HTTPResponse__getheaders(self): raise httplib.ResponseNotReady() return self.msg.items() -if not hasattr(httplib.HTTPResponse, 'getheaders'): + +if not hasattr(httplib.HTTPResponse, "getheaders"): httplib.HTTPResponse.getheaders = HTTPResponse__getheaders + # All exceptions raised here derive from HttpLib2Error -class HttpLib2Error(Exception): pass +class HttpLib2Error(Exception): + pass + # Some exceptions can be caught and optionally # be turned back into responses. @@ -143,25 +188,66 @@ def __init__(self, desc, response, content): self.content = content HttpLib2Error.__init__(self, desc) -class RedirectMissingLocation(HttpLib2ErrorWithResponse): pass -class RedirectLimit(HttpLib2ErrorWithResponse): pass -class FailedToDecompressContent(HttpLib2ErrorWithResponse): pass -class UnimplementedDigestAuthOptionError(HttpLib2ErrorWithResponse): pass -class UnimplementedHmacDigestAuthOptionError(HttpLib2ErrorWithResponse): pass - -class MalformedHeader(HttpLib2Error): pass -class RelativeURIError(HttpLib2Error): pass -class ServerNotFoundError(HttpLib2Error): pass -class ProxiesUnavailableError(HttpLib2Error): pass -class CertificateValidationUnsupported(HttpLib2Error): pass -class SSLHandshakeError(HttpLib2Error): pass -class NotSupportedOnThisPlatform(HttpLib2Error): pass + +class RedirectMissingLocation(HttpLib2ErrorWithResponse): + pass + + +class RedirectLimit(HttpLib2ErrorWithResponse): + pass + + +class FailedToDecompressContent(HttpLib2ErrorWithResponse): + pass + + +class UnimplementedDigestAuthOptionError(HttpLib2ErrorWithResponse): + pass + + +class UnimplementedHmacDigestAuthOptionError(HttpLib2ErrorWithResponse): + pass + + +class MalformedHeader(HttpLib2Error): + pass + + +class RelativeURIError(HttpLib2Error): + pass + + +class ServerNotFoundError(HttpLib2Error): + pass + + +class ProxiesUnavailableError(HttpLib2Error): + pass + + +class CertificateValidationUnsupported(HttpLib2Error): + pass + + +class SSLHandshakeError(HttpLib2Error): + pass + + +class NotSupportedOnThisPlatform(HttpLib2Error): + pass + + class CertificateHostnameMismatch(SSLHandshakeError): def __init__(self, desc, host, cert): HttpLib2Error.__init__(self, desc) self.host = host self.cert = cert + +class NotRunningAppEngineEnvironment(HttpLib2Error): + pass + + # Open Items: # ----------- # Proxy support @@ -177,33 +263,37 @@ def __init__(self, desc, host, cert): # Does not handle Cache-Control: max-stale # Does not use Age: headers when calculating cache freshness. - # The number of redirections to follow before giving up. # Note that only GET redirects are automatically followed. # Will also honor 301 requests by saving that info and never # requesting that URI again. DEFAULT_MAX_REDIRECTS = 5 -try: - # Users can optionally provide a module that tells us where the CA_CERTS - # are located. - import ca_certs_locater - CA_CERTS = ca_certs_locater.get() -except ImportError: - # Default CA certificates file bundled with httplib2. - CA_CERTS = os.path.join( - os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt") +from . import certs +CA_CERTS = certs.where() # Which headers are hop-by-hop headers by default -HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade'] +HOP_BY_HOP = [ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailers", + "transfer-encoding", + "upgrade", +] + def _get_end2end_headers(response): hopbyhop = list(HOP_BY_HOP) - hopbyhop.extend([x.strip() for x in response.get('connection', '').split(',')]) + hopbyhop.extend([x.strip() for x in response.get("connection", "").split(",")]) return [header for header in response.keys() if header not in hopbyhop] + URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + def parse_uri(uri): """Parses a URI using the regex given in Appendix B of RFC 3986. @@ -212,6 +302,7 @@ def parse_uri(uri): groups = URI.match(uri).groups() return (groups[1], groups[3], groups[4], groups[6], groups[8]) + def urlnorm(uri): (scheme, authority, path, query, fragment) = parse_uri(uri) if not scheme or not authority: @@ -229,49 +320,62 @@ def urlnorm(uri): # Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/) -re_url_scheme = re.compile(r'^\w+://') -re_slash = re.compile(r'[?/:|]+') +re_url_scheme = re.compile(r"^\w+://") +re_unsafe = re.compile(r"[^\w\-_.()=!]+") + def safename(filename): """Return a filename suitable for the cache. - Strips dangerous and common characters to create a filename we can use to store the cache in. """ - - try: - if re_url_scheme.match(filename): - if isinstance(filename,str): - filename = filename.decode('utf-8') - filename = filename.encode('idna') - else: - filename = filename.encode('idna') - except UnicodeError: - pass - if isinstance(filename,unicode): - filename=filename.encode('utf-8') - filemd5 = _md5(filename).hexdigest() + if isinstance(filename, str): + filename_bytes = filename + filename = filename.decode("utf-8") + else: + filename_bytes = filename.encode("utf-8") + filemd5 = _md5(filename_bytes).hexdigest() filename = re_url_scheme.sub("", filename) - filename = re_slash.sub(",", filename) + filename = re_unsafe.sub("", filename) + + # limit length of filename (vital for Windows) + # https://github.com/httplib2/httplib2/pull/74 + # C:\Users\ \AppData\Local\Temp\ , + # 9 chars + max 104 chars + 20 chars + x + 1 + 32 = max 259 chars + # Thus max safe filename x = 93 chars. Let it be 90 to make a round sum: + filename = filename[:90] - # limit length of filename - if len(filename)>200: - filename=filename[:200] return ",".join((filename, filemd5)) -NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+') + +NORMALIZE_SPACE = re.compile(r"(?:\r\n)?[ \t]+") + + def _normalize_headers(headers): - return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip()) for (key, value) in headers.iteritems()]) + return dict( + [ + (key.lower(), NORMALIZE_SPACE.sub(value, " ").strip()) + for (key, value) in headers.iteritems() + ] + ) + def _parse_cache_control(headers): retval = {} - if headers.has_key('cache-control'): - parts = headers['cache-control'].split(',') - parts_with_args = [tuple([x.strip().lower() for x in part.split("=", 1)]) for part in parts if -1 != part.find("=")] - parts_wo_args = [(name.strip().lower(), 1) for name in parts if -1 == name.find("=")] + if "cache-control" in headers: + parts = headers["cache-control"].split(",") + parts_with_args = [ + tuple([x.strip().lower() for x in part.split("=", 1)]) + for part in parts + if -1 != part.find("=") + ] + parts_wo_args = [ + (name.strip().lower(), 1) for name in parts if -1 == name.find("=") + ] retval = dict(parts_with_args + parts_wo_args) return retval + # Whether to use a strict mode to parse WWW-Authenticate headers # Might lead to bad results in case of ill-formed header value, # so disabled by default, falling back to relaxed parsing. @@ -283,22 +387,30 @@ def _parse_cache_control(headers): # "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?" matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space # Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both: # \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"? -WWW_AUTH_STRICT = re.compile(r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$") -WWW_AUTH_RELAXED = re.compile(r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(?@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$" +) +WWW_AUTH_RELAXED = re.compile( + r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(? 0: + if service == "xapi" and request_uri.find("calendar") > 0: service = "cl" # No point in guessing Base or Spreadsheet - #elif request_uri.find("spreadsheets") > 0: + # elif request_uri.find("spreadsheets") > 0: # service = "wise" - auth = dict(Email=credentials[0], Passwd=credentials[1], service=service, source=headers['user-agent']) - resp, content = self.http.request("https://www.google.com/accounts/ClientLogin", method="POST", body=urlencode(auth), headers={'Content-Type': 'application/x-www-form-urlencoded'}) - lines = content.split('\n') + auth = dict( + Email=credentials[0], + Passwd=credentials[1], + service=service, + source=headers["user-agent"], + ) + resp, content = self.http.request( + "https://www.google.com/accounts/ClientLogin", + method="POST", + body=urlencode(auth), + headers={"Content-Type": "application/x-www-form-urlencoded"}, + ) + lines = content.split("\n") d = dict([tuple(line.split("=", 1)) for line in lines if line]) if resp.status == 403: self.Auth = "" else: - self.Auth = d['Auth'] + self.Auth = d["Auth"] def request(self, method, request_uri, headers, content): """Modify the request headers to add the appropriate Authorization header.""" - headers['authorization'] = 'GoogleLogin Auth=' + self.Auth + headers["authorization"] = "GoogleLogin Auth=" + self.Auth AUTH_SCHEME_CLASSES = { @@ -683,17 +916,21 @@ def request(self, method, request_uri, headers, content): "wsse": WsseAuthentication, "digest": DigestAuthentication, "hmacdigest": HmacDigestAuthentication, - "googlelogin": GoogleLoginAuthentication + "googlelogin": GoogleLoginAuthentication, } AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"] + class FileCache(object): """Uses a local directory as a store for cached files. Not really safe to use if multiple threads or processes are going to be running on the same cache. """ - def __init__(self, cache, safe=safename): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior + + def __init__( + self, cache, safe=safename + ): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior self.cache = cache self.safe = safe if not os.path.exists(cache): @@ -721,6 +958,7 @@ def delete(self, key): if os.path.exists(cacheFullPath): os.remove(cacheFullPath) + class Credentials(object): def __init__(self): self.credentials = [] @@ -736,40 +974,49 @@ def iter(self, domain): if cdomain == "" or domain == cdomain: yield (name, password) + class KeyCerts(Credentials): """Identical to Credentials except that name/password are mapped to key/cert.""" + pass + class AllHosts(object): pass + class ProxyInfo(object): """Collect information required to use a proxy.""" - bypass_hosts = () - def __init__(self, proxy_type, proxy_host, proxy_port, - proxy_rdns=True, proxy_user=None, proxy_pass=None): - """ - Args: - proxy_type: The type of proxy server. This must be set to one of - socks.PROXY_TYPE_XXX constants. For example: + bypass_hosts = () - p = ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, - proxy_host='localhost', proxy_port=8000) + def __init__( + self, + proxy_type, + proxy_host, + proxy_port, + proxy_rdns=True, + proxy_user=None, + proxy_pass=None, + proxy_headers=None, + ): + """Args: + proxy_type: The type of proxy server. This must be set to one of + socks.PROXY_TYPE_XXX constants. For example: p = + ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, proxy_host='localhost', + proxy_port=8000) proxy_host: The hostname or IP address of the proxy server. - proxy_port: The port that the proxy server is running on. - proxy_rdns: If True (default), DNS queries will not be performed locally, and instead, handed to the proxy to resolve. This is useful - if the network does not allow resolution of non-local names. In + if the network does not allow resolution of non-local names. In httplib2 0.9 and earlier, this defaulted to False. - proxy_user: The username used to authenticate with the proxy server. - proxy_pass: The password used to authenticate with the proxy server. + proxy_headers: Additional or modified headers for the proxy connect + request. """ self.proxy_type = proxy_type self.proxy_host = proxy_host @@ -777,10 +1024,18 @@ def __init__(self, proxy_type, proxy_host, proxy_port, self.proxy_rdns = proxy_rdns self.proxy_user = proxy_user self.proxy_pass = proxy_pass + self.proxy_headers = proxy_headers def astuple(self): - return (self.proxy_type, self.proxy_host, self.proxy_port, - self.proxy_rdns, self.proxy_user, self.proxy_pass) + return ( + self.proxy_type, + self.proxy_host, + self.proxy_port, + self.proxy_rdns, + self.proxy_user, + self.proxy_pass, + self.proxy_headers, + ) def isgood(self): return (self.proxy_host != None) and (self.proxy_port != None) @@ -793,56 +1048,54 @@ def bypass_host(self, hostname): if self.bypass_hosts is AllHosts: return True - bypass = False - for domain in self.bypass_hosts: - if hostname.endswith(domain): - bypass = True + hostname = "." + hostname.lstrip(".") + for skip_name in self.bypass_hosts: + # *.suffix + if skip_name.startswith(".") and hostname.endswith(skip_name): + return True + # exact match + if hostname == "." + skip_name: + return True + return False - return bypass + def __repr__(self): + return ( + "" + ).format(p=self) -def proxy_info_from_environment(method='http'): - """ - Read proxy info from the environment variables. +def proxy_info_from_environment(method="http"): + """Read proxy info from the environment variables. """ - if method not in ['http', 'https']: + if method not in ["http", "https"]: return - env_var = method + '_proxy' + env_var = method + "_proxy" url = os.environ.get(env_var, os.environ.get(env_var.upper())) if not url: return - pi = proxy_info_from_url(url, method) + return proxy_info_from_url(url, method, None) - no_proxy = os.environ.get('no_proxy', os.environ.get('NO_PROXY', '')) - bypass_hosts = [] - if no_proxy: - bypass_hosts = no_proxy.split(',') - # special case, no_proxy=* means all hosts bypassed - if no_proxy == '*': - bypass_hosts = AllHosts - pi.bypass_hosts = bypass_hosts - return pi - -def proxy_info_from_url(url, method='http'): - """ - Construct a ProxyInfo from a URL (such as http_proxy env var) +def proxy_info_from_url(url, method="http", noproxy=None): + """Construct a ProxyInfo from a URL (such as http_proxy env var) """ url = urlparse.urlparse(url) username = None password = None port = None - if '@' in url[1]: - ident, host_port = url[1].split('@', 1) - if ':' in ident: - username, password = ident.split(':', 1) + if "@" in url[1]: + ident, host_port = url[1].split("@", 1) + if ":" in ident: + username, password = ident.split(":", 1) else: password = ident else: host_port = url[1] - if ':' in host_port: - host, port = host_port.split(':', 1) + if ":" in host_port: + host, port = host_port.split(":", 1) else: host = host_port @@ -851,19 +1104,33 @@ def proxy_info_from_url(url, method='http'): else: port = dict(https=443, http=80)[method] - proxy_type = 3 # socks.PROXY_TYPE_HTTP - return ProxyInfo( - proxy_type = proxy_type, - proxy_host = host, - proxy_port = port, - proxy_user = username or None, - proxy_pass = password or None, + proxy_type = 3 # socks.PROXY_TYPE_HTTP + pi = ProxyInfo( + proxy_type=proxy_type, + proxy_host=host, + proxy_port=port, + proxy_user=username or None, + proxy_pass=password or None, + proxy_headers=None, ) + bypass_hosts = [] + # If not given an explicit noproxy value, respect values in env vars. + if noproxy is None: + noproxy = os.environ.get("no_proxy", os.environ.get("NO_PROXY", "")) + # Special case: A single '*' character means all hosts should be bypassed. + if noproxy == "*": + bypass_hosts = AllHosts + elif noproxy.strip(): + bypass_hosts = noproxy.split(",") + bypass_hosts = filter(bool, bypass_hosts) # To exclude empty string. + + pi.bypass_hosts = bypass_hosts + return pi + class HTTPConnectionWithTimeout(httplib.HTTPConnection): - """ - HTTPConnection subclass that supports timeouts + """HTTPConnection subclass that supports timeouts All timeouts are in seconds. If None is passed for timeout then Python's default timeout for sockets will be used. See for example @@ -881,11 +1148,14 @@ def connect(self): # Mostly verbatim from httplib.py. if self.proxy_info and socks is None: raise ProxiesUnavailableError( - 'Proxy support missing but proxy use was requested!') + "Proxy support missing but proxy use was requested!" + ) msg = "getaddrinfo returns an empty list" if self.proxy_info and self.proxy_info.isgood(): use_proxy = True - proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple() + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( + self.proxy_info.astuple() + ) host = proxy_host port = proxy_port @@ -900,7 +1170,15 @@ def connect(self): try: if use_proxy: self.sock = socks.socksocket(af, socktype, proto) - self.sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass) + self.sock.setproxy( + proxy_type, + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) else: self.sock = socket.socket(af, socktype, proto) self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) @@ -909,46 +1187,83 @@ def connect(self): self.sock.settimeout(self.timeout) # End of difference from httplib. if self.debuglevel > 0: - print "connect: (%s, %s) ************" % (self.host, self.port) + print("connect: (%s, %s) ************" % (self.host, self.port)) if use_proxy: - print "proxy: %s ************" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) - - self.sock.connect((self.host, self.port) + sa[2:]) - except socket.error, msg: + print( + "proxy: %s ************" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + if use_proxy: + self.sock.connect((self.host, self.port) + sa[2:]) + else: + self.sock.connect(sa) + except socket.error as msg: if self.debuglevel > 0: - print "connect fail: (%s, %s)" % (self.host, self.port) + print("connect fail: (%s, %s)" % (self.host, self.port)) if use_proxy: - print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) + print( + "proxy: %s" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) if self.sock: self.sock.close() self.sock = None continue break if not self.sock: - raise socket.error, msg + raise socket.error(msg) + class HTTPSConnectionWithTimeout(httplib.HTTPSConnection): - """ - This class allows communication via SSL. + """This class allows communication via SSL. All timeouts are in seconds. If None is passed for timeout then Python's default timeout for sockets will be used. See for example the docs of socket.setdefaulttimeout(): http://docs.python.org/library/socket.html#socket.setdefaulttimeout """ - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=None, proxy_info=None, - ca_certs=None, disable_ssl_certificate_validation=False): - httplib.HTTPSConnection.__init__(self, host, port=port, - key_file=key_file, - cert_file=cert_file, strict=strict) + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + strict=None, + timeout=None, + proxy_info=None, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): + httplib.HTTPSConnection.__init__( + self, host, port=port, key_file=key_file, cert_file=cert_file, strict=strict + ) self.timeout = timeout self.proxy_info = proxy_info if ca_certs is None: ca_certs = CA_CERTS self.ca_certs = ca_certs - self.disable_ssl_certificate_validation = \ - disable_ssl_certificate_validation + self.disable_ssl_certificate_validation = disable_ssl_certificate_validation + self.ssl_version = ssl_version # The following two methods were adapted from https_wrapper.py, released # with the Google Appengine SDK at @@ -978,12 +1293,10 @@ def _GetValidHostsForCert(self, cert): Returns: list: A list of valid host globs. """ - if 'subjectAltName' in cert: - return [x[1] for x in cert['subjectAltName'] - if x[0].lower() == 'dns'] + if "subjectAltName" in cert: + return [x[1] for x in cert["subjectAltName"] if x[0].lower() == "dns"] else: - return [x[0][1] for x in cert['subject'] - if x[0][0].lower() == 'commonname'] + return [x[0][1] for x in cert["subject"] if x[0][0].lower() == "commonname"] def _ValidateCertificateHostname(self, cert, hostname): """Validates that a given hostname is valid for an SSL certificate. @@ -996,8 +1309,8 @@ def _ValidateCertificateHostname(self, cert, hostname): """ hosts = self._GetValidHostsForCert(cert) for host in hosts: - host_re = host.replace('.', '\.').replace('*', '[^.]*') - if re.search('^%s$' % (host_re,), hostname, re.I): + host_re = host.replace(".", "\.").replace("*", "[^.]*") + if re.search("^%s$" % (host_re,), hostname, re.I): return True return False @@ -1007,7 +1320,9 @@ def connect(self): msg = "getaddrinfo returns an empty list" if self.proxy_info and self.proxy_info.isgood(): use_proxy = True - proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple() + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( + self.proxy_info.astuple() + ) host = proxy_host port = proxy_port @@ -1023,29 +1338,66 @@ def connect(self): if use_proxy: sock = socks.socksocket(family, socktype, proto) - sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass) + sock.setproxy( + proxy_type, + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) else: sock = socket.socket(family, socktype, proto) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) if has_timeout(self.timeout): sock.settimeout(self.timeout) - sock.connect((self.host, self.port)) - self.sock =_ssl_wrap_socket( - sock, self.key_file, self.cert_file, - self.disable_ssl_certificate_validation, self.ca_certs) + + if use_proxy: + sock.connect((self.host, self.port) + sockaddr[:2]) + else: + sock.connect(sockaddr) + self.sock = _ssl_wrap_socket( + sock, + self.key_file, + self.cert_file, + self.disable_ssl_certificate_validation, + self.ca_certs, + self.ssl_version, + self.host, + ) if self.debuglevel > 0: - print "connect: (%s, %s)" % (self.host, self.port) + print("connect: (%s, %s)" % (self.host, self.port)) if use_proxy: - print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) + print( + "proxy: %s" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) if not self.disable_ssl_certificate_validation: cert = self.sock.getpeercert() - hostname = self.host.split(':', 0)[0] + hostname = self.host.split(":", 0)[0] if not self._ValidateCertificateHostname(cert, hostname): raise CertificateHostnameMismatch( - 'Server presented certificate that does not match ' - 'host %s: %s' % (hostname, cert), hostname, cert) - except ssl_SSLError, e: + "Server presented certificate that does not match " + "host %s: %s" % (hostname, cert), + hostname, + cert, + ) + except ( + ssl_SSLError, + ssl_CertificateError, + CertificateHostnameMismatch, + ) as e: if sock: sock.close() if self.sock: @@ -1055,87 +1407,153 @@ def connect(self): # to get at more detailed error information, in particular # whether the error is due to certificate validation or # something else (such as SSL protocol mismatch). - if e.errno == ssl.SSL_ERROR_SSL: + if getattr(e, "errno", None) == ssl.SSL_ERROR_SSL: raise SSLHandshakeError(e) else: raise except (socket.timeout, socket.gaierror): raise - except socket.error, msg: + except socket.error as msg: if self.debuglevel > 0: - print "connect fail: (%s, %s)" % (self.host, self.port) + print("connect fail: (%s, %s)" % (self.host, self.port)) if use_proxy: - print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)) + print( + "proxy: %s" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) if self.sock: self.sock.close() self.sock = None continue break if not self.sock: - raise socket.error, msg + raise socket.error(msg) + SCHEME_TO_CONNECTION = { - 'http': HTTPConnectionWithTimeout, - 'https': HTTPSConnectionWithTimeout + "http": HTTPConnectionWithTimeout, + "https": HTTPSConnectionWithTimeout, } -# Use a different connection object for Google App Engine + +def _new_fixed_fetch(validate_certificate): + + def fixed_fetch( + url, + payload=None, + method="GET", + headers={}, + allow_truncated=False, + follow_redirects=True, + deadline=None, + ): + return fetch( + url, + payload=payload, + method=method, + headers=headers, + allow_truncated=allow_truncated, + follow_redirects=follow_redirects, + deadline=deadline, + validate_certificate=validate_certificate, + ) + + return fixed_fetch + + +class AppEngineHttpConnection(httplib.HTTPConnection): + """Use httplib on App Engine, but compensate for its weirdness. + + The parameters key_file, cert_file, proxy_info, ca_certs, + disable_ssl_certificate_validation, and ssl_version are all dropped on + the ground. + """ + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + strict=None, + timeout=None, + proxy_info=None, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): + httplib.HTTPConnection.__init__( + self, host, port=port, strict=strict, timeout=timeout + ) + + +class AppEngineHttpsConnection(httplib.HTTPSConnection): + """Same as AppEngineHttpConnection, but for HTTPS URIs. + + The parameters proxy_info, ca_certs, disable_ssl_certificate_validation, + and ssl_version are all dropped on the ground. + """ + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + strict=None, + timeout=None, + proxy_info=None, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): + httplib.HTTPSConnection.__init__( + self, + host, + port=port, + key_file=key_file, + cert_file=cert_file, + strict=strict, + timeout=timeout, + ) + self._fetch = _new_fixed_fetch(not disable_ssl_certificate_validation) + + +# Use a different connection object for Google App Engine Standard Environment. +def is_gae_instance(): + server_software = os.environ.get('SERVER_SOFTWARE', '') + if (server_software.startswith('Google App Engine/') or + server_software.startswith('Development/') or + server_software.startswith('testutil/')): + return True + return False + + try: - try: - from google.appengine.api import apiproxy_stub_map - if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None: - raise ImportError # Bail out; we're not actually running on App Engine. - from google.appengine.api.urlfetch import fetch - from google.appengine.api.urlfetch import InvalidURLError - except (ImportError, AttributeError): - from google3.apphosting.api import apiproxy_stub_map - if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None: - raise ImportError # Bail out; we're not actually running on App Engine. - from google3.apphosting.api.urlfetch import fetch - from google3.apphosting.api.urlfetch import InvalidURLError - - def _new_fixed_fetch(validate_certificate): - def fixed_fetch(url, payload=None, method="GET", headers={}, - allow_truncated=False, follow_redirects=True, - deadline=None): - if deadline is None: - deadline = socket.getdefaulttimeout() or 5 - return fetch(url, payload=payload, method=method, headers=headers, - allow_truncated=allow_truncated, - follow_redirects=follow_redirects, deadline=deadline, - validate_certificate=validate_certificate) - return fixed_fetch - - class AppEngineHttpConnection(httplib.HTTPConnection): - """Use httplib on App Engine, but compensate for its weirdness. - - The parameters key_file, cert_file, proxy_info, ca_certs, and - disable_ssl_certificate_validation are all dropped on the ground. - """ - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=None, proxy_info=None, ca_certs=None, - disable_ssl_certificate_validation=False): - httplib.HTTPConnection.__init__(self, host, port=port, - strict=strict, timeout=timeout) - - class AppEngineHttpsConnection(httplib.HTTPSConnection): - """Same as AppEngineHttpConnection, but for HTTPS URIs.""" - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=None, proxy_info=None, ca_certs=None, - disable_ssl_certificate_validation=False): - httplib.HTTPSConnection.__init__(self, host, port=port, - key_file=key_file, - cert_file=cert_file, strict=strict, - timeout=timeout) - self._fetch = _new_fixed_fetch( - not disable_ssl_certificate_validation) + if not is_gae_instance(): + raise NotRunningAppEngineEnvironment() + + from google.appengine.api import apiproxy_stub_map + if apiproxy_stub_map.apiproxy.GetStub("urlfetch") is None: + raise ImportError + + from google.appengine.api.urlfetch import fetch # Update the connection classes to use the Googel App Engine specific ones. SCHEME_TO_CONNECTION = { - 'http': AppEngineHttpConnection, - 'https': AppEngineHttpsConnection + "http": AppEngineHttpConnection, + "https": AppEngineHttpsConnection, } -except (ImportError, AttributeError): +except (ImportError, NotRunningAppEngineEnvironment): pass @@ -1153,9 +1571,16 @@ class Http(object): and more. """ - def __init__(self, cache=None, timeout=None, - proxy_info=proxy_info_from_environment, - ca_certs=None, disable_ssl_certificate_validation=False): + + def __init__( + self, + cache=None, + timeout=None, + proxy_info=proxy_info_from_environment, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): """If 'cache' is a string then it is used as a directory name for a disk cache. Otherwise it must be an object that supports the same interface as FileCache. @@ -1178,11 +1603,13 @@ def __init__(self, cache=None, timeout=None, If disable_ssl_certificate_validation is true, SSL cert validation will not be performed. + + By default, ssl.PROTOCOL_SSLv23 will be used for the ssl version. """ self.proxy_info = proxy_info self.ca_certs = ca_certs - self.disable_ssl_certificate_validation = \ - disable_ssl_certificate_validation + self.disable_ssl_certificate_validation = disable_ssl_certificate_validation + self.ssl_version = ssl_version # Map domain name to an httplib connection self.connections = {} @@ -1226,10 +1653,10 @@ def __getstate__(self): state_dict = copy.copy(self.__dict__) # In case request is augmented by some foreign object such as # credentials which handle auth - if 'request' in state_dict: - del state_dict['request'] - if 'connections' in state_dict: - del state_dict['connections'] + if "request" in state_dict: + del state_dict["request"] + if "connections" in state_dict: + del state_dict["connections"] return state_dict def __setstate__(self, state): @@ -1240,11 +1667,13 @@ def _auth_from_challenge(self, host, request_uri, headers, response, content): """A generator that creates Authorization objects that can be applied to requests. """ - challenges = _parse_www_authenticate(response, 'www-authenticate') + challenges = _parse_www_authenticate(response, "www-authenticate") for cred in self.credentials.iter(host): for scheme in AUTH_SCHEME_ORDER: - if challenges.has_key(scheme): - yield AUTH_SCHEME_CLASSES[scheme](cred, host, request_uri, headers, response, content, self) + if scheme in challenges: + yield AUTH_SCHEME_CLASSES[scheme]( + cred, host, request_uri, headers, response, content, self + ) def add_credentials(self, name, password, domain=""): """Add a name and password that will be used @@ -1268,7 +1697,7 @@ def _conn_request(self, conn, request_uri, method, body, headers): while i < RETRIES: i += 1 try: - if hasattr(conn, 'sock') and conn.sock is None: + if hasattr(conn, "sock") and conn.sock is None: conn.connect() conn.request(method, request_uri, body, headers) except socket.timeout: @@ -1279,26 +1708,28 @@ def _conn_request(self, conn, request_uri, method, body, headers): except ssl_SSLError: conn.close() raise - except socket.error, e: + except socket.error as e: err = 0 - if hasattr(e, 'args'): - err = getattr(e, 'args')[0] + if hasattr(e, "args"): + err = getattr(e, "args")[0] else: err = e.errno - if err == errno.ECONNREFUSED: # Connection refused + if err == errno.ECONNREFUSED: # Connection refused raise + if err in (errno.ENETUNREACH, errno.EADDRNOTAVAIL) and i < RETRIES: + continue # retry on potentially transient socket errors except httplib.HTTPException: # Just because the server closed the connection doesn't apparently mean # that the server didn't send a response. - if hasattr(conn, 'sock') and conn.sock is None: - if i < RETRIES-1: + if hasattr(conn, "sock") and conn.sock is None: + if i < RETRIES - 1: conn.close() conn.connect() continue else: conn.close() raise - if i < RETRIES-1: + if i < RETRIES - 1: conn.close() conn.connect() continue @@ -1318,7 +1749,7 @@ def _conn_request(self, conn, request_uri, method, body, headers): conn.close() raise except (socket.error, httplib.HTTPException): - if i < RETRIES-1: + if i < RETRIES - 1: conn.close() conn.connect() continue @@ -1337,77 +1768,121 @@ def _conn_request(self, conn, request_uri, method, body, headers): break return (response, content) - - def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, redirections, cachekey): + def _request( + self, + conn, + host, + absolute_uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ): """Do the actual request using the connection object and also follow one level of redirects if necessary""" - auths = [(auth.depth(request_uri), auth) for auth in self.authorizations if auth.inscope(host, request_uri)] + auths = [ + (auth.depth(request_uri), auth) + for auth in self.authorizations + if auth.inscope(host, request_uri) + ] auth = auths and sorted(auths)[0][1] or None if auth: auth.request(method, request_uri, headers, body) - (response, content) = self._conn_request(conn, request_uri, method, body, headers) + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) if auth: if auth.response(response, body): auth.request(method, request_uri, headers, body) - (response, content) = self._conn_request(conn, request_uri, method, body, headers ) + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) response._stale_digest = 1 if response.status == 401: - for authorization in self._auth_from_challenge(host, request_uri, headers, response, content): + for authorization in self._auth_from_challenge( + host, request_uri, headers, response, content + ): authorization.request(method, request_uri, headers, body) - (response, content) = self._conn_request(conn, request_uri, method, body, headers, ) + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) if response.status != 401: self.authorizations.append(authorization) authorization.response(response, body) break - if (self.follow_all_redirects or (method in ["GET", "HEAD"]) or response.status == 303): + if ( + self.follow_all_redirects + or (method in ["GET", "HEAD"]) + or response.status == 303 + ): if self.follow_redirects and response.status in [300, 301, 302, 303, 307]: # Pick out the location header and basically start from the beginning # remembering first to strip the ETag header and decrement our 'depth' if redirections: - if not response.has_key('location') and response.status != 300: - raise RedirectMissingLocation( _("Redirected but the response is missing a Location: header."), response, content) + if "location" not in response and response.status != 300: + raise RedirectMissingLocation( + _( + "Redirected but the response is missing a Location: header." + ), + response, + content, + ) # Fix-up relative redirects (which violate an RFC 2616 MUST) - if response.has_key('location'): - location = response['location'] + if "location" in response: + location = response["location"] (scheme, authority, path, query, fragment) = parse_uri(location) if authority == None: - response['location'] = urlparse.urljoin(absolute_uri, location) + response["location"] = urlparse.urljoin( + absolute_uri, location + ) if response.status == 301 and method in ["GET", "HEAD"]: - response['-x-permanent-redirect-url'] = response['location'] - if not response.has_key('content-location'): - response['content-location'] = absolute_uri + response["-x-permanent-redirect-url"] = response["location"] + if "content-location" not in response: + response["content-location"] = absolute_uri _updateCache(headers, response, content, self.cache, cachekey) - if headers.has_key('if-none-match'): - del headers['if-none-match'] - if headers.has_key('if-modified-since'): - del headers['if-modified-since'] - if 'authorization' in headers and not self.forward_authorization_headers: - del headers['authorization'] - if response.has_key('location'): - location = response['location'] + if "if-none-match" in headers: + del headers["if-none-match"] + if "if-modified-since" in headers: + del headers["if-modified-since"] + if ( + "authorization" in headers + and not self.forward_authorization_headers + ): + del headers["authorization"] + if "location" in response: + location = response["location"] old_response = copy.deepcopy(response) - if not old_response.has_key('content-location'): - old_response['content-location'] = absolute_uri + if "content-location" not in old_response: + old_response["content-location"] = absolute_uri redirect_method = method if response.status in [302, 303]: redirect_method = "GET" body = None (response, content) = self.request( - location, method=redirect_method, - body=body, headers=headers, - redirections=redirections - 1) + location, + method=redirect_method, + body=body, + headers=headers, + redirections=redirections - 1, + ) response.previous = old_response else: - raise RedirectLimit("Redirected more times than rediection_limit allows.", response, content) + raise RedirectLimit( + "Redirected more times than rediection_limit allows.", + response, + content, + ) elif response.status in [200, 203] and method in ["GET", "HEAD"]: # Don't cache 206's since we aren't going to handle byte range requests - if not response.has_key('content-location'): - response['content-location'] = absolute_uri + if "content-location" not in response: + response["content-location"] = absolute_uri _updateCache(headers, response, content, self.cache, cachekey) return (response, content) @@ -1415,12 +1890,19 @@ def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, def _normalize_headers(self, headers): return _normalize_headers(headers) -# Need to catch and rebrand some exceptions -# Then need to optionally turn all exceptions into status codes -# including all socket.* and httplib.* exceptions. - - - def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAULT_MAX_REDIRECTS, connection_type=None): + # Need to catch and rebrand some exceptions + # Then need to optionally turn all exceptions into status codes + # including all socket.* and httplib.* exceptions. + + def request( + self, + uri, + method="GET", + body=None, + headers=None, + redirections=DEFAULT_MAX_REDIRECTS, + connection_type=None, + ): """ Performs a single HTTP request. The 'uri' is the URI of the HTTP resource and can begin with either @@ -1448,55 +1930,55 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU else: headers = self._normalize_headers(headers) - if not headers.has_key('user-agent'): - headers['user-agent'] = "Python-httplib2/%s (gzip)" % __version__ + if "user-agent" not in headers: + headers["user-agent"] = "Python-httplib2/%s (gzip)" % __version__ uri = iri2uri(uri) (scheme, authority, request_uri, defrag_uri) = urlnorm(uri) - domain_port = authority.split(":")[0:2] - if len(domain_port) == 2 and domain_port[1] == '443' and scheme == 'http': - scheme = 'https' - authority = domain_port[0] proxy_info = self._get_proxy_info(scheme, authority) - conn_key = scheme+":"+authority - if conn_key in self.connections: - conn = self.connections[conn_key] - else: + conn_key = scheme + ":" + authority + conn = self.connections.get(conn_key) + if conn is None: if not connection_type: connection_type = SCHEME_TO_CONNECTION[scheme] certs = list(self.certificates.iter(authority)) - if scheme == 'https': + if scheme == "https": if certs: conn = self.connections[conn_key] = connection_type( - authority, key_file=certs[0][0], - cert_file=certs[0][1], timeout=self.timeout, - proxy_info=proxy_info, - ca_certs=self.ca_certs, - disable_ssl_certificate_validation= - self.disable_ssl_certificate_validation) + authority, + key_file=certs[0][0], + cert_file=certs[0][1], + timeout=self.timeout, + proxy_info=proxy_info, + ca_certs=self.ca_certs, + disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, + ssl_version=self.ssl_version, + ) else: conn = self.connections[conn_key] = connection_type( - authority, timeout=self.timeout, - proxy_info=proxy_info, - ca_certs=self.ca_certs, - disable_ssl_certificate_validation= - self.disable_ssl_certificate_validation) + authority, + timeout=self.timeout, + proxy_info=proxy_info, + ca_certs=self.ca_certs, + disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, + ssl_version=self.ssl_version, + ) else: conn = self.connections[conn_key] = connection_type( - authority, timeout=self.timeout, - proxy_info=proxy_info) + authority, timeout=self.timeout, proxy_info=proxy_info + ) conn.set_debuglevel(debuglevel) - if 'range' not in headers and 'accept-encoding' not in headers: - headers['accept-encoding'] = 'gzip, deflate' + if "range" not in headers and "accept-encoding" not in headers: + headers["accept-encoding"] = "gzip, deflate" info = email.Message.Message() cached_value = None if self.cache: - cachekey = defrag_uri.encode('utf-8') + cachekey = defrag_uri.encode("utf-8") cached_value = self.cache.get(cachekey) if cached_value: # info = email.message_from_string(cached_value) @@ -1505,7 +1987,7 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU # to fix the non-existent bug not fixed in this # bug report: http://mail.python.org/pipermail/python-bugs-list/2005-September/030289.html try: - info, content = cached_value.split('\r\n\r\n', 1) + info, content = cached_value.split("\r\n\r\n", 1) feedparser = email.FeedParser.FeedParser() feedparser.feed(info) info = feedparser.close() @@ -1517,9 +1999,15 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU else: cachekey = None - if method in self.optimistic_concurrency_methods and self.cache and info.has_key('etag') and not self.ignore_etag and 'if-match' not in headers: + if ( + method in self.optimistic_concurrency_methods + and self.cache + and "etag" in info + and not self.ignore_etag + and "if-match" not in headers + ): # http://www.w3.org/1999/04/Editing/ - headers['if-match'] = info['etag'] + headers["if-match"] = info["etag"] if method not in ["GET", "HEAD"] and self.cache and cachekey: # RFC 2616 Section 13.10 @@ -1527,24 +2015,36 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU # Check the vary header in the cache to see if this request # matches what varies in the cache. - if method in ['GET', 'HEAD'] and 'vary' in info: - vary = info['vary'] - vary_headers = vary.lower().replace(' ', '').split(',') + if method in ["GET", "HEAD"] and "vary" in info: + vary = info["vary"] + vary_headers = vary.lower().replace(" ", "").split(",") for header in vary_headers: - key = '-varied-%s' % header + key = "-varied-%s" % header value = info[key] if headers.get(header, None) != value: cached_value = None break - if cached_value and method in ["GET", "HEAD"] and self.cache and 'range' not in headers: - if info.has_key('-x-permanent-redirect-url'): + if ( + cached_value + and method in ["GET", "HEAD"] + and self.cache + and "range" not in headers + ): + if "-x-permanent-redirect-url" in info: # Should cached permanent redirects be counted in our redirection count? For now, yes. if redirections <= 0: - raise RedirectLimit("Redirected more times than rediection_limit allows.", {}, "") + raise RedirectLimit( + "Redirected more times than rediection_limit allows.", + {}, + "", + ) (response, new_content) = self.request( - info['-x-permanent-redirect-url'], method='GET', - headers=headers, redirections=redirections - 1) + info["-x-permanent-redirect-url"], + method="GET", + headers=headers, + redirections=redirections - 1, + ) response.previous = Response(info) response.previous.fromcache = True else: @@ -1560,7 +2060,7 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU if entry_disposition == "FRESH": if not cached_value: - info['status'] = '504' + info["status"] = "504" content = "" response = Response(info) if cached_value: @@ -1568,14 +2068,28 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU return (response, content) if entry_disposition == "STALE": - if info.has_key('etag') and not self.ignore_etag and not 'if-none-match' in headers: - headers['if-none-match'] = info['etag'] - if info.has_key('last-modified') and not 'last-modified' in headers: - headers['if-modified-since'] = info['last-modified'] + if ( + "etag" in info + and not self.ignore_etag + and not "if-none-match" in headers + ): + headers["if-none-match"] = info["etag"] + if "last-modified" in info and not "last-modified" in headers: + headers["if-modified-since"] = info["last-modified"] elif entry_disposition == "TRANSPARENT": pass - (response, new_content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) + (response, new_content) = self._request( + conn, + authority, + uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ) if response.status == 304 and method == "GET": # Rewrite the cache entry with the new end-to-end headers @@ -1588,7 +2102,9 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU merged_response = Response(info) if hasattr(response, "_stale_digest"): merged_response._stale_digest = response._stale_digest - _updateCache(headers, merged_response, content, self.cache, cachekey) + _updateCache( + headers, merged_response, content, self.cache, cachekey + ) response = merged_response response.status = 200 response.fromcache = True @@ -1600,13 +2116,23 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU content = new_content else: cc = _parse_cache_control(headers) - if cc.has_key('only-if-cached'): - info['status'] = '504' + if "only-if-cached" in cc: + info["status"] = "504" response = Response(info) content = "" else: - (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) - except Exception, e: + (response, content) = self._request( + conn, + authority, + uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ) + except Exception as e: if self.force_exception_to_status_code: if isinstance(e, HttpLib2ErrorWithResponse): response = e.response @@ -1615,24 +2141,27 @@ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAU response.reason = str(e) elif isinstance(e, socket.timeout): content = "Request Timeout" - response = Response({ - "content-type": "text/plain", - "status": "408", - "content-length": len(content) - }) + response = Response( + { + "content-type": "text/plain", + "status": "408", + "content-length": len(content), + } + ) response.reason = "Request Timeout" else: content = str(e) - response = Response({ - "content-type": "text/plain", - "status": "400", - "content-length": len(content) - }) + response = Response( + { + "content-type": "text/plain", + "status": "400", + "content-length": len(content), + } + ) response.reason = "Bad Request" else: raise - return (response, content) def _get_proxy_info(self, scheme, authority): @@ -1644,8 +2173,7 @@ def _get_proxy_info(self, scheme, authority): if callable(proxy_info): proxy_info = proxy_info(scheme) - if (hasattr(proxy_info, 'applies_to') - and not proxy_info.applies_to(hostname)): + if hasattr(proxy_info, "applies_to") and not proxy_info.applies_to(hostname): proxy_info = None return proxy_info @@ -1655,13 +2183,14 @@ class Response(dict): """Is this response from our local cache""" fromcache = False + """HTTP protocol version used by server. - """HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1. """ + 10 for HTTP/1.0, 11 for HTTP/1.1. + """ version = 11 "Status code returned by server. " status = 200 - """Reason phrase returned by server.""" reason = "Ok" @@ -1674,22 +2203,21 @@ def __init__(self, info): for key, value in info.getheaders(): self[key.lower()] = value self.status = info.status - self['status'] = str(self.status) + self["status"] = str(self.status) self.reason = info.reason self.version = info.version elif isinstance(info, email.Message.Message): for key, value in info.items(): self[key.lower()] = value - self.status = int(self['status']) + self.status = int(self["status"]) else: for key, value in info.iteritems(): self[key.lower()] = value - self.status = int(self.get('status', self.status)) - self.reason = self.get('reason', self.reason) - + self.status = int(self.get("status", self.status)) + self.reason = self.get("reason", self.reason) def __getattr__(self, name): - if name == 'dict': + if name == "dict": return self else: - raise AttributeError, name + raise AttributeError(name) diff --git a/shotgun_api3/lib/httplib2/cacerts.txt b/shotgun_api3/lib/httplib2/cacerts.txt index 8603efdec..a2a9833de 100644 --- a/shotgun_api3/lib/httplib2/cacerts.txt +++ b/shotgun_api3/lib/httplib2/cacerts.txt @@ -1,7 +1,3 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - # Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. # Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. # Label: "GTE CyberTrust Global Root" @@ -106,28 +102,6 @@ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - # Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network # Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network # Label: "Verisign Class 3 Public Primary Certification Authority - G2" @@ -395,17 +369,17 @@ hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +# Serial: 946059622 +# MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc +# SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe +# SHA256 Fingerprint: d1:c3:39:ea:27:84:eb:87:0f:93:4f:c5:63:4e:4a:a9:ad:55:05:01:64:01:f2:64:65:d3:7a:57:46:63:35:9f -----BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp @@ -415,14 +389,15 @@ sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== -----END CERTIFICATE----- # Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust @@ -502,6 +477,33 @@ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- +# Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 +# Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 +# Label: "Equifax Secure eBusiness CA 2" +# Serial: 930140085 +# MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca +# SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc +# SHA256 Fingerprint: 2f:27:4e:48:ab:a4:ac:7b:76:59:33:10:17:75:50:6d:c3:0e:e3:8e:f6:ac:d5:c0:49:32:cf:e0:41:23:42:20 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- + # Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network # Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network # Label: "AddTrust Low-Value Services Root" @@ -667,35 +669,6 @@ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m 0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- -# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3 -# Subject: O=RSA Security Inc OU=RSA Security 2048 V3 -# Label: "RSA Security 2048 v3" -# Serial: 13297492616345471454730593562152402946 -# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e -# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42 -# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= ------END CERTIFICATE----- - # Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. # Subject: CN=GeoTrust Global CA O=GeoTrust Inc. # Label: "GeoTrust Global CA" @@ -902,63 +875,6 @@ Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. -# Subject: CN=Certum CA O=Unizeto Sp. z o.o. -# Label: "Certum Root CA" -# Serial: 65568 -# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 -# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 -# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - # Issuer: CN=AAA Certificate Services O=Comodo CA Limited # Subject: CN=AAA Certificate Services O=Comodo CA Limited # Label: "Comodo AAA Services root" @@ -1058,253 +974,6 @@ xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA" -# Serial: 10000010 -# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0 -# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04 -# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3 ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO -TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy -MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk -ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn -ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 -9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO -hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U -tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o -BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh -SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww -OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv -cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA -7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm -eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 -u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy -7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -# Issuer: O=TDC Internet OU=TDC Internet Root CA -# Subject: O=TDC Internet OU=TDC Internet Root CA -# Label: "TDC Internet Root CA" -# Serial: 986490188 -# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e -# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a -# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7 ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - # Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com # Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com # Label: "UTN DATACorp SGC Root CA" @@ -1373,201 +1042,6 @@ CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== -----END CERTIFICATE----- -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Notary (Class A) Root" -# Serial: 259 -# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7 -# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6 -# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67 ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - # Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Label: "XRamp Global CA Root" @@ -1601,6 +1075,38 @@ i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + # Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority # Label: "Starfield Class 2 CA" @@ -1685,88 +1191,6 @@ um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= -----END CERTIFICATE----- -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 1" -# Serial: 122348795730808398873664200247279986742 -# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9 -# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51 -# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - # Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com # Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com # Label: "DigiCert Assured ID Root CA" @@ -1858,243 +1282,6 @@ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Label: "TURKTRUST Certificate Services Provider Root 1" -# Serial: 1 -# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5 -# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9 -# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0 ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 -# Label: "TURKTRUST Certificate Services Provider Root 2" -# Serial: 1 -# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00 -# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7 -# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6 ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 -WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv -bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU -UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw -bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe -LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef -J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh -R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ -Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX -JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S -Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq -ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz -gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH -uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS -y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - # Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. # Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. # Label: "GeoTrust Primary Certification Authority" @@ -2193,66 +1380,6 @@ WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - # Issuer: CN=COMODO Certification Authority O=COMODO CA Limited # Subject: CN=COMODO Certification Authority O=COMODO CA Limited # Label: "COMODO Certification Authority" @@ -2317,42 +1444,6 @@ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- -# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Label: "WellsSecure Public Root Certificate Authority" -# Serial: 1 -# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36 -# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee -# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - # Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited # Label: "COMODO ECC Certification Authority" @@ -2377,225 +1468,6 @@ fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- -# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI -# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI -# Label: "IGC/A" -# Serial: 245102874772 -# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37 -# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c -# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32 ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Label: "Microsec e-Szigno Root CA" -# Serial: 272122594155480254301341951808045322001 -# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5 -# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d -# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0 ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw -cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy -b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z -ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 -NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN -TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p -Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u -uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ -LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA -vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 -Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx -62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB -AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw -LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP -BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB -AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov -MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 -ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT -AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh -ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo -AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa -AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln -bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p -Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP -PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv -Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB -EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu -w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj -cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV -HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI -VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS -BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS -b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS -8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds -ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl -7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR -hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ -MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. -# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. -# Label: "AC Ra\xC3\xADz Certic\xC3\xA1mara S.A." -# Serial: 38908203973182606954752843738508300 -# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6 -# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36 -# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx -CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp -ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa -QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw -NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft -ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu -QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG -qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL -fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ -Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 -Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ -54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b -MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j -ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej -YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt -A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF -rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ -pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB -lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy -YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 -7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs -YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 -xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc -unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ -Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp -ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 -gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 -jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ -XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD -W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ -RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r -MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk -BYn8eNZcLCZDqQ== ------END CERTIFICATE----- - # Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA # Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA # Label: "TC TrustCenter Class 2 CA II" @@ -2697,66 +1569,6 @@ ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ 2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=ComSign Secured CA O=ComSign -# Subject: CN=ComSign Secured CA O=ComSign -# Label: "ComSign Secured CA" -# Serial: 264725503855295744117309814499492384489 -# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5 -# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a -# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2 ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw -PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu -MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx -GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL -MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf -HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh -gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW -v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue -Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr -9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt -6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 -MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl -Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 -ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq -hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p -iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC -dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL -kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL -hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - # Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc # Subject: CN=Cybertrust Global Root O=Cybertrust, Inc # Label: "Cybertrust Global Root" @@ -2787,269 +1599,6 @@ A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" -# Serial: 17 -# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 -# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 -# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Label: "Buypass Class 2 CA 1" -# Serial: 1 -# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23 -# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc -# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38 ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 -ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX -l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB -HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B -5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 -WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP -gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ -DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu -BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs -h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk -LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 -# Label: "Buypass Class 3 CA 1" -# Serial: 2 -# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b -# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71 -# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24 ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg -isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z -NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI -+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R -hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ -mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP -Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s -EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 -mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC -e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow -dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. -# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. -# Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1" -# Serial: 5525761995591021570 -# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37 -# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58 -# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2 ------BEGIN CERTIFICATE----- -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 -QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=CNNIC ROOT O=CNNIC -# Subject: CN=CNNIC ROOT O=CNNIC -# Label: "CNNIC ROOT" -# Serial: 1228079105 -# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19 -# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f -# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7 ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD -TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 -MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF -Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh -IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 -dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO -V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC -GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN -v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB -AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB -Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO -76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK -OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH -ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi -yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL -buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj -2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= ------END CERTIFICATE----- - -# Issuer: O=Japanese Government OU=ApplicationCA -# Subject: O=Japanese Government OU=ApplicationCA -# Label: "ApplicationCA - Japanese Government" -# Serial: 49 -# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6 -# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74 -# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19 ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc -MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp -b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT -AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs -aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H -j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K -f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 -IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw -FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht -QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm -/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ -k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ -MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC -seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ -hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ -eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U -DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj -B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - # Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only # Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only # Label: "GeoTrust Primary Certification Authority - G3" @@ -3229,330 +1778,6 @@ kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- -# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Label: "NetLock Arany (Class Gold) Főtanúsítvány" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=CA Disig O=Disig a.s. -# Subject: CN=CA Disig O=Disig a.s. -# Label: "CA Disig" -# Serial: 1 -# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6 -# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41 -# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET -MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE -AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw -CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg -YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE -Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX -mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD -XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW -S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp -FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD -AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu -ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z -ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv -Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw -DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 -yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq -EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB -EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN -PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus -# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus -# Label: "Juur-SK" -# Serial: 999181308 -# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55 -# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89 -# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39 ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN -AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp -dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw -MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw -CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ -MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB -SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz -ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH -LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP -PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL -2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w -ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC -MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk -AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 -AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz -AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz -AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f -BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY -P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi -CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g -kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 -HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS -na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q -qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z -TbvGRNs2yyqcjg== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI -# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI -# Label: "ACEDICOM Root" -# Serial: 7029493972724711941 -# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 -# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 -# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. -# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. -# Label: "E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi" -# Serial: 91184789765598910059173000485363494069 -# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b -# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34 -# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98 ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp -Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp -a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx -MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg -R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU -MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT -L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H -5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC -90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 -c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE -VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP -qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S -/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj -/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X -KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Label: "GlobalSign Root CA - R3" @@ -3582,188 +1807,35 @@ Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH WD9f -----END CERTIFICATE----- -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +# Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Label: "TC TrustCenter Universal CA III" +# Serial: 2010889993983507346460533407902964 +# MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b +# SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87 +# SHA256 Fingerprint: 30:9b:4a:87:f6:ca:56:c9:31:69:aa:a9:9c:6d:98:88:54:d7:89:2b:d5:43:7e:2d:07:b2:9c:be:da:55:d3:5d -----BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy +MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl +ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm +BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF +5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv +DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v +zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT +yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj +dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh +MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI +4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz +dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY +aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G +DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH +LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== -----END CERTIFICATE----- # Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. @@ -3976,313 +2048,6 @@ aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== -----END CERTIFICATE----- -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Autorité Racine" -# Serial: 1 -# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a -# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 -# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk -BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 -Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl -cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 -aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY -F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N -8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe -rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K -/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu -7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC -28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 -lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E -nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB -0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 -5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj -WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN -jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s -ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM -OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q -619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn -2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj -o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v -nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG -5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq -pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb -dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 -BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Label: "Root CA Generalitat Valenciana" -# Serial: 994436456 -# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2 -# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46 -# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF -UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ -R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN -MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw -JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ -WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj -SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl -u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy -A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk -Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 -MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr -aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC -IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A -cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA -YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA -bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA -bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA -aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA -ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA -YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA -ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA -LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 -Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y -eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw -CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G -A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu -Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn -lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt -b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg -9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF -ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC -IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 -# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 -# Label: "A-Trust-nQual-03" -# Serial: 93214 -# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53 -# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2 -# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB -VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp -bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R -dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw -MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy -dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 -ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM -EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj -lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ -znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH -2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 -k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs -2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD -VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG -KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ -8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R -FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE -DNuxUCAKGkq6ahq97BvIxYSazQ== ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - # Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing # Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing # Label: "StartCom Certification Authority" @@ -4373,762 +2138,59 @@ hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Label: "TURKTRUST Certificate Services Provider Root 2007" -# Serial: 1 -# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 -# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 -# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx -OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry -b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC -VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE -sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F -ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY -KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG -+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG -HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P -IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M -733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk -Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW -AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 -mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa -XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ -qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica -# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT -# Label: "PSCProcert" -# Serial: 11 -# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec -# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 -# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s -YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz -dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 -aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh -IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ -KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw -MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy -b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx -KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG -A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u -aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 -7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 -BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G -ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 -JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 -PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 -0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ -6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m -v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 -K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev -bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw -MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w -MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD -gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 -b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh -bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 -cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp -ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg -ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq -hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD -AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w -MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag -RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t -UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl -cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG -AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN -AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS -1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB -3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv -Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh -HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm -pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz -sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE -qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb -mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 -opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H -YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Label: "China Internet Network Information Center EV Certificates Root" -# Serial: 1218379777 -# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15 -# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e -# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7 ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC -Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g -Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 -aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa -Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg -SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo -aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp -ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z -7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// -DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx -zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 -hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs -4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u -gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY -NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 -j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG -52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB -echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI -zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy -wy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 2" -# Serial: 40698052477090394928831521023204026294 -# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19 -# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec -# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41 ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr -jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r -0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f -2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP -ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF -y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA -tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL -6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 -uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL -acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh -k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q -VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O -BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh -b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R -fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv -/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI -REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx -srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv -aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT -woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n -Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W -t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N -8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 -9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 -wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root EV CA 2" -# Serial: 322973295377129385374608406479535262296 -# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec -# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b -# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d ------BEGIN CERTIFICATE----- -MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw -ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp -dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 -IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD -VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy -dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg -MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx -UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD -1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH -oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR -HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ -5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv -idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL -OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC -NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f -46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB -UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth -7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G -A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED -MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB -bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x -XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T -PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 -Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 -WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL -Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm -7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S -nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN -vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB -WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI -fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb -I+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce +# Issuer: O=Digital Signature Trust Co., CN=DST Root CA X3 +# Subject: O=Digital Signature Trust Co., CN=DST Root CA X3 +# Label: "IdenTrust DST Root CA X3" +# Serial: 44AFB080D6A327BA893039862EF8406B +# MD5 Fingerprint: 41:03:52:DC:0F:F7:50:1B:16:F0:02:8E:BA:6F:45:C5 +# SHA1 Fingerprint: DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13 +# SHA256 Fingerprint: 06:87:26:03:31:A7:24:03:D9:09:F1:05:E6:9B:CF:0D:32:E1:BD:24:93:FF:C6:D9:20:6D:11:BC:D6:77:07:39 -----BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +# Issuer: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US +# Subject: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US +# Serial: 33af1e6a711a9a0bb2864b11d09fae5 +# MD5 Fingerprint: E4:A6:8A:C8:54:AC:52:42:46:0A:FD:72:48:1B:2A:44 +# SHA1 Fingerprint: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 +# SHA256 Fingerprint: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F -----BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= -----END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- \ No newline at end of file diff --git a/shotgun_api3/lib/httplib2/certs.py b/shotgun_api3/lib/httplib2/certs.py new file mode 100644 index 000000000..59d1ffc70 --- /dev/null +++ b/shotgun_api3/lib/httplib2/certs.py @@ -0,0 +1,42 @@ +"""Utilities for certificate management.""" + +import os + +certifi_available = False +certifi_where = None +try: + from certifi import where as certifi_where + certifi_available = True +except ImportError: + pass + +custom_ca_locater_available = False +custom_ca_locater_where = None +try: + from ca_certs_locater import get as custom_ca_locater_where + custom_ca_locater_available = True +except ImportError: + pass + + +BUILTIN_CA_CERTS = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "cacerts.txt" +) + + +def where(): + env = os.environ.get("HTTPLIB2_CA_CERTS") + if env is not None: + if os.path.isfile(env): + return env + else: + raise RuntimeError("Environment variable HTTPLIB2_CA_CERTS not a valid file") + if custom_ca_locater_available: + return custom_ca_locater_where() + if certifi_available: + return certifi_where() + return BUILTIN_CA_CERTS + + +if __name__ == "__main__": + print(where()) diff --git a/shotgun_api3/lib/httplib2/iri2uri.py b/shotgun_api3/lib/httplib2/iri2uri.py index d88c91fdf..0a978a784 100644 --- a/shotgun_api3/lib/httplib2/iri2uri.py +++ b/shotgun_api3/lib/httplib2/iri2uri.py @@ -1,20 +1,13 @@ -""" -iri2uri +"""Converts an IRI to a URI.""" -Converts an IRI to a URI. - -""" __author__ = "Joe Gregorio (joe@bitworking.org)" __copyright__ = "Copyright 2006, Joe Gregorio" __contributors__ = [] __version__ = "1.0.0" __license__ = "MIT" -__history__ = """ -""" import urlparse - # Convert an IRI to a URI following the rules in RFC 3987 # # The characters we need to enocde and escape are defined in the spec: @@ -50,6 +43,7 @@ (0x100000, 0x10FFFD), ] + def encode(c): retval = c i = ord(c) @@ -57,7 +51,7 @@ def encode(c): if i < low: break if i >= low and i <= high: - retval = "".join(["%%%2X" % ord(o) for o in c.encode('utf-8')]) + retval = "".join(["%%%2X" % ord(o) for o in c.encode("utf-8")]) break return retval @@ -66,9 +60,9 @@ def iri2uri(uri): """Convert an IRI to a URI. Note that IRIs must be passed in a unicode strings. That is, do not utf-8 encode the IRI before passing it into the function.""" - if isinstance(uri ,unicode): + if isinstance(uri, unicode): (scheme, authority, path, query, fragment) = urlparse.urlsplit(uri) - authority = authority.encode('idna') + authority = authority.encode("idna") # For each character in 'ucschar' or 'iprivate' # 1. encode as utf-8 # 2. then %-encode each octet of that utf-8 @@ -76,11 +70,11 @@ def iri2uri(uri): uri = "".join([encode(c) for c in uri]) return uri + if __name__ == "__main__": import unittest class Test(unittest.TestCase): - def test_uris(self): """Test that URIs are invariant under the transformation.""" invariant = [ @@ -91,20 +85,39 @@ def test_uris(self): u"news:comp.infosystems.www.servers.unix", u"tel:+1-816-555-1212", u"telnet://192.0.2.16:80/", - u"urn:oasis:names:specification:docbook:dtd:xml:4.1.2" ] + u"urn:oasis:names:specification:docbook:dtd:xml:4.1.2", + ] for uri in invariant: self.assertEqual(uri, iri2uri(uri)) def test_iri(self): - """ Test that the right type of escaping is done for each part of the URI.""" - self.assertEqual("http://xn--o3h.com/%E2%98%84", iri2uri(u"http://\N{COMET}.com/\N{COMET}")) - self.assertEqual("http://bitworking.org/?fred=%E2%98%84", iri2uri(u"http://bitworking.org/?fred=\N{COMET}")) - self.assertEqual("http://bitworking.org/#%E2%98%84", iri2uri(u"http://bitworking.org/#\N{COMET}")) + """Test that the right type of escaping is done for each part of the URI.""" + self.assertEqual( + "http://xn--o3h.com/%E2%98%84", + iri2uri(u"http://\N{COMET}.com/\N{COMET}"), + ) + self.assertEqual( + "http://bitworking.org/?fred=%E2%98%84", + iri2uri(u"http://bitworking.org/?fred=\N{COMET}"), + ) + self.assertEqual( + "http://bitworking.org/#%E2%98%84", + iri2uri(u"http://bitworking.org/#\N{COMET}"), + ) self.assertEqual("#%E2%98%84", iri2uri(u"#\N{COMET}")) - self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}")) - self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}"))) - self.assertNotEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}".encode('utf-8'))) + self.assertEqual( + "/fred?bar=%E2%98%9A#%E2%98%84", + iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}"), + ) + self.assertEqual( + "/fred?bar=%E2%98%9A#%E2%98%84", + iri2uri(iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}")), + ) + self.assertNotEqual( + "/fred?bar=%E2%98%9A#%E2%98%84", + iri2uri( + u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}".encode("utf-8") + ), + ) unittest.main() - - diff --git a/shotgun_api3/lib/httplib2/socks.py b/shotgun_api3/lib/httplib2/socks.py index 0991f4cf6..5cef77606 100644 --- a/shotgun_api3/lib/httplib2/socks.py +++ b/shotgun_api3/lib/httplib2/socks.py @@ -1,4 +1,5 @@ """SocksiPy - Python SOCKS module. + Version 1.00 Copyright 2006 Dan-Haim. All rights reserved. @@ -24,20 +25,14 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE. - This module provides a standard socket-like interface for Python for tunneling connections through SOCKS proxies. -""" - -""" - -Minor modifications made by Christopher Gilbert (http://motomastyle.com/) -for use in PyLoris (http://pyloris.sourceforge.net/) +Minor modifications made by Christopher Gilbert (http://motomastyle.com/) for +use in PyLoris (http://pyloris.sourceforge.net/). Minor modifications made by Mario Vilas (http://breakingcode.wordpress.com/) -mainly to merge bug fixes found in Sourceforge - +mainly to merge bug fixes found in Sourceforge. """ import base64 @@ -45,8 +40,8 @@ import struct import sys -if getattr(socket, 'socket', None) is None: - raise ImportError('socket.socket missing, proxy support unusable') +if getattr(socket, "socket", None) is None: + raise ImportError("socket.socket missing, proxy support unusable") PROXY_TYPE_SOCKS4 = 1 PROXY_TYPE_SOCKS5 = 2 @@ -56,21 +51,42 @@ _defaultproxy = None _orgsocket = socket.socket -class ProxyError(Exception): pass -class GeneralProxyError(ProxyError): pass -class Socks5AuthError(ProxyError): pass -class Socks5Error(ProxyError): pass -class Socks4Error(ProxyError): pass -class HTTPError(ProxyError): pass -_generalerrors = ("success", +class ProxyError(Exception): + pass + + +class GeneralProxyError(ProxyError): + pass + + +class Socks5AuthError(ProxyError): + pass + + +class Socks5Error(ProxyError): + pass + + +class Socks4Error(ProxyError): + pass + + +class HTTPError(ProxyError): + pass + + +_generalerrors = ( + "success", "invalid data", "not connected", "not available", "bad proxy type", - "bad input") + "bad input", +) -_socks5errors = ("succeeded", +_socks5errors = ( + "succeeded", "general SOCKS server failure", "connection not allowed by ruleset", "Network unreachable", @@ -79,21 +95,30 @@ class HTTPError(ProxyError): pass "TTL expired", "Command not supported", "Address type not supported", - "Unknown error") + "Unknown error", +) -_socks5autherrors = ("succeeded", +_socks5autherrors = ( + "succeeded", "authentication is required", "all offered authentication methods were rejected", "unknown username or invalid password", - "unknown error") + "unknown error", +) -_socks4errors = ("request granted", +_socks4errors = ( + "request granted", "request rejected or failed", "request rejected because SOCKS server cannot connect to identd on the client", - "request rejected because the client program and identd report different user-ids", - "unknown error") + "request rejected because the client program and identd report different " + "user-ids", + "unknown error", +) -def setdefaultproxy(proxytype=None, addr=None, port=None, rdns=True, username=None, password=None): + +def setdefaultproxy( + proxytype=None, addr=None, port=None, rdns=True, username=None, password=None +): """setdefaultproxy(proxytype, addr[, port[, rdns[, username[, password]]]]) Sets a default proxy which all further socksocket objects will use, unless explicitly changed. @@ -101,11 +126,14 @@ def setdefaultproxy(proxytype=None, addr=None, port=None, rdns=True, username=No global _defaultproxy _defaultproxy = (proxytype, addr, port, rdns, username, password) + def wrapmodule(module): """wrapmodule(module) + Attempts to replace a module's socket library with a SOCKS socket. Must set a default proxy using setdefaultproxy(...) first. - This will only work on modules that import socket directly into the namespace; + This will only work on modules that import socket directly into the + namespace; most of the Python Standard Library falls into this category. """ if _defaultproxy != None: @@ -113,6 +141,7 @@ def wrapmodule(module): else: raise GeneralProxyError((4, "no proxy specified")) + class socksocket(socket.socket): """socksocket([family[, type[, proto]]]) -> socket object Open a SOCKS enabled socket. The parameters are the same as @@ -120,7 +149,9 @@ class socksocket(socket.socket): you must specify family=AF_INET, type=SOCK_STREAM and proto=0. """ - def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None): + def __init__( + self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None + ): _orgsocket.__init__(self, family, type, proto, _sock) if _defaultproxy != None: self.__proxy = _defaultproxy @@ -137,8 +168,9 @@ def __recvall(self, count): """ data = self.recv(count) while len(data) < count: - d = self.recv(count-len(data)) - if not d: raise GeneralProxyError((0, "connection closed unexpectedly")) + d = self.recv(count - len(data)) + if not d: + raise GeneralProxyError((0, "connection closed unexpectedly")) data = data + d return data @@ -167,7 +199,7 @@ def __rewriteproxy(self, header): hdrs.remove(endpt) host = host.split(" ")[1] endpt = endpt.split(" ") - if (self.__proxy[4] != None and self.__proxy[5] != None): + if self.__proxy[4] != None and self.__proxy[5] != None: hdrs.insert(0, self.__getauthheader()) hdrs.insert(0, "Host: %s" % host) hdrs.insert(0, "%s http://%s%s %s" % (endpt[0], host, endpt[1], endpt[2])) @@ -177,8 +209,18 @@ def __getauthheader(self): auth = self.__proxy[4] + ":" + self.__proxy[5] return "Proxy-Authorization: Basic " + base64.b64encode(auth) - def setproxy(self, proxytype=None, addr=None, port=None, rdns=True, username=None, password=None): + def setproxy( + self, + proxytype=None, + addr=None, + port=None, + rdns=True, + username=None, + password=None, + headers=None, + ): """setproxy(proxytype, addr[, port[, rdns[, username[, password]]]]) + Sets the proxy to be used. proxytype - The type of the proxy to be used. Three types are supported: PROXY_TYPE_SOCKS4 (including socks4a), @@ -193,23 +235,25 @@ def setproxy(self, proxytype=None, addr=None, port=None, rdns=True, username=Non The default is no authentication. password - Password to authenticate with to the server. Only relevant when username is also provided. + headers - Additional or modified headers for the proxy connect + request. """ - self.__proxy = (proxytype, addr, port, rdns, username, password) + self.__proxy = (proxytype, addr, port, rdns, username, password, headers) def __negotiatesocks5(self, destaddr, destport): """__negotiatesocks5(self,destaddr,destport) Negotiates a connection through a SOCKS5 server. """ # First we'll send the authentication packages we support. - if (self.__proxy[4]!=None) and (self.__proxy[5]!=None): + if (self.__proxy[4] != None) and (self.__proxy[5] != None): # The username/password details were supplied to the # setproxy method so we support the USERNAME/PASSWORD # authentication (in addition to the standard none). - self.sendall(struct.pack('BBBB', 0x05, 0x02, 0x00, 0x02)) + self.sendall(struct.pack("BBBB", 0x05, 0x02, 0x00, 0x02)) else: # No username/password were entered, therefore we # only support connections with no authentication. - self.sendall(struct.pack('BBB', 0x05, 0x01, 0x00)) + self.sendall(struct.pack("BBB", 0x05, 0x01, 0x00)) # We'll receive the server's response to determine which # method was selected chosenauth = self.__recvall(2) @@ -223,7 +267,13 @@ def __negotiatesocks5(self, destaddr, destport): elif chosenauth[1:2] == chr(0x02).encode(): # Okay, we need to perform a basic username/password # authentication. - self.sendall(chr(0x01).encode() + chr(len(self.__proxy[4])) + self.__proxy[4] + chr(len(self.__proxy[5])) + self.__proxy[5]) + self.sendall( + chr(0x01).encode() + + chr(len(self.__proxy[4])) + + self.__proxy[4] + + chr(len(self.__proxy[5])) + + self.__proxy[5] + ) authstat = self.__recvall(2) if authstat[0:1] != chr(0x01).encode(): # Bad response @@ -242,7 +292,7 @@ def __negotiatesocks5(self, destaddr, destport): else: raise GeneralProxyError((1, _generalerrors[1])) # Now we can request the actual connection - req = struct.pack('BBB', 0x05, 0x01, 0x00) + req = struct.pack("BBB", 0x05, 0x01, 0x00) # If the given destination address is an IP address, we'll # use the IPv4 address request even if remote resolving was specified. try: @@ -253,7 +303,12 @@ def __negotiatesocks5(self, destaddr, destport): if self.__proxy[3]: # Resolve remotely ipaddr = None - req = req + chr(0x03).encode() + chr(len(destaddr)).encode() + destaddr + req = ( + req + + chr(0x03).encode() + + chr(len(destaddr)).encode() + + destaddr.encode() + ) else: # Resolve locally ipaddr = socket.inet_aton(socket.gethostbyname(destaddr)) @@ -268,7 +323,7 @@ def __negotiatesocks5(self, destaddr, destport): elif resp[1:2] != chr(0x00).encode(): # Connection failed self.close() - if ord(resp[1:2])<=8: + if ord(resp[1:2]) <= 8: raise Socks5Error((ord(resp[1:2]), _socks5errors[ord(resp[1:2])])) else: raise Socks5Error((9, _socks5errors[9])) @@ -280,7 +335,7 @@ def __negotiatesocks5(self, destaddr, destport): boundaddr = self.__recvall(ord(resp[4:5])) else: self.close() - raise GeneralProxyError((1,_generalerrors[1])) + raise GeneralProxyError((1, _generalerrors[1])) boundport = struct.unpack(">H", self.__recvall(2))[0] self.__proxysockname = (boundaddr, boundport) if ipaddr != None: @@ -307,7 +362,7 @@ def getpeername(self): """ return self.__proxypeername - def __negotiatesocks4(self,destaddr,destport): + def __negotiatesocks4(self, destaddr, destport): """__negotiatesocks4(self,destaddr,destport) Negotiates a connection through a SOCKS4 server. """ @@ -339,7 +394,7 @@ def __negotiatesocks4(self,destaddr,destport): if resp[0:1] != chr(0x00).encode(): # Bad data self.close() - raise GeneralProxyError((1,_generalerrors[1])) + raise GeneralProxyError((1, _generalerrors[1])) if resp[1:2] != chr(0x5A).encode(): # Server returned an error self.close() @@ -349,7 +404,10 @@ def __negotiatesocks4(self,destaddr,destport): else: raise Socks4Error((94, _socks4errors[4])) # Get the bound address/port - self.__proxysockname = (socket.inet_ntoa(resp[4:]), struct.unpack(">H", resp[2:4])[0]) + self.__proxysockname = ( + socket.inet_ntoa(resp[4:]), + struct.unpack(">H", resp[2:4])[0], + ) if rmtrslv != None: self.__proxypeername = (socket.inet_ntoa(ipaddr), destport) else: @@ -364,9 +422,18 @@ def __negotiatehttp(self, destaddr, destport): addr = socket.gethostbyname(destaddr) else: addr = destaddr - headers = ["CONNECT ", addr, ":", str(destport), " HTTP/1.1\r\n"] - headers += ["Host: ", destaddr, "\r\n"] - if (self.__proxy[4] != None and self.__proxy[5] != None): + headers = ["CONNECT ", addr, ":", str(destport), " HTTP/1.1\r\n"] + wrote_host_header = False + wrote_auth_header = False + if self.__proxy[6] != None: + for key, val in self.__proxy[6].iteritems(): + headers += [key, ": ", val, "\r\n"] + wrote_host_header = key.lower() == "host" + wrote_auth_header = key.lower() == "proxy-authorization" + if not wrote_host_header: + headers += ["Host: ", destaddr, "\r\n"] + if not wrote_auth_header: + if self.__proxy[4] != None and self.__proxy[5] != None: headers += [self.__getauthheader(), "\r\n"] headers.append("\r\n") self.sendall("".join(headers).encode()) @@ -399,7 +466,12 @@ def connect(self, destpair): To select the proxy server use setproxy(). """ # Do a minimal input check first - if (not type(destpair) in (list,tuple)) or (len(destpair) < 2) or (not isinstance(destpair[0], basestring)) or (type(destpair[1]) != int): + if ( + (not type(destpair) in (list, tuple)) + or (len(destpair) < 2) + or (not isinstance(destpair[0], basestring)) + or (type(destpair[1]) != int) + ): raise GeneralProxyError((5, _generalerrors[5])) if self.__proxy[0] == PROXY_TYPE_SOCKS5: if self.__proxy[2] != None: @@ -413,23 +485,23 @@ def connect(self, destpair): portnum = self.__proxy[2] else: portnum = 1080 - _orgsocket.connect(self,(self.__proxy[1], portnum)) + _orgsocket.connect(self, (self.__proxy[1], portnum)) self.__negotiatesocks4(destpair[0], destpair[1]) elif self.__proxy[0] == PROXY_TYPE_HTTP: if self.__proxy[2] != None: portnum = self.__proxy[2] else: portnum = 8080 - _orgsocket.connect(self,(self.__proxy[1], portnum)) + _orgsocket.connect(self, (self.__proxy[1], portnum)) self.__negotiatehttp(destpair[0], destpair[1]) elif self.__proxy[0] == PROXY_TYPE_HTTP_NO_TUNNEL: if self.__proxy[2] != None: portnum = self.__proxy[2] else: portnum = 8080 - _orgsocket.connect(self,(self.__proxy[1],portnum)) + _orgsocket.connect(self, (self.__proxy[1], portnum)) if destpair[1] == 443: - self.__negotiatehttp(destpair[0],destpair[1]) + self.__negotiatehttp(destpair[0], destpair[1]) else: self.__httptunnel = False elif self.__proxy[0] == None: diff --git a/shotgun_api3/lib/requirements.txt b/shotgun_api3/lib/requirements.txt new file mode 100644 index 000000000..595e085db --- /dev/null +++ b/shotgun_api3/lib/requirements.txt @@ -0,0 +1,32 @@ +# Copyright (c) 2009-2019, Shotgun Software Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# - Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# - Neither the name of the Shotgun Software Inc nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# This file is unused. It is left there so Github can warn us is a CVE is +# released for our dependencies. +httplib2==0.12.0 +simplejson=2.1.6 \ No newline at end of file diff --git a/tests/base.py b/tests/base.py index 6f86b79d6..5b35cb945 100644 --- a/tests/base.py +++ b/tests/base.py @@ -18,27 +18,35 @@ class TestBase(unittest.TestCase): Sets up mocking and database test data.''' + human_user = None + project = None + shot = None + asset = None + version = None + note = None + playlist = None + task = None + ticket = None + human_password = None + server_url = None + server_address = None + session_token = None + def __init__(self, *args, **kws): unittest.TestCase.__init__(self, *args, **kws) - self.human_user = None - self.project = None - self.shot = None - self.asset = None - self.version = None - self.note = None - self.playlist = None - self.task = None - self.ticket = None - self.human_password = None - self.server_url = None - self.server_address = None - self.session_token = None self.connect = False + @classmethod + def setUpClass(cls): + """ + Loads the configuration file from disk. + """ + # Since the file is read and never modified, we will only read + # it once in memory and be done. + cls.config = SgTestConfig() + cls.config.read_config(CONFIG_PATH) def setUp(self, auth_mode='ApiUser'): - self.config = SgTestConfig() - self.config.read_config(CONFIG_PATH) self.human_login = self.config.human_login self.human_password = self.config.human_password self.server_url = self.config.server_url @@ -192,8 +200,6 @@ class LiveTestBase(TestBase): '''Test base for tests relying on connection to server.''' def setUp(self, auth_mode='ApiUser'): super(LiveTestBase, self).setUp(auth_mode) - self.sg_version = tuple(self.sg.info()['version'][:3]) - self._setup_db(self.config) if self.sg.server_caps.version and \ self.sg.server_caps.version >= (3, 3, 0) and \ (self.sg.server_caps.host.startswith('0.0.0.0') or \ @@ -202,76 +208,96 @@ def setUp(self, auth_mode='ApiUser'): else: self.server_address = self.sg.server_caps.host - def _setup_db(self, config): - data = {'name':self.config.project_name} - self.project = _find_or_create_entity(self.sg, 'Project', data) - - data = {'name':self.config.human_name, - 'login':self.config.human_login, - 'password_proxy':self.config.human_password} - if self.sg_version >= (3, 0, 0): + @classmethod + def setUpClass(cls): + """ + Sets up common and recurring operations for all tests. + """ + # The code below simply retrieves entities from Shotgun, or creates + # them the very first time the test suite is run againt the site. + # As such, since the operation is read-only, there's no sense + # reloading stuff from Shotgun over and over again during each test. + # As such, we are using setUpClass to load them once during the + # entire duration of the tests. + super(LiveTestBase, cls).setUpClass() + sg = api.Shotgun( + cls.config.server_url, + cls.config.script_name, + cls.config.api_key + ) + cls.sg_version = tuple(sg.info()['version'][:3]) + cls._setup_db(cls.config, sg) + + @classmethod + def _setup_db(cls, config, sg): + data = {'name': cls.config.project_name} + cls.project = _find_or_create_entity(sg, 'Project', data) + + data = {'name': cls.config.human_name, + 'login': cls.config.human_login, + 'password_proxy': cls.config.human_password} + if cls.sg_version >= (3, 0, 0): data['locked_until'] = None + cls.human_user = _find_or_create_entity(sg, 'HumanUser', data) - self.human_user = _find_or_create_entity(self.sg, 'HumanUser', data) - - data = {'code':self.config.asset_code, - 'project':self.project} + data = {'code': cls.config.asset_code, + 'project': cls.project} keys = ['code'] - self.asset = _find_or_create_entity(self.sg, 'Asset', data, keys) + cls.asset = _find_or_create_entity(sg, 'Asset', data, keys) - data = {'project':self.project, - 'code':self.config.version_code, - 'entity':self.asset, - 'user':self.human_user, + data = {'project': cls.project, + 'code': cls.config.version_code, + 'entity': cls.asset, + 'user': cls.human_user, 'sg_frames_aspect_ratio': 13.3, 'frame_count': 33} keys = ['code','project'] - self.version = _find_or_create_entity(self.sg, 'Version', data, keys) + cls.version = _find_or_create_entity(sg, 'Version', data, keys) keys = ['code','project'] - data = {'code':self.config.shot_code, - 'project':self.project} - self.shot = _find_or_create_entity(self.sg, 'Shot', data, keys) + data = {'code': cls.config.shot_code, + 'project': cls.project} + cls.shot = _find_or_create_entity(sg, 'Shot', data, keys) keys = ['project','user'] - data = {'project':self.project, - 'user':self.human_user, + data = {'project': cls.project, + 'user': cls.human_user, 'content':'anything'} - self.note = _find_or_create_entity(self.sg, 'Note', data, keys) + cls.note = _find_or_create_entity(sg, 'Note', data, keys) keys = ['code','project'] - data = {'project':self.project, - 'code':self.config.playlist_code} - self.playlist = _find_or_create_entity(self.sg, 'Playlist', data, keys) + data = {'project': cls.project, + 'code': cls.config.playlist_code} + cls.playlist = _find_or_create_entity(sg, 'Playlist', data, keys) keys = ['code', 'entity_type'] data = {'code': 'wrapper test step', 'entity_type': 'Shot'} - self.step = _find_or_create_entity(self.sg, 'Step', data, keys) + cls.step = _find_or_create_entity(sg, 'Step', data, keys) keys = ['project', 'entity', 'content'] - data = {'project':self.project, - 'entity':self.asset, - 'content':self.config.task_content, + data = {'project': cls.project, + 'entity': cls.asset, + 'content': cls.config.task_content, 'color':'Black', 'due_date':'1968-10-13', - 'task_assignees': [self.human_user], + 'task_assignees': [cls.human_user], 'sg_status_list': 'ip'} - self.task = _find_or_create_entity(self.sg, 'Task', data, keys) + cls.task = _find_or_create_entity(sg, 'Task', data, keys) - data = {'project':self.project, - 'title':self.config.ticket_title, + data = {'project': cls.project, + 'title': cls.config.ticket_title, 'sg_priority': '3'} keys = ['title','project', 'sg_priority'] - self.ticket = _find_or_create_entity(self.sg, 'Ticket', data, keys) + cls.ticket = _find_or_create_entity(sg, 'Ticket', data, keys) keys = ['code'] data = {'code':'api wrapper test storage', 'mac_path':'nowhere', 'windows_path':'nowhere', 'linux_path':'nowhere'} - self.local_storage = _find_or_create_entity(self.sg, 'LocalStorage', data, keys) + cls.local_storage = _find_or_create_entity(sg, 'LocalStorage', data, keys) class HumanUserAuthLiveTestBase(LiveTestBase): @@ -294,9 +320,7 @@ def setUp(self): class SgTestConfig(object): '''Reads test config and holds values''' def __init__(self): - for key in self.config_keys(): - # Look for any environment variables that match our test # configuration naming of "SG_{KEY}". Default is None. value = os.environ.get('SG_%s' % (str(key).upper())) @@ -309,7 +333,7 @@ def config_keys(self): 'api_key', 'asset_code', 'http_proxy', 'human_login', 'human_name', 'human_password', 'mock', 'project_name', 'script_name', 'server_url', 'session_uuid', 'shot_code', 'task_content', - 'version_code', 'playlist_code' + 'version_code', 'playlist_code', 'ticket_title' ] def read_config(self, config_path): diff --git a/tests/test_api.py b/tests/test_api.py index 12a3673b3..453f6c4e3 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -793,6 +793,9 @@ def test_preferences_read(self): if not self.sg.server_caps.version or self.sg.server_caps.version < (7, 10, 0): return + # This is a big diff if it fails, so show everything. + self.maxDiff = None + # all prefs resp = self.sg.preferences_read() @@ -807,7 +810,8 @@ def test_preferences_read(self): 'format_footage_fields': '10-05', 'format_number_fields': '1,000', 'format_time_hour_fields': '12 hour', - 'support_local_storage': False + 'support_local_storage': False, + 'view_master_settings': '{"status_groups":[{"name":"Upcoming","code":"upc_stgr","status_list":["wtg","rdy"]},{"name":"Active","code":"act_stgr","status_list":["ip","kickbk","rev","act","rsk","blk","late","opn","pndng","tkt","push","rrq","vwd","out"]},{"name":"Done","code":"done_stgr","status_list":["fin","cmpt","apr","cbb","clsd","cfrm","dlvr","recd","res"]}],"entity_fields":{"Task":["content","sg_description","sg_status_list","due_date","task_assignees","task_reviewers"],"Shot":["code","description","sg_status_list","created_at","sg_cut_in","sg_cut_out","sg_cut_duration","sg_cut_order"],"Asset":["code","description","sg_status_list","created_at"],"Scene":["code","sg_status_list","created_at"],"Element":["code","sg_status_list","created_at"],"Release":["code","sg_status_list","created_at"],"ShootDay":["code","sg_status_list","created_at"],"MocapTake":["code","sg_status_list","created_at"],"MocapSetup":["code","sg_status_list","created_at"],"Camera":["code","sg_status_list","created_at"],"MocapTakeRange":["code","sg_status_list","created_at"],"Sequence":["code","sg_status_list","created_at"],"Level":["code","sg_status_list","created_at"],"Episode":["code","sg_status_list","created_at"]},"entity_fields_fixed":{"Asset":["code","description","sg_status_list"],"Shot":["code","description","sg_status_list"],"Task":["content","sg_status_list","due_date","task_assignees","task_reviewers"],"Scene":["code","description","sg_status_list"],"Element":["code","description","sg_status_list"],"Release":["code","description","sg_status_list"],"ShootDay":["code","description","sg_status_list"],"MocapTake":["code","description","sg_status_list"],"MocapSetup":["code","description","sg_status_list"],"Camera":["code","description","sg_status_list"],"MocapTakeRange":["code","description","sg_status_list"],"Sequence":["code","description","sg_status_list"],"Level":["code","description","sg_status_list"],"Episode":["code","description","sg_status_list"]}}' # noqa } self.assertEqual(expected, resp) From d43e9ab2dc1d859b89c2b31764d1c61de7e23f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Thu, 7 Feb 2019 15:15:08 -0500 Subject: [PATCH 212/389] packaging for v3.0.38 --- HISTORY.rst | 10 ++++++---- shotgun_api3/shotgun.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index ebb2f65db..75ea18dd7 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,18 +4,20 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. -v3.0.38.dev +v3.0.38 (2019 February 7) ===================== -- TBD +- Upgrades the version of ``httplib2`` to ``0.12.0``, which fixes SNI issues. Note this + version contains a more recent list of certificate authorities. If you are running Shotgun locally and have + signed your https certificate with an outdated certificate authority, the Shotgun connection will be rejected. -v3.0.37 +v3.0.37 (2018 July 19) ===================== - Proper support added for unicode and utf-8 string paths given to upload methods, and a sane error is raised when an unusable string encoding is used. - Adds support for querying preferences from Shotgun via the new preferences_read method. - Under-the-hood changes to add support for direct to s3 uploads to Shotgun. This change should be transparent to users. -v3.0.36 +v3.0.36 (2018 April 3) ===================== - Fixes an error where ``connect=False`` during ``__init__`` would still connect to Shotgun. diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index d6f8023df..23b769a1d 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.38.dev" +__version__ = "3.0.38" # ---------------------------------------------------------------------------- # Errors From c699e4b4aeaecb8d7addedc0682dc1d8d8e295b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Wed, 20 Feb 2019 13:05:13 -0500 Subject: [PATCH 213/389] For SG-10538, bad certs on upload fix This ensures we are using the right certificates when uploading a file. --- shotgun_api3/shotgun.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 23b769a1d..b10ff51ab 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -3102,7 +3102,8 @@ def _build_opener(self, handler): if self.config.proxy_handler: handlers.append(self.config.proxy_handler) - handlers.append(handler) + if handler is not None: + handlers.append(handler) return urllib2.build_opener(*handlers) def _turn_off_ssl_validation(self): @@ -3810,7 +3811,7 @@ def _upload_data_to_storage(self, data, content_type, size, storage_url): :rtype: str """ try: - opener = urllib2.build_opener(urllib2.HTTPHandler) + opener = self._build_opener(urllib2.HTTPHandler) request = urllib2.Request(storage_url, data=data) request.add_header("Content-Type", content_type) From ba05854628a63f26f941cf0b068444824f4cb8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Boismenu?= Date: Wed, 20 Feb 2019 13:08:53 -0500 Subject: [PATCH 214/389] Packaging up for the 3.0.39 release. --- HISTORY.rst | 7 ++++++- README.md | 2 +- setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 75ea18dd7..f3f934a16 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,7 +4,12 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. -v3.0.38 (2019 February 7) +v3.0.39 (2019 February 20) +===================== +- Ensures the certificates packaged with the API and those specified via the `SHOTGUN_API_CACERTS` environment variable + are used when uploading a file. + +v3.0.39 (2019 February 7) ===================== - Upgrades the version of ``httplib2`` to ``0.12.0``, which fixes SNI issues. Note this version contains a more recent list of certificate authorities. If you are running Shotgun locally and have diff --git a/README.md b/README.md index a3d2a0a7f..1fff61770 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Integration and unit tests are provided. - Ensure that doc strings are updated in the code itself to work with Sphinx and are correctly formatted. - Examples are always good especially if this a new feature or method. - Think about a new user to the API trying to figure out how to use the features you're documenting. -3) Update the version value in `shotgun_api3/setup.py` to match the version you are packaging. This controls what version users will get when installing via pip. +3) Update the version value in `python-api/setup.py` to match the version you are packaging. This controls what version users will get when installing via pip. 4) Update the `__version__` value in `shotgun_api3/shotgun.py` to the version you're releasing. This identified the current version within the API itself. 5) Commit these changes in master with a commit message like `packaging for the vx.x.x release`. 6) Create a tag based off of the master branch called `vx.x.x` to match the version number you're releasing. diff --git a/setup.py b/setup.py index d1c5c08ac..ebcf099d8 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.38', + version='3.0.39', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index b10ff51ab..b2b9cffb7 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.38" +__version__ = "3.0.39" # ---------------------------------------------------------------------------- # Errors From 5850910b8caf8a33ce8298abb642a2905e83a732 Mon Sep 17 00:00:00 2001 From: Patrick Hubert Date: Fri, 22 Feb 2019 09:53:36 -0500 Subject: [PATCH 215/389] Updated the info() return values (#189) * Updated the info() return values * Acted on reviewer s comment * Removed reference of unified_login_flow_enabled in the sample return array --- shotgun_api3/shotgun.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index b2b9cffb7..365ea6cd5 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -693,12 +693,29 @@ def info(self): Get API-related metadata from the Shotgun server. >>> sg.info() - {'full_version': [6, 3, 15, 0], 'version': [6, 3, 15], ...} + {'full_version': [8, 2, 1, 0], 'version': [8, 2, 1], 'user_authentication_method': 'default', ...} + + Tokens and values + ----------------- + + :: + + Token Value + -------- --------- + full_version An ordered array of the full Shotgun version. + [major, minor, patch, hotfix] + version An ordered array of the Shotgun version. + [major, minor, patch] + user_authentication_method Indicates the authentication method used by Shotgun. + Will be one of the following values: + default: regular username/password. + ldap: username/password from the company's LDAP. + saml2: SSO used, over SAML2. .. note:: - Beyond ``full_version`` and ``version`` which differ by the inclusion of the bugfix number, you should expect - these values to be unsupported and for internal use only. + Beyond the documented tokens, you should expect + the other values to be unsupported and for internal use only. :returns: dict of the server metadata. :rtype: dict From cb70773aff32952106ed0db43d13ee0fec133970 Mon Sep 17 00:00:00 2001 From: dallum Date: Wed, 27 Feb 2019 12:32:45 +0000 Subject: [PATCH 216/389] Update shotgun.py --- shotgun_api3/shotgun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 365ea6cd5..bd2079016 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ ----------------------------------------------------------------------------- - Copyright (c) 2009-2018, Shotgun Software Inc. + Copyright (c) 2009-2019, Shotgun Software Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From 832ef7d10f28cffebf935ebdc141e3b0baf150fd Mon Sep 17 00:00:00 2001 From: Ethan Estrada Date: Wed, 13 Mar 2019 16:11:59 -0600 Subject: [PATCH 217/389] Avoid errors when uploading large files (#94) Reading/writing a large file all at once can cause a MemoryError or an OverflowError. Using `shutil.copyfileobj` seems to solve the issue. --- shotgun_api3/shotgun.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index bd2079016..7043908c5 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -4040,7 +4040,9 @@ def encode(self, params, files, boundary=None, buffer=None): buffer.write('Content-Type: %s\r\n' % content_type) buffer.write('Content-Length: %s\r\n' % file_size) fd.seek(0) - buffer.write('\r\n%s\r\n' % fd.read()) + buffer.write('\r\n') + shutil.copyfileobj(fd, buffer) + buffer.write('\r\n') buffer.write('--%s--\r\n\r\n' % boundary) buffer = buffer.getvalue() return boundary, buffer From fad9e85eda69fcc99ce03c9a9caee2e895c45a00 Mon Sep 17 00:00:00 2001 From: Neil Grey Date: Wed, 13 Mar 2019 15:31:10 -0700 Subject: [PATCH 218/389] Packaging up for the 3.0.40 release --- HISTORY.rst | 4 ++++ setup.py | 2 +- shotgun_api3/shotgun.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index f3f934a16..39c5fecd3 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,10 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.40 (2019 March 13) +===================== +- Updates encoding method to use shutil when uploading, to avoid memory and overflow errors when reading large files. (contributed by @eestrada) + v3.0.39 (2019 February 20) ===================== - Ensures the certificates packaged with the API and those specified via the `SHOTGUN_API_CACERTS` environment variable diff --git a/setup.py b/setup.py index ebcf099d8..0f3b065c0 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.39', + version='3.0.40', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 7043908c5..81627ca19 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.39" +__version__ = "3.0.40" # ---------------------------------------------------------------------------- # Errors From be1f679601fc432f9374dba1ea32cbc310eaa9f8 Mon Sep 17 00:00:00 2001 From: Hasiel Alvarez Date: Fri, 26 Apr 2019 17:28:18 -0700 Subject: [PATCH 219/389] Added support for "not_in" operator when using text fields (#193) Thank you for your contribution @hasielhassan ! --- shotgun_api3/lib/mockgun/mockgun.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index d3c73c865..d8f33cebb 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -607,6 +607,8 @@ def _compare(self, field_type, lval, operator, rval): return lval.startswith(rval) elif operator == "ends_with": return lval.endswith(rval) + elif operator == "not_in": + return lval not in rval elif field_type == "entity": if operator == "is": # If one of the two is None, ensure both are. From 6094e337a46565e5d46d66764b41a22ae183e0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manne=20=C3=96hrstr=C3=B6m?= Date: Mon, 17 Jun 2019 06:30:24 +0200 Subject: [PATCH 220/389] [minor] Added missing doc to index Added the preferences_read method to the API index. --- docs/reference.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/reference.rst b/docs/reference.rst index 50eb45b3e..ebcaa4f59 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -66,6 +66,7 @@ The documentation for all of the methods you'll need in your scripts lives in he Shotgun.update_project_last_accessed Shotgun.work_schedule_read Shotgun.work_schedule_update + Shotgun.preferences_read .. rubric:: Working With Files @@ -89,7 +90,7 @@ The documentation for all of the methods you'll need in your scripts lives in he Shotgun.unfollow Shotgun.followers -.. rubric:: Working with the Shotgun Schema +.. rubric:: Working with the Shotgun Schema and Preferences .. autosummary:: :nosignatures: From a1e3d1609eace135a7c9030430d93f86c12280bd Mon Sep 17 00:00:00 2001 From: Will Cavanagh Date: Fri, 28 Jun 2019 11:20:24 -0400 Subject: [PATCH 221/389] SG-11528 Add optional sleep between retries (#196) Add an optional sleep between retries on failed requests defaulting to 3 seconds. Allow the interval to be set by an environment variable or a property on sg.config. --- .travis.yml | 4 +++ HISTORY.rst | 4 +++ docs/reference.rst | 19 +++++++++++++ setup.py | 2 +- shotgun_api3/shotgun.py | 32 ++++++++++++++++++++-- tests/test_api.py | 5 +++- tests/test_client.py | 59 ++++++++++++++++++++++++++++++++++++----- 7 files changed, 115 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index d8bfa73f0..89a7ee6c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,10 @@ language: python python: - "2.6" - "2.7" + +# use trusty dist, since xenial (default) does not support python 2.6 +dist: trusty + # command to install dependencies install: - pip install -r tests/ci_requirements.txt diff --git a/HISTORY.rst b/HISTORY.rst index 39c5fecd3..45950bbc7 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,10 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.0.41 (2019 June 28) +===================== +- Adds an optional sleep between retries specified via the `SHOTGUN_API_RETRY_INTERVAL` environment variable, or by setting `sg.config.rpc_attempt_interval`. + v3.0.40 (2019 March 13) ===================== - Updates encoding method to use shutil when uploading, to avoid memory and overflow errors when reading large files. (contributed by @eestrada) diff --git a/docs/reference.rst b/docs/reference.rst index ebcaa4f59..a529711e9 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -869,4 +869,23 @@ are specifically displaying EventLogEntries in the web application, or API queri log that are run. We are always looking for ways to improve this in the future. If you have any immediate concerns, please `reach out to our support team `_ +********************* +Environment Variables +********************* + +SHOTGUN_API_CACERTS +=================== + +Used to specify a path to an external SSL certificates file. This environment variable can be used in place of the ``ca_certs`` keyword argument to the :class:`~shotgun.Shotgun` constructor. In the case that both this environment variable is set and the keyword argument is provided, the value from the keyword argument will be used. + + +SHOTGUN_API_RETRY_INTERVAL +========================== + +Stores the number of milliseconds to wait between request retries. By default, a value of 3000 milliseconds is used. You can override the default either by setting this environment variable, or by setting the ``rpc_attempt_interval`` property on the config like so: :: + + sg = Shotgun(site_name, script_name, script_key) + sg.config.rpc_attempt_interval = 1000 # adjusting default interval + +In the case that both this environment variable and the config's ``rpc_attempt_interval`` property are set, the value in ``rpc_attempt_interal`` will be used. diff --git a/setup.py b/setup.py index 0f3b065c0..638625434 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ setup( name='shotgun_api3', - version='3.0.40', + version='3.0.41', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/shotgun.py b/shotgun_api3/shotgun.py index 81627ca19..65a6ebc62 100755 --- a/shotgun_api3/shotgun.py +++ b/shotgun_api3/shotgun.py @@ -92,7 +92,7 @@ # ---------------------------------------------------------------------------- # Version -__version__ = "3.0.40" +__version__ = "3.0.41" # ---------------------------------------------------------------------------- # Errors @@ -345,6 +345,17 @@ def __init__(self, sg): """ self._sg = sg self.max_rpc_attempts = 3 + # rpc_attempt_interval stores the number of milliseconds to wait between + # request retries. By default, this will be 3000 milliseconds. You can + # override this by setting this property on the config like so: + # + # sg = Shotgun(site_name, script_name, script_key) + # sg.config.rpc_attempt_interval = 1000 # adjusting default interval + # + # Or by setting the ``SHOTGUN_API_RETRY_INTERVAL`` environment variable. + # In the case that the environment variable is already set, setting the + # property on the config will override it. + self.rpc_attempt_interval = 3000 # From http://docs.python.org/2.6/library/httplib.html: # If the optional timeout parameter is given, blocking operations # (like connection attempts) will timeout after that many seconds @@ -553,6 +564,17 @@ def __init__(self, self.config.convert_datetimes_to_utc = convert_datetimes_to_utc self.config.no_ssl_validation = NO_SSL_VALIDATION self.config.raw_http_proxy = http_proxy + + try: + self.config.rpc_attempt_interval = int(os.environ.get("SHOTGUN_API_RETRY_INTERVAL", 3000)) + except ValueError: + retry_interval = os.environ.get("SHOTGUN_API_RETRY_INTERVAL", 3000) + raise ValueError("Invalid value '%s' found in environment variable " + "SHOTGUN_API_RETRY_INTERVAL, must be int." % retry_interval) + if self.config.rpc_attempt_interval < 0: + raise ValueError("Value of SHOTGUN_API_RETRY_INTERVAL must be positive, " + "got '%s'." % self.config.rpc_attempt_interval) + self._connection = None if ca_certs is not None: self.__ca_certs = ca_certs @@ -3308,6 +3330,7 @@ def _make_call(self, verb, path, body, headers): body = body or None max_rpc_attempts = self.config.max_rpc_attempts + rpc_attempt_interval = self.config.rpc_attempt_interval / 1000.0 while (attempt < max_rpc_attempts): attempt += 1 @@ -3346,10 +3369,15 @@ def _make_call(self, verb, path, body, headers): if attempt == max_rpc_attempts: raise except Exception: - #TODO: LOG ? self._close_connection() if attempt == max_rpc_attempts: + LOG.debug("Request failed. Giving up after %d attempts." % attempt) raise + LOG.debug( + "Request failed, attempt %d of %d. Retrying in %.2f seconds..." % + (attempt, max_rpc_attempts, rpc_attempt_interval) + ) + time.sleep(rpc_attempt_interval) def _http_request(self, verb, path, body, headers): """ diff --git a/tests/test_api.py b/tests/test_api.py index 453f6c4e3..21be3555f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -801,6 +801,7 @@ def test_preferences_read(self): expected = { 'date_component_order': 'month_day', + 'duration_units': 'days', 'format_currency_fields_decimal_options': '$1,000.99', 'format_currency_fields_display_dollar_sign': False, 'format_currency_fields_negative_options': '- $1,000', @@ -810,8 +811,10 @@ def test_preferences_read(self): 'format_footage_fields': '10-05', 'format_number_fields': '1,000', 'format_time_hour_fields': '12 hour', + 'hours_per_day': 8.0, + 'last_day_work_week': None, 'support_local_storage': False, - 'view_master_settings': '{"status_groups":[{"name":"Upcoming","code":"upc_stgr","status_list":["wtg","rdy"]},{"name":"Active","code":"act_stgr","status_list":["ip","kickbk","rev","act","rsk","blk","late","opn","pndng","tkt","push","rrq","vwd","out"]},{"name":"Done","code":"done_stgr","status_list":["fin","cmpt","apr","cbb","clsd","cfrm","dlvr","recd","res"]}],"entity_fields":{"Task":["content","sg_description","sg_status_list","due_date","task_assignees","task_reviewers"],"Shot":["code","description","sg_status_list","created_at","sg_cut_in","sg_cut_out","sg_cut_duration","sg_cut_order"],"Asset":["code","description","sg_status_list","created_at"],"Scene":["code","sg_status_list","created_at"],"Element":["code","sg_status_list","created_at"],"Release":["code","sg_status_list","created_at"],"ShootDay":["code","sg_status_list","created_at"],"MocapTake":["code","sg_status_list","created_at"],"MocapSetup":["code","sg_status_list","created_at"],"Camera":["code","sg_status_list","created_at"],"MocapTakeRange":["code","sg_status_list","created_at"],"Sequence":["code","sg_status_list","created_at"],"Level":["code","sg_status_list","created_at"],"Episode":["code","sg_status_list","created_at"]},"entity_fields_fixed":{"Asset":["code","description","sg_status_list"],"Shot":["code","description","sg_status_list"],"Task":["content","sg_status_list","due_date","task_assignees","task_reviewers"],"Scene":["code","description","sg_status_list"],"Element":["code","description","sg_status_list"],"Release":["code","description","sg_status_list"],"ShootDay":["code","description","sg_status_list"],"MocapTake":["code","description","sg_status_list"],"MocapSetup":["code","description","sg_status_list"],"Camera":["code","description","sg_status_list"],"MocapTakeRange":["code","description","sg_status_list"],"Sequence":["code","description","sg_status_list"],"Level":["code","description","sg_status_list"],"Episode":["code","description","sg_status_list"]}}' # noqa + 'view_master_settings': '{"status_groups":[{"name":"Upcoming","code":"upc_stgr","status_list":["wtg","rdy"]},{"name":"Active","code":"act_stgr","status_list":["ip","kickbk","rev","act","rsk","blk","late","opn","pndng","tkt","push","rrq","vwd","out"]},{"name":"Done","code":"done_stgr","status_list":["fin","cmpt","apr","cbb","clsd","cfrm","dlvr","recd","res"]}],"entity_fields":{"Task":["content","sg_description","sg_status_list","due_date","task_assignees","task_reviewers","time_logs_sum"],"Shot":["code","description","sg_status_list","created_at","sg_cut_in","sg_cut_out","sg_cut_duration","sg_cut_order"],"Asset":["code","description","sg_status_list","created_at"],"Scene":["code","sg_status_list","created_at"],"Element":["code","sg_status_list","created_at"],"Release":["code","sg_status_list","created_at"],"ShootDay":["code","sg_status_list","created_at"],"MocapTake":["code","sg_status_list","created_at"],"MocapSetup":["code","sg_status_list","created_at"],"Camera":["code","sg_status_list","created_at"],"MocapTakeRange":["code","sg_status_list","created_at"],"Sequence":["code","sg_status_list","created_at"],"Level":["code","sg_status_list","created_at"],"Episode":["code","sg_status_list","created_at"],"Version":["code","description","sg_status_list"]},"entity_fields_fixed":{"Asset":["code","description","sg_status_list"],"Shot":["code","description","sg_status_list"],"Task":["content","sg_status_list","due_date","task_assignees","task_reviewers","time_logs_sum"],"Scene":["code","description","sg_status_list"],"Element":["code","description","sg_status_list"],"Release":["code","description","sg_status_list"],"ShootDay":["code","description","sg_status_list"],"MocapTake":["code","description","sg_status_list"],"MocapSetup":["code","description","sg_status_list"],"Camera":["code","description","sg_status_list"],"MocapTakeRange":["code","description","sg_status_list"],"Sequence":["code","description","sg_status_list"],"Level":["code","description","sg_status_list"],"Episode":["code","description","sg_status_list"],"Version":["code","description","sg_status_list"]},"board_sorting":{"Upcoming":{"Task":[{"direction":"desc","field_name":"due_date"},{"direction":"asc","field_name":"content"}]},"Done":{"Task":[{"direction":"desc","field_name":"due_date"},{"direction":"asc","field_name":"content"}]},"Active":{"Task":[{"direction":"desc","field_name":"due_date"},{"direction":"asc","field_name":"content"}]}},"status_default":{"Version":{"pending_review_status":["rev"],"viewed_review_status":["vwd"]},"Task":{"final_review_status":["fin"]}},"entity_forms":{"TimeLog":["date","description","duration"]},"entity_forms_fixed":{"TimeLog":["date","description","duration"]},"enable_timelog_at_version_creation":false}' # noqa } self.assertEqual(expected, resp) diff --git a/tests/test_client.py b/tests/test_client.py index 72d59a445..c2fecb021 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -5,6 +5,7 @@ import base64 import datetime import urllib +import os import re try: import simplejson as json @@ -225,15 +226,61 @@ def test_connect_close(self): self.sg.close() self.assertEqual(None, self.sg._connection) - def test_network_retry(self): - """Network failure is retried""" + """Network failure is retried, with a sleep call between retries.""" self.sg._http_request.side_effect = httplib2.HttpLib2Error - self.assertRaises(httplib2.HttpLib2Error, self.sg.info) - self.assertTrue( - self.sg.config.max_rpc_attempts ==self.sg._http_request.call_count, - "Call is repeated") + with mock.patch("time.sleep") as mock_sleep: + self.assertRaises(httplib2.HttpLib2Error, self.sg.info) + self.assertTrue( + self.sg.config.max_rpc_attempts == self.sg._http_request.call_count, + "Call is repeated") + # Ensure that sleep was called with the retry interval between each attempt + attempt_interval = self.sg.config.rpc_attempt_interval / 1000.0 + calls = [mock.callargs(((attempt_interval,), {}))] + calls *= (self.sg.config.max_rpc_attempts - 1) + self.assertTrue( + mock_sleep.call_args_list == calls, + "Call is repeated at correct interval." + ) + + def test_set_retry_interval(self): + """Setting the retry interval through parameter and environment variable works.""" + original_env_val = os.environ.pop("SHOTGUN_API_RETRY_INTERVAL", None) + + try: + def run_interval_test(expected_interval, interval_property=None): + self.sg = api.Shotgun(self.config.server_url, + self.config.script_name, + self.config.api_key, + http_proxy=self.config.http_proxy, + connect=self.connect) + self._setup_mock() + if interval_property: + # if a value was provided for interval_property, set the + # config's property to that value. + self.sg.config.rpc_attempt_interval = interval_property + self.sg._http_request.side_effect = httplib2.HttpLib2Error + self.assertEqual(self.sg.config.rpc_attempt_interval, expected_interval) + self.test_network_retry() + + # Try passing parameter and ensure the correct interval is used. + run_interval_test(expected_interval=2500, interval_property=2500) + + # Try setting ENV VAR and ensure the correct interval is used. + os.environ["SHOTGUN_API_RETRY_INTERVAL"] = "2000" + run_interval_test(expected_interval=2000) + + # Try both parameter and environment variable, to ensure parameter wins. + run_interval_test(expected_interval=4000, interval_property=4000) + + finally: + # Restore environment variable. + if original_env_val is not None: + os.environ["SHOTGUN_API_RETRY_INTERVAL"] = original_env_val + elif "SHOTGUN_API_RETRY_INTERVAL" in os.environ: + os.environ.pop("SHOTGUN_API_RETRY_INTERVAL") + def test_http_error(self): """HTTP error raised and not retried.""" From c9f517f2b13890a637a4ced0c237ac3724ff5954 Mon Sep 17 00:00:00 2001 From: Will Cavanagh Date: Mon, 29 Jul 2019 13:26:23 -0400 Subject: [PATCH 222/389] SG-11735: Support for Python 3! (#202) Python 3 support is here! This release is also compatible with Python 2.6 and 2.7, as it was before. This release includes a large number of changes to accommodate the newer versions of Python, but functionally it should remain the same. --- .coveragerc | 2 +- .flake8 | 13 + .gitignore | 10 + .travis.yml | 87 +- HISTORY.rst | 4 + README.md | 84 +- appveyor.yml | 12 + .../examples/ami_version_packager.rst | 2 +- docs/cookbook/examples/basic_create_shot.rst | 2 +- docs/cookbook/examples/svn_integration.rst | 4 +- docs/installation.rst | 2 +- nose.cfg | 12 + run-tests | 12 +- run-tests-2.4 | 1 - run-tests-2.5 | 1 - setup.py | 12 +- shotgun_api3/__init__.py | 19 +- shotgun_api3/lib/README.md | 58 + shotgun_api3/lib/httplib2/__init__.py | 2237 +------------- shotgun_api3/lib/httplib2/python2/__init__.py | 2223 ++++++++++++++ .../lib/httplib2/{ => python2}/cacerts.txt | 0 .../lib/httplib2/{ => python2}/certs.py | 0 .../lib/httplib2/{ => python2}/iri2uri.py | 0 .../lib/httplib2/{ => python2}/socks.py | 0 shotgun_api3/lib/httplib2/python3/__init__.py | 2012 +++++++++++++ shotgun_api3/lib/httplib2/python3/cacerts.txt | 2196 ++++++++++++++ shotgun_api3/lib/httplib2/python3/certs.py | 42 + shotgun_api3/lib/httplib2/python3/iri2uri.py | 124 + shotgun_api3/lib/httplib2/python3/socks.py | 516 ++++ shotgun_api3/lib/mimetypes.py | 315 +- shotgun_api3/lib/mockgun/mockgun.py | 11 +- shotgun_api3/lib/mockgun/schema.py | 3 +- shotgun_api3/lib/requirements.txt | 2 +- shotgun_api3/lib/sgsix.py | 57 + shotgun_api3/lib/sgtimezone.py | 42 +- shotgun_api3/lib/simplejson/__init__.py | 438 --- shotgun_api3/lib/simplejson/_speedups.c | 2652 ----------------- shotgun_api3/lib/simplejson/decoder.py | 421 --- shotgun_api3/lib/simplejson/encoder.py | 503 ---- shotgun_api3/lib/simplejson/ordered_dict.py | 119 - shotgun_api3/lib/simplejson/scanner.py | 77 - shotgun_api3/lib/simplejson/tool.py | 39 - shotgun_api3/lib/six.py | 953 ++++++ shotgun_api3/sg_24.py | 27 - shotgun_api3/sg_25.py | 26 - shotgun_api3/sg_26.py | 48 - shotgun_api3/shotgun.py | 1019 ++++--- tests/base.py | 205 +- tests/ci_requirements.txt | 17 +- tests/dummy_data.py | 876 ------ tests/example_config | 10 + tests/httplib2test.py | 1398 --------- tests/run_appveyor.bat | 2 +- tests/test_api.py | 942 +++--- tests/test_api_long.py | 57 +- tests/test_client.py | 263 +- tests/test_mockgun.py | 4 +- tests/tests_proxy.py | 26 +- tests/tests_unit.py | 188 +- 59 files changed, 10042 insertions(+), 10385 deletions(-) create mode 100644 .flake8 create mode 100644 nose.cfg delete mode 100755 run-tests-2.4 delete mode 100755 run-tests-2.5 create mode 100644 shotgun_api3/lib/README.md create mode 100644 shotgun_api3/lib/httplib2/python2/__init__.py rename shotgun_api3/lib/httplib2/{ => python2}/cacerts.txt (100%) rename shotgun_api3/lib/httplib2/{ => python2}/certs.py (100%) rename shotgun_api3/lib/httplib2/{ => python2}/iri2uri.py (100%) rename shotgun_api3/lib/httplib2/{ => python2}/socks.py (100%) create mode 100644 shotgun_api3/lib/httplib2/python3/__init__.py create mode 100644 shotgun_api3/lib/httplib2/python3/cacerts.txt create mode 100644 shotgun_api3/lib/httplib2/python3/certs.py create mode 100644 shotgun_api3/lib/httplib2/python3/iri2uri.py create mode 100644 shotgun_api3/lib/httplib2/python3/socks.py create mode 100644 shotgun_api3/lib/sgsix.py delete mode 100644 shotgun_api3/lib/simplejson/__init__.py delete mode 100644 shotgun_api3/lib/simplejson/_speedups.c delete mode 100644 shotgun_api3/lib/simplejson/decoder.py delete mode 100644 shotgun_api3/lib/simplejson/encoder.py delete mode 100644 shotgun_api3/lib/simplejson/ordered_dict.py delete mode 100644 shotgun_api3/lib/simplejson/scanner.py delete mode 100644 shotgun_api3/lib/simplejson/tool.py create mode 100644 shotgun_api3/lib/six.py delete mode 100644 shotgun_api3/sg_24.py delete mode 100644 shotgun_api3/sg_25.py delete mode 100644 shotgun_api3/sg_26.py delete mode 100644 tests/dummy_data.py delete mode 100755 tests/httplib2test.py diff --git a/.coveragerc b/.coveragerc index 5878223d2..1072562cd 100644 --- a/.coveragerc +++ b/.coveragerc @@ -16,5 +16,5 @@ source=shotgun_api3 omit= shotgun_api3/lib/httplib2/* - shotgun_api3/lib/simplejson/* + shotgun_api3/lib/six.py shotgun_api3/lib/xmlrpclib.py diff --git a/.flake8 b/.flake8 new file mode 100644 index 000000000..65dc4511d --- /dev/null +++ b/.flake8 @@ -0,0 +1,13 @@ +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +[flake8] +max-line-length = 120 +exclude = shotgun_api3/lib/httplib2/*,shotgun_api3/lib/six.py,shotgun_api3/lib/xmlrpclib.py,tests/httplib2test.py,tests/mock.py \ No newline at end of file diff --git a/.gitignore b/.gitignore index 20ec5ddec..283d4a09f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,13 @@ +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + #python specific *.pyc diff --git a/.travis.yml b/.travis.yml index 89a7ee6c6..985e1d1bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,89 @@ +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + language: python -python: - - "2.6" - - "2.7" -# use trusty dist, since xenial (default) does not support python 2.6 -dist: trusty +# We need to test on multiple distros, since python 2.6 is not supported in xenial +# and 3.7 is not supported in trusty. For now just use trusty to test 2.6, and use +# the more modern xenial for 2.7 and 3.7. + +# Additionally, we'll test on multiple sites. To accomplish this, we store the +# secrets for the second site in a set of additional environment variables, +# and copy those into the standard environment variables when running on the +# second site. +matrix: + include: + + # Use trusty dist for python 2.6, since the built-in xenial distro (default) + # does not support Python 2.6 + # See https://docs.travis-ci.com/user/reference/xenial/#python-support + + # Python 2.6, Server #1 + - dist: trusty + python: "2.6" + # flake8 does not support python 2.6, so only run it on 2.7+ + env: + - RUN_FLAKE=false + + # Python 2.6, Server #2 + - dist: trusty + python: "2.6" + # flake8 does not support python 2.6, so only run it on 2.7+ + env: + - RUN_FLAKE=false + - SG_SERVER_URL=$SG_SERVER_URL_2 + - SG_API_KEY=$SG_API_KEY_2 + - SG_HUMAN_PASSWORD=$SG_HUMAN_PASSWORD_2 + + # Test python 2.7 and 3.7 on Xenial. + + # Python 2.7, Server #1 + - dist: xenial + python: "2.7" + env: + - RUN_FLAKE=true + + # Python 2.7, Server #2 + - dist: xenial + python: "2.7" + env: + - RUN_FLAKE=true + - SG_SERVER_URL=$SG_SERVER_URL_2 + - SG_API_KEY=$SG_API_KEY_2 + - SG_HUMAN_PASSWORD=$SG_HUMAN_PASSWORD_2 + + # Python 3.7, Server #1 + - dist: xenial + python: "3.7" + env: + - RUN_FLAKE=true + + # Python 3.7, Server #1 + - dist: xenial + python: "3.7" + env: + - RUN_FLAKE=true + - SG_SERVER_URL=$SG_SERVER_URL_2 + - SG_API_KEY=$SG_API_KEY_2 + - SG_HUMAN_PASSWORD=$SG_HUMAN_PASSWORD_2 # command to install dependencies install: - pip install -r tests/ci_requirements.txt before_script: - cp ./tests/example_config ./tests/config -# command to run tests -script: coverage run -m nose +# Run flake and then run tests +script: + - if [ -n "$RUN_FLAKE" = true ]; then flake8; fi + - coverage run -m nose --config="nose.cfg" after_success: coveralls notifications: email: - api@shotgunsoftware.com - slack: - rooms: - secure: NgcVxptQji2OL7EKx5owh21tOl4rRg51ydYhLPHpBIpBVzlqPxi1jbMHpcbl8mG+GuhU6y1D6kVQgQfuAfIWx5YOc4FodhOFZgeS+eol5RTmEepl1OT6XmAVgEclSZUYQmK25OkcxnFnOV/31RuDPXWcgCvSBZqTy6lAbOZ5VwQ= diff --git a/HISTORY.rst b/HISTORY.rst index 45950bbc7..13fe5ab99 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,10 @@ Shotgun Python API Changelog Here you can see the full list of changes between each Python API release. +v3.1.0 (2019 July 29) +===================== +- Adds support for Python 3.7 + v3.0.41 (2019 June 28) ===================== - Adds an optional sleep between retries specified via the `SHOTGUN_API_RETRY_INTERVAL` environment variable, or by setting `sg.config.rpc_attempt_interval`. diff --git a/README.md b/README.md index 1fff61770..57a22f83f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -[![VFX Platform](https://img.shields.io/badge/vfxplatform-2018-yellow.svg)](http://www.vfxplatform.com/) +[![VFX Platform](https://img.shields.io/badge/vfxplatform-2020-blue.svg)](http://www.vfxplatform.com/) +[![Python 2.6 2.7 3.7](https://img.shields.io/badge/python-2.6%20%7C%202.7%20%7C%203.7-blue.svg)](https://www.python.org/) [![Reference Documentation](http://img.shields.io/badge/doc-reference-blue.svg)](http://developer.shotgunsoftware.com/python-api) [![Build Status Linux](https://secure.travis-ci.org/shotgunsoftware/python-api.svg?branch=master)](http://travis-ci.org/shotgunsoftware/python-api) [![Build status Windows](https://ci.appveyor.com/api/projects/status/slvw7u4jatvdly98/branch/master?svg=true )](https://ci.appveyor.com/project/jfboismenu/python-api/branch/master) [![Coverage Status](https://coveralls.io/repos/github/shotgunsoftware/python-api/badge.svg?branch=master)](https://coveralls.io/github/shotgunsoftware/python-api?branch=master) -[![Linting](https://img.shields.io/badge/PEP8%20by-Hound%20CI-a873d1.svg)](https://houndci.com) # Shotgun Python API @@ -15,14 +15,10 @@ The latest version can always be found at http://github.com/shotgunsoftware/pyth ## Minimum Requirements * Shotgun server v2.4.12+. -* Python v2.6 - v2.7. - -## High Performance Requirements - -* Install [simplejson 2.1.6](http://pypi.python.org/pypi/simplejson/2.1.6) +* Python v2.6 - v2.7 or v3.7 ## Documentation -Tutorials and detailed documentation about the Python API are available at http://developer.shotgunsoftware.com/python-api). +Tutorials and detailed documentation about the Python API are available at http://developer.shotgunsoftware.com/python-api). Some useful direct links: @@ -39,12 +35,70 @@ You can see the [full history of the Python API on the documentation site](http: ## Updating HTTPLib2 1. Download the latest version of HTTPLib2 at https://pypi.org/project/httplib2. -2. Extract the python2/httplib2 into shotgun_api3/lib/http2lib without the test folder. -3. Scan the files for any references to importing httplib2 and make sure they import "from ." instead of "from httplib2" because the library isn't in the Python path. +2. Extract the python2/httplib2 into shotgun_api3/lib/http2lib/python2 without the test folder. +3. Extract the python3/httplib2 into shotgun_api3/lib/http2lib/python3 without the test folder. +4. Scan the files for any references to importing httplib2 and make sure they import "from ." instead of "from httplib2" because the library isn't in the Python path. + +## Maintaining Python 2 and 3 compatibility + +python-api should remain compatible with both Python 2, and 3. To make this easier, we use [six](https://six.readthedocs.io/). When adding code that works with types that have changed between Python 2 and 3, notably strings and files, it's advisable to use the `six` types for casting and comparisons. Be sure to follow Python 2 and 3 compatible conventions in code, especially when raising or capturing exceptions and printing. While we don't use `future`, [this page](https://python-future.org/compatible_idioms.html) contains a fairly comprehensive list of Python 2/3 compatibility sticking points to look out for. + +Additionally, the [python-modernize](https://python-modernize.readthedocs.io/en/latest/) tool can be helpful when updating Python 2 code for Python 3 compatibility. + +### Examples: + +#### Comparisons against changed types: + +Python 2: + +``` +if isinstance(my_variable, str): +``` + +Python 2/3: + +``` +if isinstance(my_variable, six.string_types): +``` + +#### Catching exceptions + +Python 2: + +``` +except SomeExceptionType, e: + print "I like to swallow exceptions!" +``` + +Python 2/3: + +``` +from __future__ import print_function +except SomeExceptionType as e: + print("I like to swallow exceptions!") +``` + +#### Print statements + +Python 2: + +``` +print "My spoon is too big!" +``` + +Python 2/3: + +``` +from __future__ import print_function +print("My spoon is too big!") +``` + + +Additionally, when testing locally, tests should be run for both python 2 and python 3 to ensure changes won't break cross-compatibility. -## Tests +## Tests -Integration and unit tests are provided. +Integration and unit tests are provided. - All tests require the [nose unit testing tools](http://nose.readthedocs.org), and a `tests/config` file (you can copy an example from `tests/example_config`). - Tests can be run individually like this: `nosetest tests/test_client.py` @@ -58,11 +112,11 @@ Integration and unit tests are provided. 1) Update the Changelog in the `HISTORY.rst` file - Add bullet points for any changes that have happened since the previous release. This may include changes you did not make so look at the commit history and make sure we don't miss anything. If you notice something was done that wasn't added to the changelog, hunt down that engineer and make them feel guilty for not doing so. This is a required step in making changes to the API. - - Try and match the language of previous change log messages. We want to keep a consistent voice. + - Try and match the language of previous change log messages. We want to keep a consistent voice. - Make sure the date of the release matches today. We try and keep this TBD until we're ready to do a release so it's easy to catch that it needs to be updated. - Make sure the version number is filled out and correct. We follow semantic versioning. Or more correctly, we should be following it. 2) Ensure any changes or additions to public methods are documented - - Update the Github wiki, and usually you'll need to update the Method Reference page with concise and exact documentation of the changes that are in this release. + - Update the Github wiki, and usually you'll need to update the Method Reference page with concise and exact documentation of the changes that are in this release. - Ensure that doc strings are updated in the code itself to work with Sphinx and are correctly formatted. - Examples are always good especially if this a new feature or method. - Think about a new user to the API trying to figure out how to use the features you're documenting. @@ -76,7 +130,7 @@ Integration and unit tests are provided. - Add more detailed information regarding the changes in this release. This is a great place to add examples, and reasons for the change! ### Letting the world know -We usually send an email to the `shotgun-dev` list with an announcement of the release and highlight the changes. +We usually send an email to the `shotgun-dev` list with an announcement of the release and highlight the changes. ### Prepare for the Next Dev Cycle 1) Update the `__version__` value in `shotgun_api3/shotgun.py` to the next version number with `.dev` appended to it. For example, `v3.0.24.dev` diff --git a/appveyor.yml b/appveyor.yml index bd71103bf..af5694f92 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,9 @@ environment: matrix: + - PYTHON: "C:\\Python26" - PYTHON: "C:\\Python27" + - PYTHON: "C:\\Python37" # To update these values, visit AppVeyor's site, click the user icon and scroll down to Encrypt Data. SG_SERVER_URL: @@ -28,6 +30,16 @@ environment: build: off +before_test: + # The certificate store of the build machine is out of date and is missing a + # new certificate authority used by Amazon for S3, so we need to update it. + # See https://developer.shotgunsoftware.com/c593f0aa/ + - ps: | + $cert_url = "https://www.amazontrust.com/repository/SFSRootCAG2.cer" + $cert_file = New-TemporaryFile + Invoke-WebRequest -Uri $cert_url -UseBasicParsing -OutFile $cert_file.FullName + Import-Certificate -FilePath $cert_file.FullName -CertStoreLocation Cert:\LocalMachine\Root + test_script: # Put your test command here. # If you don't need to build C extensions on 64-bit Python 3.3 or 3.4, diff --git a/docs/cookbook/examples/ami_version_packager.rst b/docs/cookbook/examples/ami_version_packager.rst index f0b08b942..7ef182782 100644 --- a/docs/cookbook/examples/ami_version_packager.rst +++ b/docs/cookbook/examples/ami_version_packager.rst @@ -253,5 +253,5 @@ It is intended to be used in conjunction with the script dicussed in :ref:`ami_h raise ShotgunException("Unknown action... :%s" % sa.action) - print "\nVersion Packager done!" + print("\nVersion Packager done!") diff --git a/docs/cookbook/examples/basic_create_shot.rst b/docs/cookbook/examples/basic_create_shot.rst index 0bd376b69..9f74de4bc 100644 --- a/docs/cookbook/examples/basic_create_shot.rst +++ b/docs/cookbook/examples/basic_create_shot.rst @@ -89,7 +89,7 @@ The Complete Example } result = sg.create('Shot', data) pprint(result) - print "The id of the %s is %d." % (result['type'], result['id']) + print("The id of the {} is {}.".format(result['type'], result['id'])) And here is the output:: diff --git a/docs/cookbook/examples/svn_integration.rst b/docs/cookbook/examples/svn_integration.rst index ade057af6..b45c4bee4 100644 --- a/docs/cookbook/examples/svn_integration.rst +++ b/docs/cookbook/examples/svn_integration.rst @@ -117,11 +117,11 @@ link to the Revision. 'created_by':{"type":"HumanUser", "id":result['id']} } revision = sg.create("Revision", parameters) - print "created Revision #"+str(revision_code) + print("created Revision #"+str(revision_code)) # Send error message if valid HumanUser is not found else: - print "Unable to find valid Shotgun User with login: "+author+", Revision not created in Shotgun." + print("Unable to find valid Shotgun User with login: "+author+", Revision not created in Shotgun.") diff --git a/docs/installation.rst b/docs/installation.rst index b6659ec25..880021ec1 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -9,7 +9,7 @@ Minimum Requirements - Shotgun server v5.4.14 or higher for API v3.0.16+. - Shotgun server v2.4.12 or higher for API v3.0.8. - Shotgun server v1.8 or higher for API v3.0.7. -- Python v2.4 - v2.7. (We do not currently support Python 3) +- Python 2.6 - 2.7 or Python 3.7 .. note:: Some features of the API are only supported by more recent versions of the Shotgun server. diff --git a/nose.cfg b/nose.cfg new file mode 100644 index 000000000..59c3f0974 --- /dev/null +++ b/nose.cfg @@ -0,0 +1,12 @@ +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +[nosetests] +exclude-dir=shotgun_api3/lib \ No newline at end of file diff --git a/run-tests b/run-tests index 045d6c199..dbe93f8b2 100755 --- a/run-tests +++ b/run-tests @@ -1 +1,11 @@ -clear && find ./ -name ".coverage" -delete && find ./ -name "*.pyc" -delete && nosetests -vd --with-cover --cover-package=shotgun_api3 +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +clear && find ./ -name ".coverage" -delete && find ./ -name "*.pyc" -delete && nosetests -vd --config="nose.cfg" --with-cover --cover-package=shotgun_api3 diff --git a/run-tests-2.4 b/run-tests-2.4 deleted file mode 100755 index f24bbc302..000000000 --- a/run-tests-2.4 +++ /dev/null @@ -1 +0,0 @@ -clear && find ./ -name ".coverage" -delete && find ./ -name "*.pyc" -delete && nosetests-2.4 -vd --stop --with-cover --cover-package=shotgun_api3 diff --git a/run-tests-2.5 b/run-tests-2.5 deleted file mode 100755 index 20fdfe95e..000000000 --- a/run-tests-2.5 +++ /dev/null @@ -1 +0,0 @@ -clear && find ./ -name ".coverage" -delete && find ./ -name "*.pyc" -delete && nosetests-2.5 -vd --stop --with-cover --cover-package=shotgun_api3 diff --git a/setup.py b/setup.py index 638625434..09309ae18 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,14 @@ # -*- coding: utf-8 -*- +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + import sys from setuptools import setup, find_packages @@ -17,7 +27,7 @@ setup( name='shotgun_api3', - version='3.0.41', + version='3.1.0', description='Shotgun Python API ', long_description=readme, author='Shotgun Software', diff --git a/shotgun_api3/__init__.py b/shotgun_api3/__init__.py index 4f0890628..fe83e1427 100644 --- a/shotgun_api3/__init__.py +++ b/shotgun_api3/__init__.py @@ -1,6 +1,15 @@ -from shotgun import (Shotgun, ShotgunError, ShotgunFileDownloadError, Fault, - AuthenticationFault, MissingTwoFactorAuthenticationFault, - UserCredentialsNotAllowedForSSOAuthenticationFault, - ProtocolError, ResponseError, Error, __version__) -from shotgun import SG_TIMEZONE as sg_timezone +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. +from .shotgun import (Shotgun, ShotgunError, ShotgunFileDownloadError, Fault, # noqa unused imports + AuthenticationFault, MissingTwoFactorAuthenticationFault, + UserCredentialsNotAllowedForSSOAuthenticationFault, + ProtocolError, ResponseError, Error, __version__) +from .shotgun import SG_TIMEZONE as sg_timezone # noqa unused imports diff --git a/shotgun_api3/lib/README.md b/shotgun_api3/lib/README.md new file mode 100644 index 000000000..6cc12188d --- /dev/null +++ b/shotgun_api3/lib/README.md @@ -0,0 +1,58 @@ +# Lib Submodules + +## Third Party Modules + +Some third-party modules are bundled with `python-api` inside lib. + +### httplib2 + +`httplib2` is used to make http connections to the shotgun server. We bundle both python2 and python3 compatible versions since httplib2 chose to maintain parallel versions of the module for python 2 and 3 compatibility. + +The version of `httplib2` bundled should be updated manually, however its version is included in the unused `shotgun_api3/lib/requirements.txt` to allow Github's automated CVE notifications to work. + +### mimetypes + +The `mimetypes` module is broken on Windows only for Python 2.7.0 to 2.7.9 inclusively. +We bundle the version from 2.7.10 + +See bugs: + + * [9291](http://bugs.python.org/issue9291) (Fixed in 2.7.7) + * [21652](http://bugs.python.org/issue21652) (Fixed in 2.7.8) + * [22028](http://bugs.python.org/issue22028) (Fixed in 2.7.10) + +The version of `mimetypes` bundled should be updated manually if necessary, however it is unlikely this will be needed, as it is only used for Python versions 2.7.0 - 2.7.9, and newer Python versions simply use the native `mimetypes` module. + +### six + +Six is a Python 2/3 compatibility library. In python-api, it's used to make simultaneous support for Python on 2 and 3 easier to maintain and more readable, but allowing the use of common helper functions, unified interfaces for modules that changed, and variables to ease type comparisons. For more on six, see the [documentation](https://six.readthedocs.io/). + +The version of `six` bundled should be updated manually, however its version is included in the unused `shotgun_api3/lib/requirements.txt` to allow Github's automated CVE notifications to work. + +## Shotgun Modules + +### sgsix + +`sgsix` is a module that contains extensions to `six`. These might be additional helper functions, variables, etc. that supplement six's functionality. It is intended that `sgsix` can be used within other packages that include or depend on the `python-api` package as well. + +### sgtimezone + +`sgtimezone` contains classes for easing the conversion between the server (UTC) timezone and client timezone. + +### mockgun + +Mockgun is a Shotgun API mocker. It's a class that has got *most* of the same +methods and parameters that the Shotgun API has got. Mockgun is essentially a +Shotgun *emulator* that (for basic operations) looks and feels like Shotgun. + +The primary purpose of Mockgun is to drive unit test rigs where it becomes +too slow, cumbersome or non-practical to connect to a real Shotgun. Using a +Mockgun for unit tests means that a test can be rerun over and over again +from exactly the same database state. This can be hard to do if you connect +to a live Shotgun instance. + +## Lib `requirements.txt` + +The file `shotgun_api3/lib/requirements.txt` is not used to install any packages, however exists so that automated checks for CVEs in dependencies will know about bundled packages. + +For this reason, it's important to add any newly bundled packages to this file, and to keep the file up to date if the bundled version of a module changes. \ No newline at end of file diff --git a/shotgun_api3/lib/httplib2/__init__.py b/shotgun_api3/lib/httplib2/__init__.py index b3cc0b2fb..680183bc4 100644 --- a/shotgun_api3/lib/httplib2/__init__.py +++ b/shotgun_api3/lib/httplib2/__init__.py @@ -1,2223 +1,16 @@ -"""Small, fast HTTP client library for Python. - -Features persistent connections, cache, and Google App Engine Standard -Environment support. -""" - -from __future__ import print_function - -__author__ = "Joe Gregorio (joe@bitworking.org)" -__copyright__ = "Copyright 2006, Joe Gregorio" -__contributors__ = [ - "Thomas Broyer (t.broyer@ltgt.net)", - "James Antill", - "Xavier Verges Farrero", - "Jonathan Feinberg", - "Blair Zajac", - "Sam Ruby", - "Louis Nyffenegger", - "Alex Yu", -] -__license__ = "MIT" -__version__ = '0.12.0' - -import base64 -import calendar -import copy -import email -import email.FeedParser -import email.Message -import email.Utils -import errno -import gzip -import httplib -import os -import random -import re -import StringIO -import sys -import time -import urllib -import urlparse -import zlib - -try: - from hashlib import sha1 as _sha, md5 as _md5 -except ImportError: - # prior to Python 2.5, these were separate modules - import sha - import md5 - - _sha = sha.new - _md5 = md5.new -import hmac -from gettext import gettext as _ -import socket - -try: - from . import socks -except ImportError: - try: - import socks - except (ImportError, AttributeError): - socks = None - -# Build the appropriate socket wrapper for ssl -ssl = None -ssl_SSLError = None -ssl_CertificateError = None -try: - import ssl # python 2.6 -except ImportError: - pass -if ssl is not None: - ssl_SSLError = getattr(ssl, "SSLError", None) - ssl_CertificateError = getattr(ssl, "CertificateError", None) - - -def _ssl_wrap_socket( - sock, key_file, cert_file, disable_validation, ca_certs, ssl_version, hostname -): - if disable_validation: - cert_reqs = ssl.CERT_NONE - else: - cert_reqs = ssl.CERT_REQUIRED - if ssl_version is None: - ssl_version = ssl.PROTOCOL_SSLv23 - - if hasattr(ssl, "SSLContext"): # Python 2.7.9 - context = ssl.SSLContext(ssl_version) - context.verify_mode = cert_reqs - context.check_hostname = cert_reqs != ssl.CERT_NONE - if cert_file: - context.load_cert_chain(cert_file, key_file) - if ca_certs: - context.load_verify_locations(ca_certs) - return context.wrap_socket(sock, server_hostname=hostname) - else: - return ssl.wrap_socket( - sock, - keyfile=key_file, - certfile=cert_file, - cert_reqs=cert_reqs, - ca_certs=ca_certs, - ssl_version=ssl_version, - ) - - -def _ssl_wrap_socket_unsupported( - sock, key_file, cert_file, disable_validation, ca_certs, ssl_version, hostname -): - if not disable_validation: - raise CertificateValidationUnsupported( - "SSL certificate validation is not supported without " - "the ssl module installed. To avoid this error, install " - "the ssl module, or explicity disable validation." - ) - ssl_sock = socket.ssl(sock, key_file, cert_file) - return httplib.FakeSocket(sock, ssl_sock) - - -if ssl is None: - _ssl_wrap_socket = _ssl_wrap_socket_unsupported - -if sys.version_info >= (2, 3): - from iri2uri import iri2uri +from .. import six + +# import the proper implementation into the module namespace depending on the +# current python version. httplib2 supports python 2/3 by forking the code rather +# than with a single cross-compatible module. Rather than modify third party code, +# we'll just import the appropriate branch here. +if six.PY3: + from .python3 import * + from .python3 import socks # ensure include in namespace + import ssl + ssl_error_classes = (ssl.SSLError, ssl.CertificateError) else: - - def iri2uri(uri): - return uri - - -def has_timeout(timeout): # python 2.6 - if hasattr(socket, "_GLOBAL_DEFAULT_TIMEOUT"): - return timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT - return timeout is not None - - -__all__ = [ - "Http", - "Response", - "ProxyInfo", - "HttpLib2Error", - "RedirectMissingLocation", - "RedirectLimit", - "FailedToDecompressContent", - "UnimplementedDigestAuthOptionError", - "UnimplementedHmacDigestAuthOptionError", - "debuglevel", - "ProxiesUnavailableError", -] - -# The httplib debug level, set to a non-zero value to get debug output -debuglevel = 0 - -# A request will be tried 'RETRIES' times if it fails at the socket/connection level. -RETRIES = 2 - -# Python 2.3 support -if sys.version_info < (2, 4): - - def sorted(seq): - seq.sort() - return seq - - -# Python 2.3 support -def HTTPResponse__getheaders(self): - """Return list of (header, value) tuples.""" - if self.msg is None: - raise httplib.ResponseNotReady() - return self.msg.items() - - -if not hasattr(httplib.HTTPResponse, "getheaders"): - httplib.HTTPResponse.getheaders = HTTPResponse__getheaders - - -# All exceptions raised here derive from HttpLib2Error -class HttpLib2Error(Exception): - pass - - -# Some exceptions can be caught and optionally -# be turned back into responses. -class HttpLib2ErrorWithResponse(HttpLib2Error): - def __init__(self, desc, response, content): - self.response = response - self.content = content - HttpLib2Error.__init__(self, desc) - - -class RedirectMissingLocation(HttpLib2ErrorWithResponse): - pass - - -class RedirectLimit(HttpLib2ErrorWithResponse): - pass - - -class FailedToDecompressContent(HttpLib2ErrorWithResponse): - pass - - -class UnimplementedDigestAuthOptionError(HttpLib2ErrorWithResponse): - pass - - -class UnimplementedHmacDigestAuthOptionError(HttpLib2ErrorWithResponse): - pass - - -class MalformedHeader(HttpLib2Error): - pass - - -class RelativeURIError(HttpLib2Error): - pass - - -class ServerNotFoundError(HttpLib2Error): - pass - - -class ProxiesUnavailableError(HttpLib2Error): - pass - - -class CertificateValidationUnsupported(HttpLib2Error): - pass - - -class SSLHandshakeError(HttpLib2Error): - pass - - -class NotSupportedOnThisPlatform(HttpLib2Error): - pass - - -class CertificateHostnameMismatch(SSLHandshakeError): - def __init__(self, desc, host, cert): - HttpLib2Error.__init__(self, desc) - self.host = host - self.cert = cert - - -class NotRunningAppEngineEnvironment(HttpLib2Error): - pass - - -# Open Items: -# ----------- -# Proxy support - -# Are we removing the cached content too soon on PUT (only delete on 200 Maybe?) - -# Pluggable cache storage (supports storing the cache in -# flat files by default. We need a plug-in architecture -# that can support Berkeley DB and Squid) - -# == Known Issues == -# Does not handle a resource that uses conneg and Last-Modified but no ETag as a cache validator. -# Does not handle Cache-Control: max-stale -# Does not use Age: headers when calculating cache freshness. - -# The number of redirections to follow before giving up. -# Note that only GET redirects are automatically followed. -# Will also honor 301 requests by saving that info and never -# requesting that URI again. -DEFAULT_MAX_REDIRECTS = 5 - -from . import certs -CA_CERTS = certs.where() - -# Which headers are hop-by-hop headers by default -HOP_BY_HOP = [ - "connection", - "keep-alive", - "proxy-authenticate", - "proxy-authorization", - "te", - "trailers", - "transfer-encoding", - "upgrade", -] - - -def _get_end2end_headers(response): - hopbyhop = list(HOP_BY_HOP) - hopbyhop.extend([x.strip() for x in response.get("connection", "").split(",")]) - return [header for header in response.keys() if header not in hopbyhop] - - -URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") - - -def parse_uri(uri): - """Parses a URI using the regex given in Appendix B of RFC 3986. - - (scheme, authority, path, query, fragment) = parse_uri(uri) - """ - groups = URI.match(uri).groups() - return (groups[1], groups[3], groups[4], groups[6], groups[8]) - - -def urlnorm(uri): - (scheme, authority, path, query, fragment) = parse_uri(uri) - if not scheme or not authority: - raise RelativeURIError("Only absolute URIs are allowed. uri = %s" % uri) - authority = authority.lower() - scheme = scheme.lower() - if not path: - path = "/" - # Could do syntax based normalization of the URI before - # computing the digest. See Section 6.2.2 of Std 66. - request_uri = query and "?".join([path, query]) or path - scheme = scheme.lower() - defrag_uri = scheme + "://" + authority + request_uri - return scheme, authority, request_uri, defrag_uri - - -# Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/) -re_url_scheme = re.compile(r"^\w+://") -re_unsafe = re.compile(r"[^\w\-_.()=!]+") - - -def safename(filename): - """Return a filename suitable for the cache. - Strips dangerous and common characters to create a filename we - can use to store the cache in. - """ - if isinstance(filename, str): - filename_bytes = filename - filename = filename.decode("utf-8") - else: - filename_bytes = filename.encode("utf-8") - filemd5 = _md5(filename_bytes).hexdigest() - filename = re_url_scheme.sub("", filename) - filename = re_unsafe.sub("", filename) - - # limit length of filename (vital for Windows) - # https://github.com/httplib2/httplib2/pull/74 - # C:\Users\ \AppData\Local\Temp\ , - # 9 chars + max 104 chars + 20 chars + x + 1 + 32 = max 259 chars - # Thus max safe filename x = 93 chars. Let it be 90 to make a round sum: - filename = filename[:90] - - return ",".join((filename, filemd5)) - - -NORMALIZE_SPACE = re.compile(r"(?:\r\n)?[ \t]+") - - -def _normalize_headers(headers): - return dict( - [ - (key.lower(), NORMALIZE_SPACE.sub(value, " ").strip()) - for (key, value) in headers.iteritems() - ] - ) - - -def _parse_cache_control(headers): - retval = {} - if "cache-control" in headers: - parts = headers["cache-control"].split(",") - parts_with_args = [ - tuple([x.strip().lower() for x in part.split("=", 1)]) - for part in parts - if -1 != part.find("=") - ] - parts_wo_args = [ - (name.strip().lower(), 1) for name in parts if -1 == name.find("=") - ] - retval = dict(parts_with_args + parts_wo_args) - return retval - - -# Whether to use a strict mode to parse WWW-Authenticate headers -# Might lead to bad results in case of ill-formed header value, -# so disabled by default, falling back to relaxed parsing. -# Set to true to turn on, usefull for testing servers. -USE_WWW_AUTH_STRICT_PARSING = 0 - -# In regex below: -# [^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+ matches a "token" as defined by HTTP -# "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?" matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space -# Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both: -# \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"? -WWW_AUTH_STRICT = re.compile( - r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$" -) -WWW_AUTH_RELAXED = re.compile( - r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(? current_age: - retval = "FRESH" - return retval - - -def _decompressContent(response, new_content): - content = new_content - try: - encoding = response.get("content-encoding", None) - if encoding in ["gzip", "deflate"]: - if encoding == "gzip": - content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read() - if encoding == "deflate": - content = zlib.decompress(content, -zlib.MAX_WBITS) - response["content-length"] = str(len(content)) - # Record the historical presence of the encoding in a way the won't interfere. - response["-content-encoding"] = response["content-encoding"] - del response["content-encoding"] - except (IOError, zlib.error): - content = "" - raise FailedToDecompressContent( - _("Content purported to be compressed with %s but failed to decompress.") - % response.get("content-encoding"), - response, - content, - ) - return content - - -def _updateCache(request_headers, response_headers, content, cache, cachekey): - if cachekey: - cc = _parse_cache_control(request_headers) - cc_response = _parse_cache_control(response_headers) - if "no-store" in cc or "no-store" in cc_response: - cache.delete(cachekey) - else: - info = email.Message.Message() - for key, value in response_headers.iteritems(): - if key not in ["status", "content-encoding", "transfer-encoding"]: - info[key] = value - - # Add annotations to the cache to indicate what headers - # are variant for this request. - vary = response_headers.get("vary", None) - if vary: - vary_headers = vary.lower().replace(" ", "").split(",") - for header in vary_headers: - key = "-varied-%s" % header - try: - info[key] = request_headers[header] - except KeyError: - pass - - status = response_headers.status - if status == 304: - status = 200 - - status_header = "status: %d\r\n" % status - - header_str = info.as_string() - - header_str = re.sub("\r(?!\n)|(? 0: - service = "cl" - # No point in guessing Base or Spreadsheet - # elif request_uri.find("spreadsheets") > 0: - # service = "wise" - - auth = dict( - Email=credentials[0], - Passwd=credentials[1], - service=service, - source=headers["user-agent"], - ) - resp, content = self.http.request( - "https://www.google.com/accounts/ClientLogin", - method="POST", - body=urlencode(auth), - headers={"Content-Type": "application/x-www-form-urlencoded"}, - ) - lines = content.split("\n") - d = dict([tuple(line.split("=", 1)) for line in lines if line]) - if resp.status == 403: - self.Auth = "" - else: - self.Auth = d["Auth"] - - def request(self, method, request_uri, headers, content): - """Modify the request headers to add the appropriate - Authorization header.""" - headers["authorization"] = "GoogleLogin Auth=" + self.Auth - - -AUTH_SCHEME_CLASSES = { - "basic": BasicAuthentication, - "wsse": WsseAuthentication, - "digest": DigestAuthentication, - "hmacdigest": HmacDigestAuthentication, - "googlelogin": GoogleLoginAuthentication, -} - -AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"] - - -class FileCache(object): - """Uses a local directory as a store for cached files. - Not really safe to use if multiple threads or processes are going to - be running on the same cache. - """ - - def __init__( - self, cache, safe=safename - ): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior - self.cache = cache - self.safe = safe - if not os.path.exists(cache): - os.makedirs(self.cache) - - def get(self, key): - retval = None - cacheFullPath = os.path.join(self.cache, self.safe(key)) - try: - f = file(cacheFullPath, "rb") - retval = f.read() - f.close() - except IOError: - pass - return retval - - def set(self, key, value): - cacheFullPath = os.path.join(self.cache, self.safe(key)) - f = file(cacheFullPath, "wb") - f.write(value) - f.close() - - def delete(self, key): - cacheFullPath = os.path.join(self.cache, self.safe(key)) - if os.path.exists(cacheFullPath): - os.remove(cacheFullPath) - - -class Credentials(object): - def __init__(self): - self.credentials = [] - - def add(self, name, password, domain=""): - self.credentials.append((domain.lower(), name, password)) - - def clear(self): - self.credentials = [] - - def iter(self, domain): - for (cdomain, name, password) in self.credentials: - if cdomain == "" or domain == cdomain: - yield (name, password) - - -class KeyCerts(Credentials): - """Identical to Credentials except that - name/password are mapped to key/cert.""" - - pass - - -class AllHosts(object): - pass - - -class ProxyInfo(object): - """Collect information required to use a proxy.""" - - bypass_hosts = () - - def __init__( - self, - proxy_type, - proxy_host, - proxy_port, - proxy_rdns=True, - proxy_user=None, - proxy_pass=None, - proxy_headers=None, - ): - """Args: - - proxy_type: The type of proxy server. This must be set to one of - socks.PROXY_TYPE_XXX constants. For example: p = - ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, proxy_host='localhost', - proxy_port=8000) - proxy_host: The hostname or IP address of the proxy server. - proxy_port: The port that the proxy server is running on. - proxy_rdns: If True (default), DNS queries will not be performed - locally, and instead, handed to the proxy to resolve. This is useful - if the network does not allow resolution of non-local names. In - httplib2 0.9 and earlier, this defaulted to False. - proxy_user: The username used to authenticate with the proxy server. - proxy_pass: The password used to authenticate with the proxy server. - proxy_headers: Additional or modified headers for the proxy connect - request. - """ - self.proxy_type = proxy_type - self.proxy_host = proxy_host - self.proxy_port = proxy_port - self.proxy_rdns = proxy_rdns - self.proxy_user = proxy_user - self.proxy_pass = proxy_pass - self.proxy_headers = proxy_headers - - def astuple(self): - return ( - self.proxy_type, - self.proxy_host, - self.proxy_port, - self.proxy_rdns, - self.proxy_user, - self.proxy_pass, - self.proxy_headers, - ) - - def isgood(self): - return (self.proxy_host != None) and (self.proxy_port != None) - - def applies_to(self, hostname): - return not self.bypass_host(hostname) - - def bypass_host(self, hostname): - """Has this host been excluded from the proxy config""" - if self.bypass_hosts is AllHosts: - return True - - hostname = "." + hostname.lstrip(".") - for skip_name in self.bypass_hosts: - # *.suffix - if skip_name.startswith(".") and hostname.endswith(skip_name): - return True - # exact match - if hostname == "." + skip_name: - return True - return False - - def __repr__(self): - return ( - "" - ).format(p=self) - - -def proxy_info_from_environment(method="http"): - """Read proxy info from the environment variables. - """ - if method not in ["http", "https"]: - return - - env_var = method + "_proxy" - url = os.environ.get(env_var, os.environ.get(env_var.upper())) - if not url: - return - return proxy_info_from_url(url, method, None) - - -def proxy_info_from_url(url, method="http", noproxy=None): - """Construct a ProxyInfo from a URL (such as http_proxy env var) - """ - url = urlparse.urlparse(url) - username = None - password = None - port = None - if "@" in url[1]: - ident, host_port = url[1].split("@", 1) - if ":" in ident: - username, password = ident.split(":", 1) - else: - password = ident - else: - host_port = url[1] - if ":" in host_port: - host, port = host_port.split(":", 1) - else: - host = host_port - - if port: - port = int(port) - else: - port = dict(https=443, http=80)[method] - - proxy_type = 3 # socks.PROXY_TYPE_HTTP - pi = ProxyInfo( - proxy_type=proxy_type, - proxy_host=host, - proxy_port=port, - proxy_user=username or None, - proxy_pass=password or None, - proxy_headers=None, - ) - - bypass_hosts = [] - # If not given an explicit noproxy value, respect values in env vars. - if noproxy is None: - noproxy = os.environ.get("no_proxy", os.environ.get("NO_PROXY", "")) - # Special case: A single '*' character means all hosts should be bypassed. - if noproxy == "*": - bypass_hosts = AllHosts - elif noproxy.strip(): - bypass_hosts = noproxy.split(",") - bypass_hosts = filter(bool, bypass_hosts) # To exclude empty string. - - pi.bypass_hosts = bypass_hosts - return pi - - -class HTTPConnectionWithTimeout(httplib.HTTPConnection): - """HTTPConnection subclass that supports timeouts - - All timeouts are in seconds. If None is passed for timeout then - Python's default timeout for sockets will be used. See for example - the docs of socket.setdefaulttimeout(): - http://docs.python.org/library/socket.html#socket.setdefaulttimeout - """ - - def __init__(self, host, port=None, strict=None, timeout=None, proxy_info=None): - httplib.HTTPConnection.__init__(self, host, port, strict) - self.timeout = timeout - self.proxy_info = proxy_info - - def connect(self): - """Connect to the host and port specified in __init__.""" - # Mostly verbatim from httplib.py. - if self.proxy_info and socks is None: - raise ProxiesUnavailableError( - "Proxy support missing but proxy use was requested!" - ) - msg = "getaddrinfo returns an empty list" - if self.proxy_info and self.proxy_info.isgood(): - use_proxy = True - proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( - self.proxy_info.astuple() - ) - - host = proxy_host - port = proxy_port - else: - use_proxy = False - - host = self.host - port = self.port - - for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - try: - if use_proxy: - self.sock = socks.socksocket(af, socktype, proto) - self.sock.setproxy( - proxy_type, - proxy_host, - proxy_port, - proxy_rdns, - proxy_user, - proxy_pass, - proxy_headers, - ) - else: - self.sock = socket.socket(af, socktype, proto) - self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - # Different from httplib: support timeouts. - if has_timeout(self.timeout): - self.sock.settimeout(self.timeout) - # End of difference from httplib. - if self.debuglevel > 0: - print("connect: (%s, %s) ************" % (self.host, self.port)) - if use_proxy: - print( - "proxy: %s ************" - % str( - ( - proxy_host, - proxy_port, - proxy_rdns, - proxy_user, - proxy_pass, - proxy_headers, - ) - ) - ) - if use_proxy: - self.sock.connect((self.host, self.port) + sa[2:]) - else: - self.sock.connect(sa) - except socket.error as msg: - if self.debuglevel > 0: - print("connect fail: (%s, %s)" % (self.host, self.port)) - if use_proxy: - print( - "proxy: %s" - % str( - ( - proxy_host, - proxy_port, - proxy_rdns, - proxy_user, - proxy_pass, - proxy_headers, - ) - ) - ) - if self.sock: - self.sock.close() - self.sock = None - continue - break - if not self.sock: - raise socket.error(msg) - - -class HTTPSConnectionWithTimeout(httplib.HTTPSConnection): - """This class allows communication via SSL. - - All timeouts are in seconds. If None is passed for timeout then - Python's default timeout for sockets will be used. See for example - the docs of socket.setdefaulttimeout(): - http://docs.python.org/library/socket.html#socket.setdefaulttimeout - """ - - def __init__( - self, - host, - port=None, - key_file=None, - cert_file=None, - strict=None, - timeout=None, - proxy_info=None, - ca_certs=None, - disable_ssl_certificate_validation=False, - ssl_version=None, - ): - httplib.HTTPSConnection.__init__( - self, host, port=port, key_file=key_file, cert_file=cert_file, strict=strict - ) - self.timeout = timeout - self.proxy_info = proxy_info - if ca_certs is None: - ca_certs = CA_CERTS - self.ca_certs = ca_certs - self.disable_ssl_certificate_validation = disable_ssl_certificate_validation - self.ssl_version = ssl_version - - # The following two methods were adapted from https_wrapper.py, released - # with the Google Appengine SDK at - # http://googleappengine.googlecode.com/svn-history/r136/trunk/python/google/appengine/tools/https_wrapper.py - # under the following license: - # - # Copyright 2007 Google Inc. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. - # You may obtain a copy of the License at - # - # http://www.apache.org/licenses/LICENSE-2.0 - # - # Unless required by applicable law or agreed to in writing, software - # distributed under the License is distributed on an "AS IS" BASIS, - # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - # See the License for the specific language governing permissions and - # limitations under the License. - # - - def _GetValidHostsForCert(self, cert): - """Returns a list of valid host globs for an SSL certificate. - - Args: - cert: A dictionary representing an SSL certificate. - Returns: - list: A list of valid host globs. - """ - if "subjectAltName" in cert: - return [x[1] for x in cert["subjectAltName"] if x[0].lower() == "dns"] - else: - return [x[0][1] for x in cert["subject"] if x[0][0].lower() == "commonname"] - - def _ValidateCertificateHostname(self, cert, hostname): - """Validates that a given hostname is valid for an SSL certificate. - - Args: - cert: A dictionary representing an SSL certificate. - hostname: The hostname to test. - Returns: - bool: Whether or not the hostname is valid for this certificate. - """ - hosts = self._GetValidHostsForCert(cert) - for host in hosts: - host_re = host.replace(".", "\.").replace("*", "[^.]*") - if re.search("^%s$" % (host_re,), hostname, re.I): - return True - return False - - def connect(self): - "Connect to a host on a given (SSL) port." - - msg = "getaddrinfo returns an empty list" - if self.proxy_info and self.proxy_info.isgood(): - use_proxy = True - proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( - self.proxy_info.astuple() - ) - - host = proxy_host - port = proxy_port - else: - use_proxy = False - - host = self.host - port = self.port - - address_info = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) - for family, socktype, proto, canonname, sockaddr in address_info: - try: - if use_proxy: - sock = socks.socksocket(family, socktype, proto) - - sock.setproxy( - proxy_type, - proxy_host, - proxy_port, - proxy_rdns, - proxy_user, - proxy_pass, - proxy_headers, - ) - else: - sock = socket.socket(family, socktype, proto) - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - - if has_timeout(self.timeout): - sock.settimeout(self.timeout) - - if use_proxy: - sock.connect((self.host, self.port) + sockaddr[:2]) - else: - sock.connect(sockaddr) - self.sock = _ssl_wrap_socket( - sock, - self.key_file, - self.cert_file, - self.disable_ssl_certificate_validation, - self.ca_certs, - self.ssl_version, - self.host, - ) - if self.debuglevel > 0: - print("connect: (%s, %s)" % (self.host, self.port)) - if use_proxy: - print( - "proxy: %s" - % str( - ( - proxy_host, - proxy_port, - proxy_rdns, - proxy_user, - proxy_pass, - proxy_headers, - ) - ) - ) - if not self.disable_ssl_certificate_validation: - cert = self.sock.getpeercert() - hostname = self.host.split(":", 0)[0] - if not self._ValidateCertificateHostname(cert, hostname): - raise CertificateHostnameMismatch( - "Server presented certificate that does not match " - "host %s: %s" % (hostname, cert), - hostname, - cert, - ) - except ( - ssl_SSLError, - ssl_CertificateError, - CertificateHostnameMismatch, - ) as e: - if sock: - sock.close() - if self.sock: - self.sock.close() - self.sock = None - # Unfortunately the ssl module doesn't seem to provide any way - # to get at more detailed error information, in particular - # whether the error is due to certificate validation or - # something else (such as SSL protocol mismatch). - if getattr(e, "errno", None) == ssl.SSL_ERROR_SSL: - raise SSLHandshakeError(e) - else: - raise - except (socket.timeout, socket.gaierror): - raise - except socket.error as msg: - if self.debuglevel > 0: - print("connect fail: (%s, %s)" % (self.host, self.port)) - if use_proxy: - print( - "proxy: %s" - % str( - ( - proxy_host, - proxy_port, - proxy_rdns, - proxy_user, - proxy_pass, - proxy_headers, - ) - ) - ) - if self.sock: - self.sock.close() - self.sock = None - continue - break - if not self.sock: - raise socket.error(msg) - - -SCHEME_TO_CONNECTION = { - "http": HTTPConnectionWithTimeout, - "https": HTTPSConnectionWithTimeout, -} - - -def _new_fixed_fetch(validate_certificate): - - def fixed_fetch( - url, - payload=None, - method="GET", - headers={}, - allow_truncated=False, - follow_redirects=True, - deadline=None, - ): - return fetch( - url, - payload=payload, - method=method, - headers=headers, - allow_truncated=allow_truncated, - follow_redirects=follow_redirects, - deadline=deadline, - validate_certificate=validate_certificate, - ) - - return fixed_fetch - - -class AppEngineHttpConnection(httplib.HTTPConnection): - """Use httplib on App Engine, but compensate for its weirdness. - - The parameters key_file, cert_file, proxy_info, ca_certs, - disable_ssl_certificate_validation, and ssl_version are all dropped on - the ground. - """ - - def __init__( - self, - host, - port=None, - key_file=None, - cert_file=None, - strict=None, - timeout=None, - proxy_info=None, - ca_certs=None, - disable_ssl_certificate_validation=False, - ssl_version=None, - ): - httplib.HTTPConnection.__init__( - self, host, port=port, strict=strict, timeout=timeout - ) - - -class AppEngineHttpsConnection(httplib.HTTPSConnection): - """Same as AppEngineHttpConnection, but for HTTPS URIs. - - The parameters proxy_info, ca_certs, disable_ssl_certificate_validation, - and ssl_version are all dropped on the ground. - """ - - def __init__( - self, - host, - port=None, - key_file=None, - cert_file=None, - strict=None, - timeout=None, - proxy_info=None, - ca_certs=None, - disable_ssl_certificate_validation=False, - ssl_version=None, - ): - httplib.HTTPSConnection.__init__( - self, - host, - port=port, - key_file=key_file, - cert_file=cert_file, - strict=strict, - timeout=timeout, - ) - self._fetch = _new_fixed_fetch(not disable_ssl_certificate_validation) - - -# Use a different connection object for Google App Engine Standard Environment. -def is_gae_instance(): - server_software = os.environ.get('SERVER_SOFTWARE', '') - if (server_software.startswith('Google App Engine/') or - server_software.startswith('Development/') or - server_software.startswith('testutil/')): - return True - return False - - -try: - if not is_gae_instance(): - raise NotRunningAppEngineEnvironment() - - from google.appengine.api import apiproxy_stub_map - if apiproxy_stub_map.apiproxy.GetStub("urlfetch") is None: - raise ImportError - - from google.appengine.api.urlfetch import fetch - - # Update the connection classes to use the Googel App Engine specific ones. - SCHEME_TO_CONNECTION = { - "http": AppEngineHttpConnection, - "https": AppEngineHttpsConnection, - } -except (ImportError, NotRunningAppEngineEnvironment): - pass - - -class Http(object): - """An HTTP client that handles: - - - all methods - - caching - - ETags - - compression, - - HTTPS - - Basic - - Digest - - WSSE - - and more. - """ - - def __init__( - self, - cache=None, - timeout=None, - proxy_info=proxy_info_from_environment, - ca_certs=None, - disable_ssl_certificate_validation=False, - ssl_version=None, - ): - """If 'cache' is a string then it is used as a directory name for - a disk cache. Otherwise it must be an object that supports the - same interface as FileCache. - - All timeouts are in seconds. If None is passed for timeout - then Python's default timeout for sockets will be used. See - for example the docs of socket.setdefaulttimeout(): - http://docs.python.org/library/socket.html#socket.setdefaulttimeout - - `proxy_info` may be: - - a callable that takes the http scheme ('http' or 'https') and - returns a ProxyInfo instance per request. By default, uses - proxy_nfo_from_environment. - - a ProxyInfo instance (static proxy config). - - None (proxy disabled). - - ca_certs is the path of a file containing root CA certificates for SSL - server certificate validation. By default, a CA cert file bundled with - httplib2 is used. - - If disable_ssl_certificate_validation is true, SSL cert validation will - not be performed. - - By default, ssl.PROTOCOL_SSLv23 will be used for the ssl version. - """ - self.proxy_info = proxy_info - self.ca_certs = ca_certs - self.disable_ssl_certificate_validation = disable_ssl_certificate_validation - self.ssl_version = ssl_version - - # Map domain name to an httplib connection - self.connections = {} - # The location of the cache, for now a directory - # where cached responses are held. - if cache and isinstance(cache, basestring): - self.cache = FileCache(cache) - else: - self.cache = cache - - # Name/password - self.credentials = Credentials() - - # Key/cert - self.certificates = KeyCerts() - - # authorization objects - self.authorizations = [] - - # If set to False then no redirects are followed, even safe ones. - self.follow_redirects = True - - # Which HTTP methods do we apply optimistic concurrency to, i.e. - # which methods get an "if-match:" etag header added to them. - self.optimistic_concurrency_methods = ["PUT", "PATCH"] - - # If 'follow_redirects' is True, and this is set to True then - # all redirecs are followed, including unsafe ones. - self.follow_all_redirects = False - - self.ignore_etag = False - - self.force_exception_to_status_code = False - - self.timeout = timeout - - # Keep Authorization: headers on a redirect. - self.forward_authorization_headers = False - - def __getstate__(self): - state_dict = copy.copy(self.__dict__) - # In case request is augmented by some foreign object such as - # credentials which handle auth - if "request" in state_dict: - del state_dict["request"] - if "connections" in state_dict: - del state_dict["connections"] - return state_dict - - def __setstate__(self, state): - self.__dict__.update(state) - self.connections = {} - - def _auth_from_challenge(self, host, request_uri, headers, response, content): - """A generator that creates Authorization objects - that can be applied to requests. - """ - challenges = _parse_www_authenticate(response, "www-authenticate") - for cred in self.credentials.iter(host): - for scheme in AUTH_SCHEME_ORDER: - if scheme in challenges: - yield AUTH_SCHEME_CLASSES[scheme]( - cred, host, request_uri, headers, response, content, self - ) - - def add_credentials(self, name, password, domain=""): - """Add a name and password that will be used - any time a request requires authentication.""" - self.credentials.add(name, password, domain) - - def add_certificate(self, key, cert, domain): - """Add a key and cert that will be used - any time a request requires authentication.""" - self.certificates.add(key, cert, domain) - - def clear_credentials(self): - """Remove all the names and passwords - that are used for authentication""" - self.credentials.clear() - self.authorizations = [] - - def _conn_request(self, conn, request_uri, method, body, headers): - i = 0 - seen_bad_status_line = False - while i < RETRIES: - i += 1 - try: - if hasattr(conn, "sock") and conn.sock is None: - conn.connect() - conn.request(method, request_uri, body, headers) - except socket.timeout: - raise - except socket.gaierror: - conn.close() - raise ServerNotFoundError("Unable to find the server at %s" % conn.host) - except ssl_SSLError: - conn.close() - raise - except socket.error as e: - err = 0 - if hasattr(e, "args"): - err = getattr(e, "args")[0] - else: - err = e.errno - if err == errno.ECONNREFUSED: # Connection refused - raise - if err in (errno.ENETUNREACH, errno.EADDRNOTAVAIL) and i < RETRIES: - continue # retry on potentially transient socket errors - except httplib.HTTPException: - # Just because the server closed the connection doesn't apparently mean - # that the server didn't send a response. - if hasattr(conn, "sock") and conn.sock is None: - if i < RETRIES - 1: - conn.close() - conn.connect() - continue - else: - conn.close() - raise - if i < RETRIES - 1: - conn.close() - conn.connect() - continue - try: - response = conn.getresponse() - except httplib.BadStatusLine: - # If we get a BadStatusLine on the first try then that means - # the connection just went stale, so retry regardless of the - # number of RETRIES set. - if not seen_bad_status_line and i == 1: - i = 0 - seen_bad_status_line = True - conn.close() - conn.connect() - continue - else: - conn.close() - raise - except (socket.error, httplib.HTTPException): - if i < RETRIES - 1: - conn.close() - conn.connect() - continue - else: - conn.close() - raise - else: - content = "" - if method == "HEAD": - conn.close() - else: - content = response.read() - response = Response(response) - if method != "HEAD": - content = _decompressContent(response, content) - break - return (response, content) - - def _request( - self, - conn, - host, - absolute_uri, - request_uri, - method, - body, - headers, - redirections, - cachekey, - ): - """Do the actual request using the connection object - and also follow one level of redirects if necessary""" - - auths = [ - (auth.depth(request_uri), auth) - for auth in self.authorizations - if auth.inscope(host, request_uri) - ] - auth = auths and sorted(auths)[0][1] or None - if auth: - auth.request(method, request_uri, headers, body) - - (response, content) = self._conn_request( - conn, request_uri, method, body, headers - ) - - if auth: - if auth.response(response, body): - auth.request(method, request_uri, headers, body) - (response, content) = self._conn_request( - conn, request_uri, method, body, headers - ) - response._stale_digest = 1 - - if response.status == 401: - for authorization in self._auth_from_challenge( - host, request_uri, headers, response, content - ): - authorization.request(method, request_uri, headers, body) - (response, content) = self._conn_request( - conn, request_uri, method, body, headers - ) - if response.status != 401: - self.authorizations.append(authorization) - authorization.response(response, body) - break - - if ( - self.follow_all_redirects - or (method in ["GET", "HEAD"]) - or response.status == 303 - ): - if self.follow_redirects and response.status in [300, 301, 302, 303, 307]: - # Pick out the location header and basically start from the beginning - # remembering first to strip the ETag header and decrement our 'depth' - if redirections: - if "location" not in response and response.status != 300: - raise RedirectMissingLocation( - _( - "Redirected but the response is missing a Location: header." - ), - response, - content, - ) - # Fix-up relative redirects (which violate an RFC 2616 MUST) - if "location" in response: - location = response["location"] - (scheme, authority, path, query, fragment) = parse_uri(location) - if authority == None: - response["location"] = urlparse.urljoin( - absolute_uri, location - ) - if response.status == 301 and method in ["GET", "HEAD"]: - response["-x-permanent-redirect-url"] = response["location"] - if "content-location" not in response: - response["content-location"] = absolute_uri - _updateCache(headers, response, content, self.cache, cachekey) - if "if-none-match" in headers: - del headers["if-none-match"] - if "if-modified-since" in headers: - del headers["if-modified-since"] - if ( - "authorization" in headers - and not self.forward_authorization_headers - ): - del headers["authorization"] - if "location" in response: - location = response["location"] - old_response = copy.deepcopy(response) - if "content-location" not in old_response: - old_response["content-location"] = absolute_uri - redirect_method = method - if response.status in [302, 303]: - redirect_method = "GET" - body = None - (response, content) = self.request( - location, - method=redirect_method, - body=body, - headers=headers, - redirections=redirections - 1, - ) - response.previous = old_response - else: - raise RedirectLimit( - "Redirected more times than rediection_limit allows.", - response, - content, - ) - elif response.status in [200, 203] and method in ["GET", "HEAD"]: - # Don't cache 206's since we aren't going to handle byte range requests - if "content-location" not in response: - response["content-location"] = absolute_uri - _updateCache(headers, response, content, self.cache, cachekey) - - return (response, content) - - def _normalize_headers(self, headers): - return _normalize_headers(headers) - - # Need to catch and rebrand some exceptions - # Then need to optionally turn all exceptions into status codes - # including all socket.* and httplib.* exceptions. - - def request( - self, - uri, - method="GET", - body=None, - headers=None, - redirections=DEFAULT_MAX_REDIRECTS, - connection_type=None, - ): - """ Performs a single HTTP request. - - The 'uri' is the URI of the HTTP resource and can begin with either - 'http' or 'https'. The value of 'uri' must be an absolute URI. - - The 'method' is the HTTP method to perform, such as GET, POST, DELETE, - etc. There is no restriction on the methods allowed. - - The 'body' is the entity body to be sent with the request. It is a - string object. - - Any extra headers that are to be sent with the request should be - provided in the 'headers' dictionary. - - The maximum number of redirect to follow before raising an - exception is 'redirections. The default is 5. - - The return value is a tuple of (response, content), the first - being and instance of the 'Response' class, the second being - a string that contains the response entity body. - """ - try: - if headers is None: - headers = {} - else: - headers = self._normalize_headers(headers) - - if "user-agent" not in headers: - headers["user-agent"] = "Python-httplib2/%s (gzip)" % __version__ - - uri = iri2uri(uri) - - (scheme, authority, request_uri, defrag_uri) = urlnorm(uri) - - proxy_info = self._get_proxy_info(scheme, authority) - - conn_key = scheme + ":" + authority - conn = self.connections.get(conn_key) - if conn is None: - if not connection_type: - connection_type = SCHEME_TO_CONNECTION[scheme] - certs = list(self.certificates.iter(authority)) - if scheme == "https": - if certs: - conn = self.connections[conn_key] = connection_type( - authority, - key_file=certs[0][0], - cert_file=certs[0][1], - timeout=self.timeout, - proxy_info=proxy_info, - ca_certs=self.ca_certs, - disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, - ssl_version=self.ssl_version, - ) - else: - conn = self.connections[conn_key] = connection_type( - authority, - timeout=self.timeout, - proxy_info=proxy_info, - ca_certs=self.ca_certs, - disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, - ssl_version=self.ssl_version, - ) - else: - conn = self.connections[conn_key] = connection_type( - authority, timeout=self.timeout, proxy_info=proxy_info - ) - conn.set_debuglevel(debuglevel) - - if "range" not in headers and "accept-encoding" not in headers: - headers["accept-encoding"] = "gzip, deflate" - - info = email.Message.Message() - cached_value = None - if self.cache: - cachekey = defrag_uri.encode("utf-8") - cached_value = self.cache.get(cachekey) - if cached_value: - # info = email.message_from_string(cached_value) - # - # Need to replace the line above with the kludge below - # to fix the non-existent bug not fixed in this - # bug report: http://mail.python.org/pipermail/python-bugs-list/2005-September/030289.html - try: - info, content = cached_value.split("\r\n\r\n", 1) - feedparser = email.FeedParser.FeedParser() - feedparser.feed(info) - info = feedparser.close() - feedparser._parse = None - except (IndexError, ValueError): - self.cache.delete(cachekey) - cachekey = None - cached_value = None - else: - cachekey = None - - if ( - method in self.optimistic_concurrency_methods - and self.cache - and "etag" in info - and not self.ignore_etag - and "if-match" not in headers - ): - # http://www.w3.org/1999/04/Editing/ - headers["if-match"] = info["etag"] - - if method not in ["GET", "HEAD"] and self.cache and cachekey: - # RFC 2616 Section 13.10 - self.cache.delete(cachekey) - - # Check the vary header in the cache to see if this request - # matches what varies in the cache. - if method in ["GET", "HEAD"] and "vary" in info: - vary = info["vary"] - vary_headers = vary.lower().replace(" ", "").split(",") - for header in vary_headers: - key = "-varied-%s" % header - value = info[key] - if headers.get(header, None) != value: - cached_value = None - break - - if ( - cached_value - and method in ["GET", "HEAD"] - and self.cache - and "range" not in headers - ): - if "-x-permanent-redirect-url" in info: - # Should cached permanent redirects be counted in our redirection count? For now, yes. - if redirections <= 0: - raise RedirectLimit( - "Redirected more times than rediection_limit allows.", - {}, - "", - ) - (response, new_content) = self.request( - info["-x-permanent-redirect-url"], - method="GET", - headers=headers, - redirections=redirections - 1, - ) - response.previous = Response(info) - response.previous.fromcache = True - else: - # Determine our course of action: - # Is the cached entry fresh or stale? - # Has the client requested a non-cached response? - # - # There seems to be three possible answers: - # 1. [FRESH] Return the cache entry w/o doing a GET - # 2. [STALE] Do the GET (but add in cache validators if available) - # 3. [TRANSPARENT] Do a GET w/o any cache validators (Cache-Control: no-cache) on the request - entry_disposition = _entry_disposition(info, headers) - - if entry_disposition == "FRESH": - if not cached_value: - info["status"] = "504" - content = "" - response = Response(info) - if cached_value: - response.fromcache = True - return (response, content) - - if entry_disposition == "STALE": - if ( - "etag" in info - and not self.ignore_etag - and not "if-none-match" in headers - ): - headers["if-none-match"] = info["etag"] - if "last-modified" in info and not "last-modified" in headers: - headers["if-modified-since"] = info["last-modified"] - elif entry_disposition == "TRANSPARENT": - pass - - (response, new_content) = self._request( - conn, - authority, - uri, - request_uri, - method, - body, - headers, - redirections, - cachekey, - ) - - if response.status == 304 and method == "GET": - # Rewrite the cache entry with the new end-to-end headers - # Take all headers that are in response - # and overwrite their values in info. - # unless they are hop-by-hop, or are listed in the connection header. - - for key in _get_end2end_headers(response): - info[key] = response[key] - merged_response = Response(info) - if hasattr(response, "_stale_digest"): - merged_response._stale_digest = response._stale_digest - _updateCache( - headers, merged_response, content, self.cache, cachekey - ) - response = merged_response - response.status = 200 - response.fromcache = True - - elif response.status == 200: - content = new_content - else: - self.cache.delete(cachekey) - content = new_content - else: - cc = _parse_cache_control(headers) - if "only-if-cached" in cc: - info["status"] = "504" - response = Response(info) - content = "" - else: - (response, content) = self._request( - conn, - authority, - uri, - request_uri, - method, - body, - headers, - redirections, - cachekey, - ) - except Exception as e: - if self.force_exception_to_status_code: - if isinstance(e, HttpLib2ErrorWithResponse): - response = e.response - content = e.content - response.status = 500 - response.reason = str(e) - elif isinstance(e, socket.timeout): - content = "Request Timeout" - response = Response( - { - "content-type": "text/plain", - "status": "408", - "content-length": len(content), - } - ) - response.reason = "Request Timeout" - else: - content = str(e) - response = Response( - { - "content-type": "text/plain", - "status": "400", - "content-length": len(content), - } - ) - response.reason = "Bad Request" - else: - raise - - return (response, content) - - def _get_proxy_info(self, scheme, authority): - """Return a ProxyInfo instance (or None) based on the scheme - and authority. - """ - hostname, port = urllib.splitport(authority) - proxy_info = self.proxy_info - if callable(proxy_info): - proxy_info = proxy_info(scheme) - - if hasattr(proxy_info, "applies_to") and not proxy_info.applies_to(hostname): - proxy_info = None - return proxy_info - - -class Response(dict): - """An object more like email.Message than httplib.HTTPResponse.""" - - """Is this response from our local cache""" - fromcache = False - """HTTP protocol version used by server. - - 10 for HTTP/1.0, 11 for HTTP/1.1. - """ - version = 11 - - "Status code returned by server. " - status = 200 - """Reason phrase returned by server.""" - reason = "Ok" - - previous = None - - def __init__(self, info): - # info is either an email.Message or - # an httplib.HTTPResponse object. - if isinstance(info, httplib.HTTPResponse): - for key, value in info.getheaders(): - self[key.lower()] = value - self.status = info.status - self["status"] = str(self.status) - self.reason = info.reason - self.version = info.version - elif isinstance(info, email.Message.Message): - for key, value in info.items(): - self[key.lower()] = value - self.status = int(self["status"]) - else: - for key, value in info.iteritems(): - self[key.lower()] = value - self.status = int(self.get("status", self.status)) - self.reason = self.get("reason", self.reason) - - def __getattr__(self, name): - if name == "dict": - return self - else: - raise AttributeError(name) + from .python2 import * + from .python2 import socks # ensure include in namespace + from .python2 import SSLHandshakeError # TODO: shouldn't rely on this. not public + ssl_error_classes = (SSLHandshakeError,) diff --git a/shotgun_api3/lib/httplib2/python2/__init__.py b/shotgun_api3/lib/httplib2/python2/__init__.py new file mode 100644 index 000000000..b3cc0b2fb --- /dev/null +++ b/shotgun_api3/lib/httplib2/python2/__init__.py @@ -0,0 +1,2223 @@ +"""Small, fast HTTP client library for Python. + +Features persistent connections, cache, and Google App Engine Standard +Environment support. +""" + +from __future__ import print_function + +__author__ = "Joe Gregorio (joe@bitworking.org)" +__copyright__ = "Copyright 2006, Joe Gregorio" +__contributors__ = [ + "Thomas Broyer (t.broyer@ltgt.net)", + "James Antill", + "Xavier Verges Farrero", + "Jonathan Feinberg", + "Blair Zajac", + "Sam Ruby", + "Louis Nyffenegger", + "Alex Yu", +] +__license__ = "MIT" +__version__ = '0.12.0' + +import base64 +import calendar +import copy +import email +import email.FeedParser +import email.Message +import email.Utils +import errno +import gzip +import httplib +import os +import random +import re +import StringIO +import sys +import time +import urllib +import urlparse +import zlib + +try: + from hashlib import sha1 as _sha, md5 as _md5 +except ImportError: + # prior to Python 2.5, these were separate modules + import sha + import md5 + + _sha = sha.new + _md5 = md5.new +import hmac +from gettext import gettext as _ +import socket + +try: + from . import socks +except ImportError: + try: + import socks + except (ImportError, AttributeError): + socks = None + +# Build the appropriate socket wrapper for ssl +ssl = None +ssl_SSLError = None +ssl_CertificateError = None +try: + import ssl # python 2.6 +except ImportError: + pass +if ssl is not None: + ssl_SSLError = getattr(ssl, "SSLError", None) + ssl_CertificateError = getattr(ssl, "CertificateError", None) + + +def _ssl_wrap_socket( + sock, key_file, cert_file, disable_validation, ca_certs, ssl_version, hostname +): + if disable_validation: + cert_reqs = ssl.CERT_NONE + else: + cert_reqs = ssl.CERT_REQUIRED + if ssl_version is None: + ssl_version = ssl.PROTOCOL_SSLv23 + + if hasattr(ssl, "SSLContext"): # Python 2.7.9 + context = ssl.SSLContext(ssl_version) + context.verify_mode = cert_reqs + context.check_hostname = cert_reqs != ssl.CERT_NONE + if cert_file: + context.load_cert_chain(cert_file, key_file) + if ca_certs: + context.load_verify_locations(ca_certs) + return context.wrap_socket(sock, server_hostname=hostname) + else: + return ssl.wrap_socket( + sock, + keyfile=key_file, + certfile=cert_file, + cert_reqs=cert_reqs, + ca_certs=ca_certs, + ssl_version=ssl_version, + ) + + +def _ssl_wrap_socket_unsupported( + sock, key_file, cert_file, disable_validation, ca_certs, ssl_version, hostname +): + if not disable_validation: + raise CertificateValidationUnsupported( + "SSL certificate validation is not supported without " + "the ssl module installed. To avoid this error, install " + "the ssl module, or explicity disable validation." + ) + ssl_sock = socket.ssl(sock, key_file, cert_file) + return httplib.FakeSocket(sock, ssl_sock) + + +if ssl is None: + _ssl_wrap_socket = _ssl_wrap_socket_unsupported + +if sys.version_info >= (2, 3): + from iri2uri import iri2uri +else: + + def iri2uri(uri): + return uri + + +def has_timeout(timeout): # python 2.6 + if hasattr(socket, "_GLOBAL_DEFAULT_TIMEOUT"): + return timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT + return timeout is not None + + +__all__ = [ + "Http", + "Response", + "ProxyInfo", + "HttpLib2Error", + "RedirectMissingLocation", + "RedirectLimit", + "FailedToDecompressContent", + "UnimplementedDigestAuthOptionError", + "UnimplementedHmacDigestAuthOptionError", + "debuglevel", + "ProxiesUnavailableError", +] + +# The httplib debug level, set to a non-zero value to get debug output +debuglevel = 0 + +# A request will be tried 'RETRIES' times if it fails at the socket/connection level. +RETRIES = 2 + +# Python 2.3 support +if sys.version_info < (2, 4): + + def sorted(seq): + seq.sort() + return seq + + +# Python 2.3 support +def HTTPResponse__getheaders(self): + """Return list of (header, value) tuples.""" + if self.msg is None: + raise httplib.ResponseNotReady() + return self.msg.items() + + +if not hasattr(httplib.HTTPResponse, "getheaders"): + httplib.HTTPResponse.getheaders = HTTPResponse__getheaders + + +# All exceptions raised here derive from HttpLib2Error +class HttpLib2Error(Exception): + pass + + +# Some exceptions can be caught and optionally +# be turned back into responses. +class HttpLib2ErrorWithResponse(HttpLib2Error): + def __init__(self, desc, response, content): + self.response = response + self.content = content + HttpLib2Error.__init__(self, desc) + + +class RedirectMissingLocation(HttpLib2ErrorWithResponse): + pass + + +class RedirectLimit(HttpLib2ErrorWithResponse): + pass + + +class FailedToDecompressContent(HttpLib2ErrorWithResponse): + pass + + +class UnimplementedDigestAuthOptionError(HttpLib2ErrorWithResponse): + pass + + +class UnimplementedHmacDigestAuthOptionError(HttpLib2ErrorWithResponse): + pass + + +class MalformedHeader(HttpLib2Error): + pass + + +class RelativeURIError(HttpLib2Error): + pass + + +class ServerNotFoundError(HttpLib2Error): + pass + + +class ProxiesUnavailableError(HttpLib2Error): + pass + + +class CertificateValidationUnsupported(HttpLib2Error): + pass + + +class SSLHandshakeError(HttpLib2Error): + pass + + +class NotSupportedOnThisPlatform(HttpLib2Error): + pass + + +class CertificateHostnameMismatch(SSLHandshakeError): + def __init__(self, desc, host, cert): + HttpLib2Error.__init__(self, desc) + self.host = host + self.cert = cert + + +class NotRunningAppEngineEnvironment(HttpLib2Error): + pass + + +# Open Items: +# ----------- +# Proxy support + +# Are we removing the cached content too soon on PUT (only delete on 200 Maybe?) + +# Pluggable cache storage (supports storing the cache in +# flat files by default. We need a plug-in architecture +# that can support Berkeley DB and Squid) + +# == Known Issues == +# Does not handle a resource that uses conneg and Last-Modified but no ETag as a cache validator. +# Does not handle Cache-Control: max-stale +# Does not use Age: headers when calculating cache freshness. + +# The number of redirections to follow before giving up. +# Note that only GET redirects are automatically followed. +# Will also honor 301 requests by saving that info and never +# requesting that URI again. +DEFAULT_MAX_REDIRECTS = 5 + +from . import certs +CA_CERTS = certs.where() + +# Which headers are hop-by-hop headers by default +HOP_BY_HOP = [ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailers", + "transfer-encoding", + "upgrade", +] + + +def _get_end2end_headers(response): + hopbyhop = list(HOP_BY_HOP) + hopbyhop.extend([x.strip() for x in response.get("connection", "").split(",")]) + return [header for header in response.keys() if header not in hopbyhop] + + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +def urlnorm(uri): + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise RelativeURIError("Only absolute URIs are allowed. uri = %s" % uri) + authority = authority.lower() + scheme = scheme.lower() + if not path: + path = "/" + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + scheme = scheme.lower() + defrag_uri = scheme + "://" + authority + request_uri + return scheme, authority, request_uri, defrag_uri + + +# Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/) +re_url_scheme = re.compile(r"^\w+://") +re_unsafe = re.compile(r"[^\w\-_.()=!]+") + + +def safename(filename): + """Return a filename suitable for the cache. + Strips dangerous and common characters to create a filename we + can use to store the cache in. + """ + if isinstance(filename, str): + filename_bytes = filename + filename = filename.decode("utf-8") + else: + filename_bytes = filename.encode("utf-8") + filemd5 = _md5(filename_bytes).hexdigest() + filename = re_url_scheme.sub("", filename) + filename = re_unsafe.sub("", filename) + + # limit length of filename (vital for Windows) + # https://github.com/httplib2/httplib2/pull/74 + # C:\Users\ \AppData\Local\Temp\ , + # 9 chars + max 104 chars + 20 chars + x + 1 + 32 = max 259 chars + # Thus max safe filename x = 93 chars. Let it be 90 to make a round sum: + filename = filename[:90] + + return ",".join((filename, filemd5)) + + +NORMALIZE_SPACE = re.compile(r"(?:\r\n)?[ \t]+") + + +def _normalize_headers(headers): + return dict( + [ + (key.lower(), NORMALIZE_SPACE.sub(value, " ").strip()) + for (key, value) in headers.iteritems() + ] + ) + + +def _parse_cache_control(headers): + retval = {} + if "cache-control" in headers: + parts = headers["cache-control"].split(",") + parts_with_args = [ + tuple([x.strip().lower() for x in part.split("=", 1)]) + for part in parts + if -1 != part.find("=") + ] + parts_wo_args = [ + (name.strip().lower(), 1) for name in parts if -1 == name.find("=") + ] + retval = dict(parts_with_args + parts_wo_args) + return retval + + +# Whether to use a strict mode to parse WWW-Authenticate headers +# Might lead to bad results in case of ill-formed header value, +# so disabled by default, falling back to relaxed parsing. +# Set to true to turn on, usefull for testing servers. +USE_WWW_AUTH_STRICT_PARSING = 0 + +# In regex below: +# [^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+ matches a "token" as defined by HTTP +# "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?" matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space +# Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both: +# \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"? +WWW_AUTH_STRICT = re.compile( + r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$" +) +WWW_AUTH_RELAXED = re.compile( + r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(? current_age: + retval = "FRESH" + return retval + + +def _decompressContent(response, new_content): + content = new_content + try: + encoding = response.get("content-encoding", None) + if encoding in ["gzip", "deflate"]: + if encoding == "gzip": + content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read() + if encoding == "deflate": + content = zlib.decompress(content, -zlib.MAX_WBITS) + response["content-length"] = str(len(content)) + # Record the historical presence of the encoding in a way the won't interfere. + response["-content-encoding"] = response["content-encoding"] + del response["content-encoding"] + except (IOError, zlib.error): + content = "" + raise FailedToDecompressContent( + _("Content purported to be compressed with %s but failed to decompress.") + % response.get("content-encoding"), + response, + content, + ) + return content + + +def _updateCache(request_headers, response_headers, content, cache, cachekey): + if cachekey: + cc = _parse_cache_control(request_headers) + cc_response = _parse_cache_control(response_headers) + if "no-store" in cc or "no-store" in cc_response: + cache.delete(cachekey) + else: + info = email.Message.Message() + for key, value in response_headers.iteritems(): + if key not in ["status", "content-encoding", "transfer-encoding"]: + info[key] = value + + # Add annotations to the cache to indicate what headers + # are variant for this request. + vary = response_headers.get("vary", None) + if vary: + vary_headers = vary.lower().replace(" ", "").split(",") + for header in vary_headers: + key = "-varied-%s" % header + try: + info[key] = request_headers[header] + except KeyError: + pass + + status = response_headers.status + if status == 304: + status = 200 + + status_header = "status: %d\r\n" % status + + header_str = info.as_string() + + header_str = re.sub("\r(?!\n)|(? 0: + service = "cl" + # No point in guessing Base or Spreadsheet + # elif request_uri.find("spreadsheets") > 0: + # service = "wise" + + auth = dict( + Email=credentials[0], + Passwd=credentials[1], + service=service, + source=headers["user-agent"], + ) + resp, content = self.http.request( + "https://www.google.com/accounts/ClientLogin", + method="POST", + body=urlencode(auth), + headers={"Content-Type": "application/x-www-form-urlencoded"}, + ) + lines = content.split("\n") + d = dict([tuple(line.split("=", 1)) for line in lines if line]) + if resp.status == 403: + self.Auth = "" + else: + self.Auth = d["Auth"] + + def request(self, method, request_uri, headers, content): + """Modify the request headers to add the appropriate + Authorization header.""" + headers["authorization"] = "GoogleLogin Auth=" + self.Auth + + +AUTH_SCHEME_CLASSES = { + "basic": BasicAuthentication, + "wsse": WsseAuthentication, + "digest": DigestAuthentication, + "hmacdigest": HmacDigestAuthentication, + "googlelogin": GoogleLoginAuthentication, +} + +AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"] + + +class FileCache(object): + """Uses a local directory as a store for cached files. + Not really safe to use if multiple threads or processes are going to + be running on the same cache. + """ + + def __init__( + self, cache, safe=safename + ): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior + self.cache = cache + self.safe = safe + if not os.path.exists(cache): + os.makedirs(self.cache) + + def get(self, key): + retval = None + cacheFullPath = os.path.join(self.cache, self.safe(key)) + try: + f = file(cacheFullPath, "rb") + retval = f.read() + f.close() + except IOError: + pass + return retval + + def set(self, key, value): + cacheFullPath = os.path.join(self.cache, self.safe(key)) + f = file(cacheFullPath, "wb") + f.write(value) + f.close() + + def delete(self, key): + cacheFullPath = os.path.join(self.cache, self.safe(key)) + if os.path.exists(cacheFullPath): + os.remove(cacheFullPath) + + +class Credentials(object): + def __init__(self): + self.credentials = [] + + def add(self, name, password, domain=""): + self.credentials.append((domain.lower(), name, password)) + + def clear(self): + self.credentials = [] + + def iter(self, domain): + for (cdomain, name, password) in self.credentials: + if cdomain == "" or domain == cdomain: + yield (name, password) + + +class KeyCerts(Credentials): + """Identical to Credentials except that + name/password are mapped to key/cert.""" + + pass + + +class AllHosts(object): + pass + + +class ProxyInfo(object): + """Collect information required to use a proxy.""" + + bypass_hosts = () + + def __init__( + self, + proxy_type, + proxy_host, + proxy_port, + proxy_rdns=True, + proxy_user=None, + proxy_pass=None, + proxy_headers=None, + ): + """Args: + + proxy_type: The type of proxy server. This must be set to one of + socks.PROXY_TYPE_XXX constants. For example: p = + ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, proxy_host='localhost', + proxy_port=8000) + proxy_host: The hostname or IP address of the proxy server. + proxy_port: The port that the proxy server is running on. + proxy_rdns: If True (default), DNS queries will not be performed + locally, and instead, handed to the proxy to resolve. This is useful + if the network does not allow resolution of non-local names. In + httplib2 0.9 and earlier, this defaulted to False. + proxy_user: The username used to authenticate with the proxy server. + proxy_pass: The password used to authenticate with the proxy server. + proxy_headers: Additional or modified headers for the proxy connect + request. + """ + self.proxy_type = proxy_type + self.proxy_host = proxy_host + self.proxy_port = proxy_port + self.proxy_rdns = proxy_rdns + self.proxy_user = proxy_user + self.proxy_pass = proxy_pass + self.proxy_headers = proxy_headers + + def astuple(self): + return ( + self.proxy_type, + self.proxy_host, + self.proxy_port, + self.proxy_rdns, + self.proxy_user, + self.proxy_pass, + self.proxy_headers, + ) + + def isgood(self): + return (self.proxy_host != None) and (self.proxy_port != None) + + def applies_to(self, hostname): + return not self.bypass_host(hostname) + + def bypass_host(self, hostname): + """Has this host been excluded from the proxy config""" + if self.bypass_hosts is AllHosts: + return True + + hostname = "." + hostname.lstrip(".") + for skip_name in self.bypass_hosts: + # *.suffix + if skip_name.startswith(".") and hostname.endswith(skip_name): + return True + # exact match + if hostname == "." + skip_name: + return True + return False + + def __repr__(self): + return ( + "" + ).format(p=self) + + +def proxy_info_from_environment(method="http"): + """Read proxy info from the environment variables. + """ + if method not in ["http", "https"]: + return + + env_var = method + "_proxy" + url = os.environ.get(env_var, os.environ.get(env_var.upper())) + if not url: + return + return proxy_info_from_url(url, method, None) + + +def proxy_info_from_url(url, method="http", noproxy=None): + """Construct a ProxyInfo from a URL (such as http_proxy env var) + """ + url = urlparse.urlparse(url) + username = None + password = None + port = None + if "@" in url[1]: + ident, host_port = url[1].split("@", 1) + if ":" in ident: + username, password = ident.split(":", 1) + else: + password = ident + else: + host_port = url[1] + if ":" in host_port: + host, port = host_port.split(":", 1) + else: + host = host_port + + if port: + port = int(port) + else: + port = dict(https=443, http=80)[method] + + proxy_type = 3 # socks.PROXY_TYPE_HTTP + pi = ProxyInfo( + proxy_type=proxy_type, + proxy_host=host, + proxy_port=port, + proxy_user=username or None, + proxy_pass=password or None, + proxy_headers=None, + ) + + bypass_hosts = [] + # If not given an explicit noproxy value, respect values in env vars. + if noproxy is None: + noproxy = os.environ.get("no_proxy", os.environ.get("NO_PROXY", "")) + # Special case: A single '*' character means all hosts should be bypassed. + if noproxy == "*": + bypass_hosts = AllHosts + elif noproxy.strip(): + bypass_hosts = noproxy.split(",") + bypass_hosts = filter(bool, bypass_hosts) # To exclude empty string. + + pi.bypass_hosts = bypass_hosts + return pi + + +class HTTPConnectionWithTimeout(httplib.HTTPConnection): + """HTTPConnection subclass that supports timeouts + + All timeouts are in seconds. If None is passed for timeout then + Python's default timeout for sockets will be used. See for example + the docs of socket.setdefaulttimeout(): + http://docs.python.org/library/socket.html#socket.setdefaulttimeout + """ + + def __init__(self, host, port=None, strict=None, timeout=None, proxy_info=None): + httplib.HTTPConnection.__init__(self, host, port, strict) + self.timeout = timeout + self.proxy_info = proxy_info + + def connect(self): + """Connect to the host and port specified in __init__.""" + # Mostly verbatim from httplib.py. + if self.proxy_info and socks is None: + raise ProxiesUnavailableError( + "Proxy support missing but proxy use was requested!" + ) + msg = "getaddrinfo returns an empty list" + if self.proxy_info and self.proxy_info.isgood(): + use_proxy = True + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( + self.proxy_info.astuple() + ) + + host = proxy_host + port = proxy_port + else: + use_proxy = False + + host = self.host + port = self.port + + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + try: + if use_proxy: + self.sock = socks.socksocket(af, socktype, proto) + self.sock.setproxy( + proxy_type, + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + else: + self.sock = socket.socket(af, socktype, proto) + self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + # Different from httplib: support timeouts. + if has_timeout(self.timeout): + self.sock.settimeout(self.timeout) + # End of difference from httplib. + if self.debuglevel > 0: + print("connect: (%s, %s) ************" % (self.host, self.port)) + if use_proxy: + print( + "proxy: %s ************" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + if use_proxy: + self.sock.connect((self.host, self.port) + sa[2:]) + else: + self.sock.connect(sa) + except socket.error as msg: + if self.debuglevel > 0: + print("connect fail: (%s, %s)" % (self.host, self.port)) + if use_proxy: + print( + "proxy: %s" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + if self.sock: + self.sock.close() + self.sock = None + continue + break + if not self.sock: + raise socket.error(msg) + + +class HTTPSConnectionWithTimeout(httplib.HTTPSConnection): + """This class allows communication via SSL. + + All timeouts are in seconds. If None is passed for timeout then + Python's default timeout for sockets will be used. See for example + the docs of socket.setdefaulttimeout(): + http://docs.python.org/library/socket.html#socket.setdefaulttimeout + """ + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + strict=None, + timeout=None, + proxy_info=None, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): + httplib.HTTPSConnection.__init__( + self, host, port=port, key_file=key_file, cert_file=cert_file, strict=strict + ) + self.timeout = timeout + self.proxy_info = proxy_info + if ca_certs is None: + ca_certs = CA_CERTS + self.ca_certs = ca_certs + self.disable_ssl_certificate_validation = disable_ssl_certificate_validation + self.ssl_version = ssl_version + + # The following two methods were adapted from https_wrapper.py, released + # with the Google Appengine SDK at + # http://googleappengine.googlecode.com/svn-history/r136/trunk/python/google/appengine/tools/https_wrapper.py + # under the following license: + # + # Copyright 2007 Google Inc. + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + # + + def _GetValidHostsForCert(self, cert): + """Returns a list of valid host globs for an SSL certificate. + + Args: + cert: A dictionary representing an SSL certificate. + Returns: + list: A list of valid host globs. + """ + if "subjectAltName" in cert: + return [x[1] for x in cert["subjectAltName"] if x[0].lower() == "dns"] + else: + return [x[0][1] for x in cert["subject"] if x[0][0].lower() == "commonname"] + + def _ValidateCertificateHostname(self, cert, hostname): + """Validates that a given hostname is valid for an SSL certificate. + + Args: + cert: A dictionary representing an SSL certificate. + hostname: The hostname to test. + Returns: + bool: Whether or not the hostname is valid for this certificate. + """ + hosts = self._GetValidHostsForCert(cert) + for host in hosts: + host_re = host.replace(".", "\.").replace("*", "[^.]*") + if re.search("^%s$" % (host_re,), hostname, re.I): + return True + return False + + def connect(self): + "Connect to a host on a given (SSL) port." + + msg = "getaddrinfo returns an empty list" + if self.proxy_info and self.proxy_info.isgood(): + use_proxy = True + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( + self.proxy_info.astuple() + ) + + host = proxy_host + port = proxy_port + else: + use_proxy = False + + host = self.host + port = self.port + + address_info = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) + for family, socktype, proto, canonname, sockaddr in address_info: + try: + if use_proxy: + sock = socks.socksocket(family, socktype, proto) + + sock.setproxy( + proxy_type, + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + else: + sock = socket.socket(family, socktype, proto) + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + if has_timeout(self.timeout): + sock.settimeout(self.timeout) + + if use_proxy: + sock.connect((self.host, self.port) + sockaddr[:2]) + else: + sock.connect(sockaddr) + self.sock = _ssl_wrap_socket( + sock, + self.key_file, + self.cert_file, + self.disable_ssl_certificate_validation, + self.ca_certs, + self.ssl_version, + self.host, + ) + if self.debuglevel > 0: + print("connect: (%s, %s)" % (self.host, self.port)) + if use_proxy: + print( + "proxy: %s" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + if not self.disable_ssl_certificate_validation: + cert = self.sock.getpeercert() + hostname = self.host.split(":", 0)[0] + if not self._ValidateCertificateHostname(cert, hostname): + raise CertificateHostnameMismatch( + "Server presented certificate that does not match " + "host %s: %s" % (hostname, cert), + hostname, + cert, + ) + except ( + ssl_SSLError, + ssl_CertificateError, + CertificateHostnameMismatch, + ) as e: + if sock: + sock.close() + if self.sock: + self.sock.close() + self.sock = None + # Unfortunately the ssl module doesn't seem to provide any way + # to get at more detailed error information, in particular + # whether the error is due to certificate validation or + # something else (such as SSL protocol mismatch). + if getattr(e, "errno", None) == ssl.SSL_ERROR_SSL: + raise SSLHandshakeError(e) + else: + raise + except (socket.timeout, socket.gaierror): + raise + except socket.error as msg: + if self.debuglevel > 0: + print("connect fail: (%s, %s)" % (self.host, self.port)) + if use_proxy: + print( + "proxy: %s" + % str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + if self.sock: + self.sock.close() + self.sock = None + continue + break + if not self.sock: + raise socket.error(msg) + + +SCHEME_TO_CONNECTION = { + "http": HTTPConnectionWithTimeout, + "https": HTTPSConnectionWithTimeout, +} + + +def _new_fixed_fetch(validate_certificate): + + def fixed_fetch( + url, + payload=None, + method="GET", + headers={}, + allow_truncated=False, + follow_redirects=True, + deadline=None, + ): + return fetch( + url, + payload=payload, + method=method, + headers=headers, + allow_truncated=allow_truncated, + follow_redirects=follow_redirects, + deadline=deadline, + validate_certificate=validate_certificate, + ) + + return fixed_fetch + + +class AppEngineHttpConnection(httplib.HTTPConnection): + """Use httplib on App Engine, but compensate for its weirdness. + + The parameters key_file, cert_file, proxy_info, ca_certs, + disable_ssl_certificate_validation, and ssl_version are all dropped on + the ground. + """ + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + strict=None, + timeout=None, + proxy_info=None, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): + httplib.HTTPConnection.__init__( + self, host, port=port, strict=strict, timeout=timeout + ) + + +class AppEngineHttpsConnection(httplib.HTTPSConnection): + """Same as AppEngineHttpConnection, but for HTTPS URIs. + + The parameters proxy_info, ca_certs, disable_ssl_certificate_validation, + and ssl_version are all dropped on the ground. + """ + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + strict=None, + timeout=None, + proxy_info=None, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): + httplib.HTTPSConnection.__init__( + self, + host, + port=port, + key_file=key_file, + cert_file=cert_file, + strict=strict, + timeout=timeout, + ) + self._fetch = _new_fixed_fetch(not disable_ssl_certificate_validation) + + +# Use a different connection object for Google App Engine Standard Environment. +def is_gae_instance(): + server_software = os.environ.get('SERVER_SOFTWARE', '') + if (server_software.startswith('Google App Engine/') or + server_software.startswith('Development/') or + server_software.startswith('testutil/')): + return True + return False + + +try: + if not is_gae_instance(): + raise NotRunningAppEngineEnvironment() + + from google.appengine.api import apiproxy_stub_map + if apiproxy_stub_map.apiproxy.GetStub("urlfetch") is None: + raise ImportError + + from google.appengine.api.urlfetch import fetch + + # Update the connection classes to use the Googel App Engine specific ones. + SCHEME_TO_CONNECTION = { + "http": AppEngineHttpConnection, + "https": AppEngineHttpsConnection, + } +except (ImportError, NotRunningAppEngineEnvironment): + pass + + +class Http(object): + """An HTTP client that handles: + + - all methods + - caching + - ETags + - compression, + - HTTPS + - Basic + - Digest + - WSSE + + and more. + """ + + def __init__( + self, + cache=None, + timeout=None, + proxy_info=proxy_info_from_environment, + ca_certs=None, + disable_ssl_certificate_validation=False, + ssl_version=None, + ): + """If 'cache' is a string then it is used as a directory name for + a disk cache. Otherwise it must be an object that supports the + same interface as FileCache. + + All timeouts are in seconds. If None is passed for timeout + then Python's default timeout for sockets will be used. See + for example the docs of socket.setdefaulttimeout(): + http://docs.python.org/library/socket.html#socket.setdefaulttimeout + + `proxy_info` may be: + - a callable that takes the http scheme ('http' or 'https') and + returns a ProxyInfo instance per request. By default, uses + proxy_nfo_from_environment. + - a ProxyInfo instance (static proxy config). + - None (proxy disabled). + + ca_certs is the path of a file containing root CA certificates for SSL + server certificate validation. By default, a CA cert file bundled with + httplib2 is used. + + If disable_ssl_certificate_validation is true, SSL cert validation will + not be performed. + + By default, ssl.PROTOCOL_SSLv23 will be used for the ssl version. + """ + self.proxy_info = proxy_info + self.ca_certs = ca_certs + self.disable_ssl_certificate_validation = disable_ssl_certificate_validation + self.ssl_version = ssl_version + + # Map domain name to an httplib connection + self.connections = {} + # The location of the cache, for now a directory + # where cached responses are held. + if cache and isinstance(cache, basestring): + self.cache = FileCache(cache) + else: + self.cache = cache + + # Name/password + self.credentials = Credentials() + + # Key/cert + self.certificates = KeyCerts() + + # authorization objects + self.authorizations = [] + + # If set to False then no redirects are followed, even safe ones. + self.follow_redirects = True + + # Which HTTP methods do we apply optimistic concurrency to, i.e. + # which methods get an "if-match:" etag header added to them. + self.optimistic_concurrency_methods = ["PUT", "PATCH"] + + # If 'follow_redirects' is True, and this is set to True then + # all redirecs are followed, including unsafe ones. + self.follow_all_redirects = False + + self.ignore_etag = False + + self.force_exception_to_status_code = False + + self.timeout = timeout + + # Keep Authorization: headers on a redirect. + self.forward_authorization_headers = False + + def __getstate__(self): + state_dict = copy.copy(self.__dict__) + # In case request is augmented by some foreign object such as + # credentials which handle auth + if "request" in state_dict: + del state_dict["request"] + if "connections" in state_dict: + del state_dict["connections"] + return state_dict + + def __setstate__(self, state): + self.__dict__.update(state) + self.connections = {} + + def _auth_from_challenge(self, host, request_uri, headers, response, content): + """A generator that creates Authorization objects + that can be applied to requests. + """ + challenges = _parse_www_authenticate(response, "www-authenticate") + for cred in self.credentials.iter(host): + for scheme in AUTH_SCHEME_ORDER: + if scheme in challenges: + yield AUTH_SCHEME_CLASSES[scheme]( + cred, host, request_uri, headers, response, content, self + ) + + def add_credentials(self, name, password, domain=""): + """Add a name and password that will be used + any time a request requires authentication.""" + self.credentials.add(name, password, domain) + + def add_certificate(self, key, cert, domain): + """Add a key and cert that will be used + any time a request requires authentication.""" + self.certificates.add(key, cert, domain) + + def clear_credentials(self): + """Remove all the names and passwords + that are used for authentication""" + self.credentials.clear() + self.authorizations = [] + + def _conn_request(self, conn, request_uri, method, body, headers): + i = 0 + seen_bad_status_line = False + while i < RETRIES: + i += 1 + try: + if hasattr(conn, "sock") and conn.sock is None: + conn.connect() + conn.request(method, request_uri, body, headers) + except socket.timeout: + raise + except socket.gaierror: + conn.close() + raise ServerNotFoundError("Unable to find the server at %s" % conn.host) + except ssl_SSLError: + conn.close() + raise + except socket.error as e: + err = 0 + if hasattr(e, "args"): + err = getattr(e, "args")[0] + else: + err = e.errno + if err == errno.ECONNREFUSED: # Connection refused + raise + if err in (errno.ENETUNREACH, errno.EADDRNOTAVAIL) and i < RETRIES: + continue # retry on potentially transient socket errors + except httplib.HTTPException: + # Just because the server closed the connection doesn't apparently mean + # that the server didn't send a response. + if hasattr(conn, "sock") and conn.sock is None: + if i < RETRIES - 1: + conn.close() + conn.connect() + continue + else: + conn.close() + raise + if i < RETRIES - 1: + conn.close() + conn.connect() + continue + try: + response = conn.getresponse() + except httplib.BadStatusLine: + # If we get a BadStatusLine on the first try then that means + # the connection just went stale, so retry regardless of the + # number of RETRIES set. + if not seen_bad_status_line and i == 1: + i = 0 + seen_bad_status_line = True + conn.close() + conn.connect() + continue + else: + conn.close() + raise + except (socket.error, httplib.HTTPException): + if i < RETRIES - 1: + conn.close() + conn.connect() + continue + else: + conn.close() + raise + else: + content = "" + if method == "HEAD": + conn.close() + else: + content = response.read() + response = Response(response) + if method != "HEAD": + content = _decompressContent(response, content) + break + return (response, content) + + def _request( + self, + conn, + host, + absolute_uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ): + """Do the actual request using the connection object + and also follow one level of redirects if necessary""" + + auths = [ + (auth.depth(request_uri), auth) + for auth in self.authorizations + if auth.inscope(host, request_uri) + ] + auth = auths and sorted(auths)[0][1] or None + if auth: + auth.request(method, request_uri, headers, body) + + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) + + if auth: + if auth.response(response, body): + auth.request(method, request_uri, headers, body) + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) + response._stale_digest = 1 + + if response.status == 401: + for authorization in self._auth_from_challenge( + host, request_uri, headers, response, content + ): + authorization.request(method, request_uri, headers, body) + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) + if response.status != 401: + self.authorizations.append(authorization) + authorization.response(response, body) + break + + if ( + self.follow_all_redirects + or (method in ["GET", "HEAD"]) + or response.status == 303 + ): + if self.follow_redirects and response.status in [300, 301, 302, 303, 307]: + # Pick out the location header and basically start from the beginning + # remembering first to strip the ETag header and decrement our 'depth' + if redirections: + if "location" not in response and response.status != 300: + raise RedirectMissingLocation( + _( + "Redirected but the response is missing a Location: header." + ), + response, + content, + ) + # Fix-up relative redirects (which violate an RFC 2616 MUST) + if "location" in response: + location = response["location"] + (scheme, authority, path, query, fragment) = parse_uri(location) + if authority == None: + response["location"] = urlparse.urljoin( + absolute_uri, location + ) + if response.status == 301 and method in ["GET", "HEAD"]: + response["-x-permanent-redirect-url"] = response["location"] + if "content-location" not in response: + response["content-location"] = absolute_uri + _updateCache(headers, response, content, self.cache, cachekey) + if "if-none-match" in headers: + del headers["if-none-match"] + if "if-modified-since" in headers: + del headers["if-modified-since"] + if ( + "authorization" in headers + and not self.forward_authorization_headers + ): + del headers["authorization"] + if "location" in response: + location = response["location"] + old_response = copy.deepcopy(response) + if "content-location" not in old_response: + old_response["content-location"] = absolute_uri + redirect_method = method + if response.status in [302, 303]: + redirect_method = "GET" + body = None + (response, content) = self.request( + location, + method=redirect_method, + body=body, + headers=headers, + redirections=redirections - 1, + ) + response.previous = old_response + else: + raise RedirectLimit( + "Redirected more times than rediection_limit allows.", + response, + content, + ) + elif response.status in [200, 203] and method in ["GET", "HEAD"]: + # Don't cache 206's since we aren't going to handle byte range requests + if "content-location" not in response: + response["content-location"] = absolute_uri + _updateCache(headers, response, content, self.cache, cachekey) + + return (response, content) + + def _normalize_headers(self, headers): + return _normalize_headers(headers) + + # Need to catch and rebrand some exceptions + # Then need to optionally turn all exceptions into status codes + # including all socket.* and httplib.* exceptions. + + def request( + self, + uri, + method="GET", + body=None, + headers=None, + redirections=DEFAULT_MAX_REDIRECTS, + connection_type=None, + ): + """ Performs a single HTTP request. + + The 'uri' is the URI of the HTTP resource and can begin with either + 'http' or 'https'. The value of 'uri' must be an absolute URI. + + The 'method' is the HTTP method to perform, such as GET, POST, DELETE, + etc. There is no restriction on the methods allowed. + + The 'body' is the entity body to be sent with the request. It is a + string object. + + Any extra headers that are to be sent with the request should be + provided in the 'headers' dictionary. + + The maximum number of redirect to follow before raising an + exception is 'redirections. The default is 5. + + The return value is a tuple of (response, content), the first + being and instance of the 'Response' class, the second being + a string that contains the response entity body. + """ + try: + if headers is None: + headers = {} + else: + headers = self._normalize_headers(headers) + + if "user-agent" not in headers: + headers["user-agent"] = "Python-httplib2/%s (gzip)" % __version__ + + uri = iri2uri(uri) + + (scheme, authority, request_uri, defrag_uri) = urlnorm(uri) + + proxy_info = self._get_proxy_info(scheme, authority) + + conn_key = scheme + ":" + authority + conn = self.connections.get(conn_key) + if conn is None: + if not connection_type: + connection_type = SCHEME_TO_CONNECTION[scheme] + certs = list(self.certificates.iter(authority)) + if scheme == "https": + if certs: + conn = self.connections[conn_key] = connection_type( + authority, + key_file=certs[0][0], + cert_file=certs[0][1], + timeout=self.timeout, + proxy_info=proxy_info, + ca_certs=self.ca_certs, + disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, + ssl_version=self.ssl_version, + ) + else: + conn = self.connections[conn_key] = connection_type( + authority, + timeout=self.timeout, + proxy_info=proxy_info, + ca_certs=self.ca_certs, + disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, + ssl_version=self.ssl_version, + ) + else: + conn = self.connections[conn_key] = connection_type( + authority, timeout=self.timeout, proxy_info=proxy_info + ) + conn.set_debuglevel(debuglevel) + + if "range" not in headers and "accept-encoding" not in headers: + headers["accept-encoding"] = "gzip, deflate" + + info = email.Message.Message() + cached_value = None + if self.cache: + cachekey = defrag_uri.encode("utf-8") + cached_value = self.cache.get(cachekey) + if cached_value: + # info = email.message_from_string(cached_value) + # + # Need to replace the line above with the kludge below + # to fix the non-existent bug not fixed in this + # bug report: http://mail.python.org/pipermail/python-bugs-list/2005-September/030289.html + try: + info, content = cached_value.split("\r\n\r\n", 1) + feedparser = email.FeedParser.FeedParser() + feedparser.feed(info) + info = feedparser.close() + feedparser._parse = None + except (IndexError, ValueError): + self.cache.delete(cachekey) + cachekey = None + cached_value = None + else: + cachekey = None + + if ( + method in self.optimistic_concurrency_methods + and self.cache + and "etag" in info + and not self.ignore_etag + and "if-match" not in headers + ): + # http://www.w3.org/1999/04/Editing/ + headers["if-match"] = info["etag"] + + if method not in ["GET", "HEAD"] and self.cache and cachekey: + # RFC 2616 Section 13.10 + self.cache.delete(cachekey) + + # Check the vary header in the cache to see if this request + # matches what varies in the cache. + if method in ["GET", "HEAD"] and "vary" in info: + vary = info["vary"] + vary_headers = vary.lower().replace(" ", "").split(",") + for header in vary_headers: + key = "-varied-%s" % header + value = info[key] + if headers.get(header, None) != value: + cached_value = None + break + + if ( + cached_value + and method in ["GET", "HEAD"] + and self.cache + and "range" not in headers + ): + if "-x-permanent-redirect-url" in info: + # Should cached permanent redirects be counted in our redirection count? For now, yes. + if redirections <= 0: + raise RedirectLimit( + "Redirected more times than rediection_limit allows.", + {}, + "", + ) + (response, new_content) = self.request( + info["-x-permanent-redirect-url"], + method="GET", + headers=headers, + redirections=redirections - 1, + ) + response.previous = Response(info) + response.previous.fromcache = True + else: + # Determine our course of action: + # Is the cached entry fresh or stale? + # Has the client requested a non-cached response? + # + # There seems to be three possible answers: + # 1. [FRESH] Return the cache entry w/o doing a GET + # 2. [STALE] Do the GET (but add in cache validators if available) + # 3. [TRANSPARENT] Do a GET w/o any cache validators (Cache-Control: no-cache) on the request + entry_disposition = _entry_disposition(info, headers) + + if entry_disposition == "FRESH": + if not cached_value: + info["status"] = "504" + content = "" + response = Response(info) + if cached_value: + response.fromcache = True + return (response, content) + + if entry_disposition == "STALE": + if ( + "etag" in info + and not self.ignore_etag + and not "if-none-match" in headers + ): + headers["if-none-match"] = info["etag"] + if "last-modified" in info and not "last-modified" in headers: + headers["if-modified-since"] = info["last-modified"] + elif entry_disposition == "TRANSPARENT": + pass + + (response, new_content) = self._request( + conn, + authority, + uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ) + + if response.status == 304 and method == "GET": + # Rewrite the cache entry with the new end-to-end headers + # Take all headers that are in response + # and overwrite their values in info. + # unless they are hop-by-hop, or are listed in the connection header. + + for key in _get_end2end_headers(response): + info[key] = response[key] + merged_response = Response(info) + if hasattr(response, "_stale_digest"): + merged_response._stale_digest = response._stale_digest + _updateCache( + headers, merged_response, content, self.cache, cachekey + ) + response = merged_response + response.status = 200 + response.fromcache = True + + elif response.status == 200: + content = new_content + else: + self.cache.delete(cachekey) + content = new_content + else: + cc = _parse_cache_control(headers) + if "only-if-cached" in cc: + info["status"] = "504" + response = Response(info) + content = "" + else: + (response, content) = self._request( + conn, + authority, + uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ) + except Exception as e: + if self.force_exception_to_status_code: + if isinstance(e, HttpLib2ErrorWithResponse): + response = e.response + content = e.content + response.status = 500 + response.reason = str(e) + elif isinstance(e, socket.timeout): + content = "Request Timeout" + response = Response( + { + "content-type": "text/plain", + "status": "408", + "content-length": len(content), + } + ) + response.reason = "Request Timeout" + else: + content = str(e) + response = Response( + { + "content-type": "text/plain", + "status": "400", + "content-length": len(content), + } + ) + response.reason = "Bad Request" + else: + raise + + return (response, content) + + def _get_proxy_info(self, scheme, authority): + """Return a ProxyInfo instance (or None) based on the scheme + and authority. + """ + hostname, port = urllib.splitport(authority) + proxy_info = self.proxy_info + if callable(proxy_info): + proxy_info = proxy_info(scheme) + + if hasattr(proxy_info, "applies_to") and not proxy_info.applies_to(hostname): + proxy_info = None + return proxy_info + + +class Response(dict): + """An object more like email.Message than httplib.HTTPResponse.""" + + """Is this response from our local cache""" + fromcache = False + """HTTP protocol version used by server. + + 10 for HTTP/1.0, 11 for HTTP/1.1. + """ + version = 11 + + "Status code returned by server. " + status = 200 + """Reason phrase returned by server.""" + reason = "Ok" + + previous = None + + def __init__(self, info): + # info is either an email.Message or + # an httplib.HTTPResponse object. + if isinstance(info, httplib.HTTPResponse): + for key, value in info.getheaders(): + self[key.lower()] = value + self.status = info.status + self["status"] = str(self.status) + self.reason = info.reason + self.version = info.version + elif isinstance(info, email.Message.Message): + for key, value in info.items(): + self[key.lower()] = value + self.status = int(self["status"]) + else: + for key, value in info.iteritems(): + self[key.lower()] = value + self.status = int(self.get("status", self.status)) + self.reason = self.get("reason", self.reason) + + def __getattr__(self, name): + if name == "dict": + return self + else: + raise AttributeError(name) diff --git a/shotgun_api3/lib/httplib2/cacerts.txt b/shotgun_api3/lib/httplib2/python2/cacerts.txt similarity index 100% rename from shotgun_api3/lib/httplib2/cacerts.txt rename to shotgun_api3/lib/httplib2/python2/cacerts.txt diff --git a/shotgun_api3/lib/httplib2/certs.py b/shotgun_api3/lib/httplib2/python2/certs.py similarity index 100% rename from shotgun_api3/lib/httplib2/certs.py rename to shotgun_api3/lib/httplib2/python2/certs.py diff --git a/shotgun_api3/lib/httplib2/iri2uri.py b/shotgun_api3/lib/httplib2/python2/iri2uri.py similarity index 100% rename from shotgun_api3/lib/httplib2/iri2uri.py rename to shotgun_api3/lib/httplib2/python2/iri2uri.py diff --git a/shotgun_api3/lib/httplib2/socks.py b/shotgun_api3/lib/httplib2/python2/socks.py similarity index 100% rename from shotgun_api3/lib/httplib2/socks.py rename to shotgun_api3/lib/httplib2/python2/socks.py diff --git a/shotgun_api3/lib/httplib2/python3/__init__.py b/shotgun_api3/lib/httplib2/python3/__init__.py new file mode 100644 index 000000000..e0242df74 --- /dev/null +++ b/shotgun_api3/lib/httplib2/python3/__init__.py @@ -0,0 +1,2012 @@ +# -*- coding: utf-8 -*- +"""Small, fast HTTP client library for Python.""" + +__author__ = "Joe Gregorio (joe@bitworking.org)" +__copyright__ = "Copyright 2006, Joe Gregorio" +__contributors__ = [ + "Thomas Broyer (t.broyer@ltgt.net)", + "James Antill", + "Xavier Verges Farrero", + "Jonathan Feinberg", + "Blair Zajac", + "Sam Ruby", + "Louis Nyffenegger", + "Mark Pilgrim", + "Alex Yu", +] +__license__ = "MIT" +__version__ = '0.12.0' + +import base64 +import calendar +import copy +import email +import email.feedparser +from email import header +import email.message +import email.utils +import errno +from gettext import gettext as _ +import gzip +from hashlib import md5 as _md5 +from hashlib import sha1 as _sha +import hmac +import http.client +import io +import os +import random +import re +import socket +import ssl +import sys +import time +import urllib.parse +import zlib + +try: + import socks +except ImportError: + # TODO: remove this fallback and copypasted socksipy module upon py2/3 merge, + # idea is to have soft-dependency on any compatible module called socks + from . import socks +from .iri2uri import iri2uri + + +def has_timeout(timeout): + if hasattr(socket, "_GLOBAL_DEFAULT_TIMEOUT"): + return timeout is not None and timeout is not socket._GLOBAL_DEFAULT_TIMEOUT + return timeout is not None + + +__all__ = [ + "debuglevel", + "FailedToDecompressContent", + "Http", + "HttpLib2Error", + "ProxyInfo", + "RedirectLimit", + "RedirectMissingLocation", + "Response", + "RETRIES", + "UnimplementedDigestAuthOptionError", + "UnimplementedHmacDigestAuthOptionError", +] + +# The httplib debug level, set to a non-zero value to get debug output +debuglevel = 0 + +# A request will be tried 'RETRIES' times if it fails at the socket/connection level. +RETRIES = 2 + + +# All exceptions raised here derive from HttpLib2Error +class HttpLib2Error(Exception): + pass + + +# Some exceptions can be caught and optionally +# be turned back into responses. +class HttpLib2ErrorWithResponse(HttpLib2Error): + def __init__(self, desc, response, content): + self.response = response + self.content = content + HttpLib2Error.__init__(self, desc) + + +class RedirectMissingLocation(HttpLib2ErrorWithResponse): + pass + + +class RedirectLimit(HttpLib2ErrorWithResponse): + pass + + +class FailedToDecompressContent(HttpLib2ErrorWithResponse): + pass + + +class UnimplementedDigestAuthOptionError(HttpLib2ErrorWithResponse): + pass + + +class UnimplementedHmacDigestAuthOptionError(HttpLib2ErrorWithResponse): + pass + + +class MalformedHeader(HttpLib2Error): + pass + + +class RelativeURIError(HttpLib2Error): + pass + + +class ServerNotFoundError(HttpLib2Error): + pass + + +class ProxiesUnavailableError(HttpLib2Error): + pass + + +# Open Items: +# ----------- + +# Are we removing the cached content too soon on PUT (only delete on 200 Maybe?) + +# Pluggable cache storage (supports storing the cache in +# flat files by default. We need a plug-in architecture +# that can support Berkeley DB and Squid) + +# == Known Issues == +# Does not handle a resource that uses conneg and Last-Modified but no ETag as a cache validator. +# Does not handle Cache-Control: max-stale +# Does not use Age: headers when calculating cache freshness. + +# The number of redirections to follow before giving up. +# Note that only GET redirects are automatically followed. +# Will also honor 301 requests by saving that info and never +# requesting that URI again. +DEFAULT_MAX_REDIRECTS = 5 + +# Which headers are hop-by-hop headers by default +HOP_BY_HOP = [ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailers", + "transfer-encoding", + "upgrade", +] + +from . import certs +CA_CERTS = certs.where() + +# PROTOCOL_TLS is python 3.5.3+. PROTOCOL_SSLv23 is deprecated. +# Both PROTOCOL_TLS and PROTOCOL_SSLv23 are equivalent and means: +# > Selects the highest protocol version that both the client and server support. +# > Despite the name, this option can select “TLS” protocols as well as “SSL”. +# source: https://docs.python.org/3.5/library/ssl.html#ssl.PROTOCOL_TLS +DEFAULT_TLS_VERSION = getattr(ssl, "PROTOCOL_TLS", None) or getattr( + ssl, "PROTOCOL_SSLv23" +) + + +def _build_ssl_context( + disable_ssl_certificate_validation, ca_certs, cert_file=None, key_file=None +): + if not hasattr(ssl, "SSLContext"): + raise RuntimeError("httplib2 requires Python 3.2+ for ssl.SSLContext") + + context = ssl.SSLContext(DEFAULT_TLS_VERSION) + context.verify_mode = ( + ssl.CERT_NONE if disable_ssl_certificate_validation else ssl.CERT_REQUIRED + ) + + # check_hostname requires python 3.4+ + # we will perform the equivalent in HTTPSConnectionWithTimeout.connect() by calling ssl.match_hostname + # if check_hostname is not supported. + if hasattr(context, "check_hostname"): + context.check_hostname = not disable_ssl_certificate_validation + + context.load_verify_locations(ca_certs) + + if cert_file: + context.load_cert_chain(cert_file, key_file) + + return context + + +def _get_end2end_headers(response): + hopbyhop = list(HOP_BY_HOP) + hopbyhop.extend([x.strip() for x in response.get("connection", "").split(",")]) + return [header for header in list(response.keys()) if header not in hopbyhop] + + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +def urlnorm(uri): + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise RelativeURIError("Only absolute URIs are allowed. uri = %s" % uri) + authority = authority.lower() + scheme = scheme.lower() + if not path: + path = "/" + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + scheme = scheme.lower() + defrag_uri = scheme + "://" + authority + request_uri + return scheme, authority, request_uri, defrag_uri + + +# Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/) +re_url_scheme = re.compile(r"^\w+://") +re_unsafe = re.compile(r"[^\w\-_.()=!]+", re.ASCII) + + +def safename(filename): + """Return a filename suitable for the cache. + Strips dangerous and common characters to create a filename we + can use to store the cache in. + """ + if isinstance(filename, bytes): + filename_bytes = filename + filename = filename.decode("utf-8") + else: + filename_bytes = filename.encode("utf-8") + filemd5 = _md5(filename_bytes).hexdigest() + filename = re_url_scheme.sub("", filename) + filename = re_unsafe.sub("", filename) + + # limit length of filename (vital for Windows) + # https://github.com/httplib2/httplib2/pull/74 + # C:\Users\ \AppData\Local\Temp\ , + # 9 chars + max 104 chars + 20 chars + x + 1 + 32 = max 259 chars + # Thus max safe filename x = 93 chars. Let it be 90 to make a round sum: + filename = filename[:90] + + return ",".join((filename, filemd5)) + + +NORMALIZE_SPACE = re.compile(r"(?:\r\n)?[ \t]+") + + +def _normalize_headers(headers): + return dict( + [ + ( + _convert_byte_str(key).lower(), + NORMALIZE_SPACE.sub(_convert_byte_str(value), " ").strip(), + ) + for (key, value) in headers.items() + ] + ) + + +def _convert_byte_str(s): + if not isinstance(s, str): + return str(s, "utf-8") + return s + + +def _parse_cache_control(headers): + retval = {} + if "cache-control" in headers: + parts = headers["cache-control"].split(",") + parts_with_args = [ + tuple([x.strip().lower() for x in part.split("=", 1)]) + for part in parts + if -1 != part.find("=") + ] + parts_wo_args = [ + (name.strip().lower(), 1) for name in parts if -1 == name.find("=") + ] + retval = dict(parts_with_args + parts_wo_args) + return retval + + +# Whether to use a strict mode to parse WWW-Authenticate headers +# Might lead to bad results in case of ill-formed header value, +# so disabled by default, falling back to relaxed parsing. +# Set to true to turn on, usefull for testing servers. +USE_WWW_AUTH_STRICT_PARSING = 0 + +# In regex below: +# [^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+ matches a "token" as defined by HTTP +# "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?" matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space +# Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both: +# \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"? +WWW_AUTH_STRICT = re.compile( + r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$" +) +WWW_AUTH_RELAXED = re.compile( + r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(? current_age: + retval = "FRESH" + return retval + + +def _decompressContent(response, new_content): + content = new_content + try: + encoding = response.get("content-encoding", None) + if encoding in ["gzip", "deflate"]: + if encoding == "gzip": + content = gzip.GzipFile(fileobj=io.BytesIO(new_content)).read() + if encoding == "deflate": + content = zlib.decompress(content, -zlib.MAX_WBITS) + response["content-length"] = str(len(content)) + # Record the historical presence of the encoding in a way the won't interfere. + response["-content-encoding"] = response["content-encoding"] + del response["content-encoding"] + except (IOError, zlib.error): + content = "" + raise FailedToDecompressContent( + _("Content purported to be compressed with %s but failed to decompress.") + % response.get("content-encoding"), + response, + content, + ) + return content + + +def _bind_write_headers(msg): + def _write_headers(self): + # Self refers to the Generator object. + for h, v in msg.items(): + print("%s:" % h, end=" ", file=self._fp) + if isinstance(v, header.Header): + print(v.encode(maxlinelen=self._maxheaderlen), file=self._fp) + else: + # email.Header got lots of smarts, so use it. + headers = header.Header( + v, maxlinelen=self._maxheaderlen, charset="utf-8", header_name=h + ) + print(headers.encode(), file=self._fp) + # A blank line always separates headers from body. + print(file=self._fp) + + return _write_headers + + +def _updateCache(request_headers, response_headers, content, cache, cachekey): + if cachekey: + cc = _parse_cache_control(request_headers) + cc_response = _parse_cache_control(response_headers) + if "no-store" in cc or "no-store" in cc_response: + cache.delete(cachekey) + else: + info = email.message.Message() + for key, value in response_headers.items(): + if key not in ["status", "content-encoding", "transfer-encoding"]: + info[key] = value + + # Add annotations to the cache to indicate what headers + # are variant for this request. + vary = response_headers.get("vary", None) + if vary: + vary_headers = vary.lower().replace(" ", "").split(",") + for header in vary_headers: + key = "-varied-%s" % header + try: + info[key] = request_headers[header] + except KeyError: + pass + + status = response_headers.status + if status == 304: + status = 200 + + status_header = "status: %d\r\n" % status + + try: + header_str = info.as_string() + except UnicodeEncodeError: + setattr(info, "_write_headers", _bind_write_headers(info)) + header_str = info.as_string() + + header_str = re.sub("\r(?!\n)|(? 0: + service = "cl" + # No point in guessing Base or Spreadsheet + # elif request_uri.find("spreadsheets") > 0: + # service = "wise" + + auth = dict( + Email=credentials[0], + Passwd=credentials[1], + service=service, + source=headers["user-agent"], + ) + resp, content = self.http.request( + "https://www.google.com/accounts/ClientLogin", + method="POST", + body=urlencode(auth), + headers={"Content-Type": "application/x-www-form-urlencoded"}, + ) + lines = content.split("\n") + d = dict([tuple(line.split("=", 1)) for line in lines if line]) + if resp.status == 403: + self.Auth = "" + else: + self.Auth = d["Auth"] + + def request(self, method, request_uri, headers, content): + """Modify the request headers to add the appropriate + Authorization header.""" + headers["authorization"] = "GoogleLogin Auth=" + self.Auth + + +AUTH_SCHEME_CLASSES = { + "basic": BasicAuthentication, + "wsse": WsseAuthentication, + "digest": DigestAuthentication, + "hmacdigest": HmacDigestAuthentication, + "googlelogin": GoogleLoginAuthentication, +} + +AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"] + + +class FileCache(object): + """Uses a local directory as a store for cached files. + Not really safe to use if multiple threads or processes are going to + be running on the same cache. + """ + + def __init__( + self, cache, safe=safename + ): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior + self.cache = cache + self.safe = safe + if not os.path.exists(cache): + os.makedirs(self.cache) + + def get(self, key): + retval = None + cacheFullPath = os.path.join(self.cache, self.safe(key)) + try: + f = open(cacheFullPath, "rb") + retval = f.read() + f.close() + except IOError: + pass + return retval + + def set(self, key, value): + cacheFullPath = os.path.join(self.cache, self.safe(key)) + f = open(cacheFullPath, "wb") + f.write(value) + f.close() + + def delete(self, key): + cacheFullPath = os.path.join(self.cache, self.safe(key)) + if os.path.exists(cacheFullPath): + os.remove(cacheFullPath) + + +class Credentials(object): + def __init__(self): + self.credentials = [] + + def add(self, name, password, domain=""): + self.credentials.append((domain.lower(), name, password)) + + def clear(self): + self.credentials = [] + + def iter(self, domain): + for (cdomain, name, password) in self.credentials: + if cdomain == "" or domain == cdomain: + yield (name, password) + + +class KeyCerts(Credentials): + """Identical to Credentials except that + name/password are mapped to key/cert.""" + + pass + + +class AllHosts(object): + pass + + +class ProxyInfo(object): + """Collect information required to use a proxy.""" + + bypass_hosts = () + + def __init__( + self, + proxy_type, + proxy_host, + proxy_port, + proxy_rdns=True, + proxy_user=None, + proxy_pass=None, + proxy_headers=None, + ): + """Args: + + proxy_type: The type of proxy server. This must be set to one of + socks.PROXY_TYPE_XXX constants. For example: p = + ProxyInfo(proxy_type=socks.PROXY_TYPE_HTTP, proxy_host='localhost', + proxy_port=8000) + proxy_host: The hostname or IP address of the proxy server. + proxy_port: The port that the proxy server is running on. + proxy_rdns: If True (default), DNS queries will not be performed + locally, and instead, handed to the proxy to resolve. This is useful + if the network does not allow resolution of non-local names. In + httplib2 0.9 and earlier, this defaulted to False. + proxy_user: The username used to authenticate with the proxy server. + proxy_pass: The password used to authenticate with the proxy server. + proxy_headers: Additional or modified headers for the proxy connect + request. + """ + self.proxy_type, self.proxy_host, self.proxy_port, self.proxy_rdns, self.proxy_user, self.proxy_pass, self.proxy_headers = ( + proxy_type, + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + + def astuple(self): + return ( + self.proxy_type, + self.proxy_host, + self.proxy_port, + self.proxy_rdns, + self.proxy_user, + self.proxy_pass, + self.proxy_headers, + ) + + def isgood(self): + return socks and (self.proxy_host != None) and (self.proxy_port != None) + + def applies_to(self, hostname): + return not self.bypass_host(hostname) + + def bypass_host(self, hostname): + """Has this host been excluded from the proxy config""" + if self.bypass_hosts is AllHosts: + return True + + hostname = "." + hostname.lstrip(".") + for skip_name in self.bypass_hosts: + # *.suffix + if skip_name.startswith(".") and hostname.endswith(skip_name): + return True + # exact match + if hostname == "." + skip_name: + return True + return False + + def __repr__(self): + return ( + "" + ).format(p=self) + + +def proxy_info_from_environment(method="http"): + """Read proxy info from the environment variables. + """ + if method not in ("http", "https"): + return + + env_var = method + "_proxy" + url = os.environ.get(env_var, os.environ.get(env_var.upper())) + if not url: + return + return proxy_info_from_url(url, method, noproxy=None) + + +def proxy_info_from_url(url, method="http", noproxy=None): + """Construct a ProxyInfo from a URL (such as http_proxy env var) + """ + url = urllib.parse.urlparse(url) + username = None + password = None + port = None + if "@" in url[1]: + ident, host_port = url[1].split("@", 1) + if ":" in ident: + username, password = ident.split(":", 1) + else: + password = ident + else: + host_port = url[1] + if ":" in host_port: + host, port = host_port.split(":", 1) + else: + host = host_port + + if port: + port = int(port) + else: + port = dict(https=443, http=80)[method] + + proxy_type = 3 # socks.PROXY_TYPE_HTTP + pi = ProxyInfo( + proxy_type=proxy_type, + proxy_host=host, + proxy_port=port, + proxy_user=username or None, + proxy_pass=password or None, + proxy_headers=None, + ) + + bypass_hosts = [] + # If not given an explicit noproxy value, respect values in env vars. + if noproxy is None: + noproxy = os.environ.get("no_proxy", os.environ.get("NO_PROXY", "")) + # Special case: A single '*' character means all hosts should be bypassed. + if noproxy == "*": + bypass_hosts = AllHosts + elif noproxy.strip(): + bypass_hosts = noproxy.split(",") + bypass_hosts = tuple(filter(bool, bypass_hosts)) # To exclude empty string. + + pi.bypass_hosts = bypass_hosts + return pi + + +class HTTPConnectionWithTimeout(http.client.HTTPConnection): + """HTTPConnection subclass that supports timeouts + + HTTPConnection subclass that supports timeouts + + All timeouts are in seconds. If None is passed for timeout then + Python's default timeout for sockets will be used. See for example + the docs of socket.setdefaulttimeout(): + http://docs.python.org/library/socket.html#socket.setdefaulttimeout + """ + + def __init__(self, host, port=None, timeout=None, proxy_info=None): + http.client.HTTPConnection.__init__(self, host, port=port, timeout=timeout) + + self.proxy_info = proxy_info + if proxy_info and not isinstance(proxy_info, ProxyInfo): + self.proxy_info = proxy_info("http") + + def connect(self): + """Connect to the host and port specified in __init__.""" + if self.proxy_info and socks is None: + raise ProxiesUnavailableError( + "Proxy support missing but proxy use was requested!" + ) + if self.proxy_info and self.proxy_info.isgood(): + use_proxy = True + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( + self.proxy_info.astuple() + ) + + host = proxy_host + port = proxy_port + else: + use_proxy = False + + host = self.host + port = self.port + proxy_type = None + + socket_err = None + + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + try: + if use_proxy: + self.sock = socks.socksocket(af, socktype, proto) + self.sock.setproxy( + proxy_type, + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + ) + else: + self.sock = socket.socket(af, socktype, proto) + self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + if has_timeout(self.timeout): + self.sock.settimeout(self.timeout) + if self.debuglevel > 0: + print( + "connect: ({0}, {1}) ************".format(self.host, self.port) + ) + if use_proxy: + print( + "proxy: {0} ************".format( + str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + ) + + self.sock.connect((self.host, self.port) + sa[2:]) + except socket.error as e: + socket_err = e + if self.debuglevel > 0: + print("connect fail: ({0}, {1})".format(self.host, self.port)) + if use_proxy: + print( + "proxy: {0}".format( + str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + ) + if self.sock: + self.sock.close() + self.sock = None + continue + break + if not self.sock: + raise socket_err + + +class HTTPSConnectionWithTimeout(http.client.HTTPSConnection): + """This class allows communication via SSL. + + All timeouts are in seconds. If None is passed for timeout then + Python's default timeout for sockets will be used. See for example + the docs of socket.setdefaulttimeout(): + http://docs.python.org/library/socket.html#socket.setdefaulttimeout + """ + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + timeout=None, + proxy_info=None, + ca_certs=None, + disable_ssl_certificate_validation=False, + ): + + self.disable_ssl_certificate_validation = disable_ssl_certificate_validation + self.ca_certs = ca_certs if ca_certs else CA_CERTS + + self.proxy_info = proxy_info + if proxy_info and not isinstance(proxy_info, ProxyInfo): + self.proxy_info = proxy_info("https") + + context = _build_ssl_context( + self.disable_ssl_certificate_validation, self.ca_certs, cert_file, key_file + ) + super(HTTPSConnectionWithTimeout, self).__init__( + host, + port=port, + key_file=key_file, + cert_file=cert_file, + timeout=timeout, + context=context, + ) + + def connect(self): + """Connect to a host on a given (SSL) port.""" + if self.proxy_info and self.proxy_info.isgood(): + use_proxy = True + proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = ( + self.proxy_info.astuple() + ) + + host = proxy_host + port = proxy_port + else: + use_proxy = False + + host = self.host + port = self.port + proxy_type = None + proxy_headers = None + + socket_err = None + + address_info = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) + for family, socktype, proto, canonname, sockaddr in address_info: + try: + if use_proxy: + sock = socks.socksocket(family, socktype, proto) + + sock.setproxy( + proxy_type, + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + ) + else: + sock = socket.socket(family, socktype, proto) + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + if has_timeout(self.timeout): + sock.settimeout(self.timeout) + sock.connect((self.host, self.port)) + + self.sock = self._context.wrap_socket(sock, server_hostname=self.host) + + # Python 3.3 compatibility: emulate the check_hostname behavior + if ( + not hasattr(self._context, "check_hostname") + and not self.disable_ssl_certificate_validation + ): + try: + ssl.match_hostname(self.sock.getpeercert(), self.host) + except Exception: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + if self.debuglevel > 0: + print("connect: ({0}, {1})".format(self.host, self.port)) + if use_proxy: + print( + "proxy: {0}".format( + str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + ) + except (ssl.SSLError, ssl.CertificateError) as e: + if sock: + sock.close() + if self.sock: + self.sock.close() + self.sock = None + raise + except (socket.timeout, socket.gaierror): + raise + except socket.error as e: + socket_err = e + if self.debuglevel > 0: + print("connect fail: ({0}, {1})".format((self.host, self.port))) + if use_proxy: + print( + "proxy: {0}".format( + str( + ( + proxy_host, + proxy_port, + proxy_rdns, + proxy_user, + proxy_pass, + proxy_headers, + ) + ) + ) + ) + if self.sock: + self.sock.close() + self.sock = None + continue + break + if not self.sock: + raise socket_err + + +SCHEME_TO_CONNECTION = { + "http": HTTPConnectionWithTimeout, + "https": HTTPSConnectionWithTimeout, +} + + +class Http(object): + """An HTTP client that handles: + + - all methods + - caching + - ETags + - compression, + - HTTPS + - Basic + - Digest + - WSSE + + and more. + """ + + def __init__( + self, + cache=None, + timeout=None, + proxy_info=proxy_info_from_environment, + ca_certs=None, + disable_ssl_certificate_validation=False, + ): + """If 'cache' is a string then it is used as a directory name for + a disk cache. Otherwise it must be an object that supports the + same interface as FileCache. + + All timeouts are in seconds. If None is passed for timeout + then Python's default timeout for sockets will be used. See + for example the docs of socket.setdefaulttimeout(): + http://docs.python.org/library/socket.html#socket.setdefaulttimeout + + `proxy_info` may be: + - a callable that takes the http scheme ('http' or 'https') and + returns a ProxyInfo instance per request. By default, uses + proxy_info_from_environment. + - a ProxyInfo instance (static proxy config). + - None (proxy disabled). + + ca_certs is the path of a file containing root CA certificates for SSL + server certificate validation. By default, a CA cert file bundled with + httplib2 is used. + + If disable_ssl_certificate_validation is true, SSL cert validation will + not be performed. +""" + self.proxy_info = proxy_info + self.ca_certs = ca_certs + self.disable_ssl_certificate_validation = disable_ssl_certificate_validation + # Map domain name to an httplib connection + self.connections = {} + # The location of the cache, for now a directory + # where cached responses are held. + if cache and isinstance(cache, str): + self.cache = FileCache(cache) + else: + self.cache = cache + + # Name/password + self.credentials = Credentials() + + # Key/cert + self.certificates = KeyCerts() + + # authorization objects + self.authorizations = [] + + # If set to False then no redirects are followed, even safe ones. + self.follow_redirects = True + + # Which HTTP methods do we apply optimistic concurrency to, i.e. + # which methods get an "if-match:" etag header added to them. + self.optimistic_concurrency_methods = ["PUT", "PATCH"] + + # If 'follow_redirects' is True, and this is set to True then + # all redirecs are followed, including unsafe ones. + self.follow_all_redirects = False + + self.ignore_etag = False + + self.force_exception_to_status_code = False + + self.timeout = timeout + + # Keep Authorization: headers on a redirect. + self.forward_authorization_headers = False + + def __getstate__(self): + state_dict = copy.copy(self.__dict__) + # In case request is augmented by some foreign object such as + # credentials which handle auth + if "request" in state_dict: + del state_dict["request"] + if "connections" in state_dict: + del state_dict["connections"] + return state_dict + + def __setstate__(self, state): + self.__dict__.update(state) + self.connections = {} + + def _auth_from_challenge(self, host, request_uri, headers, response, content): + """A generator that creates Authorization objects + that can be applied to requests. + """ + challenges = _parse_www_authenticate(response, "www-authenticate") + for cred in self.credentials.iter(host): + for scheme in AUTH_SCHEME_ORDER: + if scheme in challenges: + yield AUTH_SCHEME_CLASSES[scheme]( + cred, host, request_uri, headers, response, content, self + ) + + def add_credentials(self, name, password, domain=""): + """Add a name and password that will be used + any time a request requires authentication.""" + self.credentials.add(name, password, domain) + + def add_certificate(self, key, cert, domain): + """Add a key and cert that will be used + any time a request requires authentication.""" + self.certificates.add(key, cert, domain) + + def clear_credentials(self): + """Remove all the names and passwords + that are used for authentication""" + self.credentials.clear() + self.authorizations = [] + + def _conn_request(self, conn, request_uri, method, body, headers): + i = 0 + seen_bad_status_line = False + while i < RETRIES: + i += 1 + try: + if conn.sock is None: + conn.connect() + conn.request(method, request_uri, body, headers) + except socket.timeout: + conn.close() + raise + except socket.gaierror: + conn.close() + raise ServerNotFoundError("Unable to find the server at %s" % conn.host) + except socket.error as e: + errno_ = ( + e.args[0].errno if isinstance(e.args[0], socket.error) else e.errno + ) + if errno_ in (errno.ENETUNREACH, errno.EADDRNOTAVAIL) and i < RETRIES: + continue # retry on potentially transient errors + raise + except http.client.HTTPException: + if conn.sock is None: + if i < RETRIES - 1: + conn.close() + conn.connect() + continue + else: + conn.close() + raise + if i < RETRIES - 1: + conn.close() + conn.connect() + continue + # Just because the server closed the connection doesn't apparently mean + # that the server didn't send a response. + pass + try: + response = conn.getresponse() + except (http.client.BadStatusLine, http.client.ResponseNotReady): + # If we get a BadStatusLine on the first try then that means + # the connection just went stale, so retry regardless of the + # number of RETRIES set. + if not seen_bad_status_line and i == 1: + i = 0 + seen_bad_status_line = True + conn.close() + conn.connect() + continue + else: + conn.close() + raise + except socket.timeout: + raise + except (socket.error, http.client.HTTPException): + conn.close() + if i == 0: + conn.close() + conn.connect() + continue + else: + raise + else: + content = b"" + if method == "HEAD": + conn.close() + else: + content = response.read() + response = Response(response) + if method != "HEAD": + content = _decompressContent(response, content) + + break + return (response, content) + + def _request( + self, + conn, + host, + absolute_uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ): + """Do the actual request using the connection object + and also follow one level of redirects if necessary""" + + auths = [ + (auth.depth(request_uri), auth) + for auth in self.authorizations + if auth.inscope(host, request_uri) + ] + auth = auths and sorted(auths)[0][1] or None + if auth: + auth.request(method, request_uri, headers, body) + + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) + + if auth: + if auth.response(response, body): + auth.request(method, request_uri, headers, body) + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) + response._stale_digest = 1 + + if response.status == 401: + for authorization in self._auth_from_challenge( + host, request_uri, headers, response, content + ): + authorization.request(method, request_uri, headers, body) + (response, content) = self._conn_request( + conn, request_uri, method, body, headers + ) + if response.status != 401: + self.authorizations.append(authorization) + authorization.response(response, body) + break + + if ( + self.follow_all_redirects + or (method in ["GET", "HEAD"]) + or response.status == 303 + ): + if self.follow_redirects and response.status in [300, 301, 302, 303, 307]: + # Pick out the location header and basically start from the beginning + # remembering first to strip the ETag header and decrement our 'depth' + if redirections: + if "location" not in response and response.status != 300: + raise RedirectMissingLocation( + _( + "Redirected but the response is missing a Location: header." + ), + response, + content, + ) + # Fix-up relative redirects (which violate an RFC 2616 MUST) + if "location" in response: + location = response["location"] + (scheme, authority, path, query, fragment) = parse_uri(location) + if authority == None: + response["location"] = urllib.parse.urljoin( + absolute_uri, location + ) + if response.status == 301 and method in ["GET", "HEAD"]: + response["-x-permanent-redirect-url"] = response["location"] + if "content-location" not in response: + response["content-location"] = absolute_uri + _updateCache(headers, response, content, self.cache, cachekey) + if "if-none-match" in headers: + del headers["if-none-match"] + if "if-modified-since" in headers: + del headers["if-modified-since"] + if ( + "authorization" in headers + and not self.forward_authorization_headers + ): + del headers["authorization"] + if "location" in response: + location = response["location"] + old_response = copy.deepcopy(response) + if "content-location" not in old_response: + old_response["content-location"] = absolute_uri + redirect_method = method + if response.status in [302, 303]: + redirect_method = "GET" + body = None + (response, content) = self.request( + location, + method=redirect_method, + body=body, + headers=headers, + redirections=redirections - 1, + ) + response.previous = old_response + else: + raise RedirectLimit( + "Redirected more times than redirection_limit allows.", + response, + content, + ) + elif response.status in [200, 203] and method in ["GET", "HEAD"]: + # Don't cache 206's since we aren't going to handle byte range requests + if "content-location" not in response: + response["content-location"] = absolute_uri + _updateCache(headers, response, content, self.cache, cachekey) + + return (response, content) + + def _normalize_headers(self, headers): + return _normalize_headers(headers) + + # Need to catch and rebrand some exceptions + # Then need to optionally turn all exceptions into status codes + # including all socket.* and httplib.* exceptions. + + def request( + self, + uri, + method="GET", + body=None, + headers=None, + redirections=DEFAULT_MAX_REDIRECTS, + connection_type=None, + ): + """ Performs a single HTTP request. +The 'uri' is the URI of the HTTP resource and can begin +with either 'http' or 'https'. The value of 'uri' must be an absolute URI. + +The 'method' is the HTTP method to perform, such as GET, POST, DELETE, etc. +There is no restriction on the methods allowed. + +The 'body' is the entity body to be sent with the request. It is a string +object. + +Any extra headers that are to be sent with the request should be provided in the +'headers' dictionary. + +The maximum number of redirect to follow before raising an +exception is 'redirections. The default is 5. + +The return value is a tuple of (response, content), the first +being and instance of the 'Response' class, the second being +a string that contains the response entity body. + """ + conn_key = '' + + try: + if headers is None: + headers = {} + else: + headers = self._normalize_headers(headers) + + if "user-agent" not in headers: + headers["user-agent"] = "Python-httplib2/%s (gzip)" % __version__ + + uri = iri2uri(uri) + + (scheme, authority, request_uri, defrag_uri) = urlnorm(uri) + + conn_key = scheme + ":" + authority + conn = self.connections.get(conn_key) + if conn is None: + if not connection_type: + connection_type = SCHEME_TO_CONNECTION[scheme] + certs = list(self.certificates.iter(authority)) + if issubclass(connection_type, HTTPSConnectionWithTimeout): + if certs: + conn = self.connections[conn_key] = connection_type( + authority, + key_file=certs[0][0], + cert_file=certs[0][1], + timeout=self.timeout, + proxy_info=self.proxy_info, + ca_certs=self.ca_certs, + disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, + ) + else: + conn = self.connections[conn_key] = connection_type( + authority, + timeout=self.timeout, + proxy_info=self.proxy_info, + ca_certs=self.ca_certs, + disable_ssl_certificate_validation=self.disable_ssl_certificate_validation, + ) + else: + conn = self.connections[conn_key] = connection_type( + authority, timeout=self.timeout, proxy_info=self.proxy_info + ) + conn.set_debuglevel(debuglevel) + + if "range" not in headers and "accept-encoding" not in headers: + headers["accept-encoding"] = "gzip, deflate" + + info = email.message.Message() + cached_value = None + if self.cache: + cachekey = defrag_uri + cached_value = self.cache.get(cachekey) + if cached_value: + try: + info, content = cached_value.split(b"\r\n\r\n", 1) + info = email.message_from_bytes(info) + for k, v in info.items(): + if v.startswith("=?") and v.endswith("?="): + info.replace_header( + k, str(*email.header.decode_header(v)[0]) + ) + except (IndexError, ValueError): + self.cache.delete(cachekey) + cachekey = None + cached_value = None + else: + cachekey = None + + if ( + method in self.optimistic_concurrency_methods + and self.cache + and "etag" in info + and not self.ignore_etag + and "if-match" not in headers + ): + # http://www.w3.org/1999/04/Editing/ + headers["if-match"] = info["etag"] + + if method not in ["GET", "HEAD"] and self.cache and cachekey: + # RFC 2616 Section 13.10 + self.cache.delete(cachekey) + + # Check the vary header in the cache to see if this request + # matches what varies in the cache. + if method in ["GET", "HEAD"] and "vary" in info: + vary = info["vary"] + vary_headers = vary.lower().replace(" ", "").split(",") + for header in vary_headers: + key = "-varied-%s" % header + value = info[key] + if headers.get(header, None) != value: + cached_value = None + break + + if ( + cached_value + and method in ["GET", "HEAD"] + and self.cache + and "range" not in headers + ): + if "-x-permanent-redirect-url" in info: + # Should cached permanent redirects be counted in our redirection count? For now, yes. + if redirections <= 0: + raise RedirectLimit( + "Redirected more times than redirection_limit allows.", + {}, + "", + ) + (response, new_content) = self.request( + info["-x-permanent-redirect-url"], + method="GET", + headers=headers, + redirections=redirections - 1, + ) + response.previous = Response(info) + response.previous.fromcache = True + else: + # Determine our course of action: + # Is the cached entry fresh or stale? + # Has the client requested a non-cached response? + # + # There seems to be three possible answers: + # 1. [FRESH] Return the cache entry w/o doing a GET + # 2. [STALE] Do the GET (but add in cache validators if available) + # 3. [TRANSPARENT] Do a GET w/o any cache validators (Cache-Control: no-cache) on the request + entry_disposition = _entry_disposition(info, headers) + + if entry_disposition == "FRESH": + if not cached_value: + info["status"] = "504" + content = b"" + response = Response(info) + if cached_value: + response.fromcache = True + return (response, content) + + if entry_disposition == "STALE": + if ( + "etag" in info + and not self.ignore_etag + and not "if-none-match" in headers + ): + headers["if-none-match"] = info["etag"] + if "last-modified" in info and not "last-modified" in headers: + headers["if-modified-since"] = info["last-modified"] + elif entry_disposition == "TRANSPARENT": + pass + + (response, new_content) = self._request( + conn, + authority, + uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ) + + if response.status == 304 and method == "GET": + # Rewrite the cache entry with the new end-to-end headers + # Take all headers that are in response + # and overwrite their values in info. + # unless they are hop-by-hop, or are listed in the connection header. + + for key in _get_end2end_headers(response): + info[key] = response[key] + merged_response = Response(info) + if hasattr(response, "_stale_digest"): + merged_response._stale_digest = response._stale_digest + _updateCache( + headers, merged_response, content, self.cache, cachekey + ) + response = merged_response + response.status = 200 + response.fromcache = True + + elif response.status == 200: + content = new_content + else: + self.cache.delete(cachekey) + content = new_content + else: + cc = _parse_cache_control(headers) + if "only-if-cached" in cc: + info["status"] = "504" + response = Response(info) + content = b"" + else: + (response, content) = self._request( + conn, + authority, + uri, + request_uri, + method, + body, + headers, + redirections, + cachekey, + ) + except Exception as e: + is_timeout = isinstance(e, socket.timeout) + if is_timeout: + conn = self.connections.pop(conn_key, None) + if conn: + conn.close() + + if self.force_exception_to_status_code: + if isinstance(e, HttpLib2ErrorWithResponse): + response = e.response + content = e.content + response.status = 500 + response.reason = str(e) + elif isinstance(e, socket.timeout): + content = b"Request Timeout" + response = Response( + { + "content-type": "text/plain", + "status": "408", + "content-length": len(content), + } + ) + response.reason = "Request Timeout" + else: + content = str(e).encode("utf-8") + response = Response( + { + "content-type": "text/plain", + "status": "400", + "content-length": len(content), + } + ) + response.reason = "Bad Request" + else: + raise + + return (response, content) + + +class Response(dict): + """An object more like email.message than httplib.HTTPResponse.""" + + """Is this response from our local cache""" + fromcache = False + """HTTP protocol version used by server. + + 10 for HTTP/1.0, 11 for HTTP/1.1. + """ + version = 11 + + "Status code returned by server. " + status = 200 + """Reason phrase returned by server.""" + reason = "Ok" + + previous = None + + def __init__(self, info): + # info is either an email.message or + # an httplib.HTTPResponse object. + if isinstance(info, http.client.HTTPResponse): + for key, value in info.getheaders(): + key = key.lower() + prev = self.get(key) + if prev is not None: + value = ", ".join((prev, value)) + self[key] = value + self.status = info.status + self["status"] = str(self.status) + self.reason = info.reason + self.version = info.version + elif isinstance(info, email.message.Message): + for key, value in list(info.items()): + self[key.lower()] = value + self.status = int(self["status"]) + else: + for key, value in info.items(): + self[key.lower()] = value + self.status = int(self.get("status", self.status)) + + def __getattr__(self, name): + if name == "dict": + return self + else: + raise AttributeError(name) \ No newline at end of file diff --git a/shotgun_api3/lib/httplib2/python3/cacerts.txt b/shotgun_api3/lib/httplib2/python3/cacerts.txt new file mode 100644 index 000000000..a2a9833de --- /dev/null +++ b/shotgun_api3/lib/httplib2/python3/cacerts.txt @@ -0,0 +1,2196 @@ +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: O=Equifax OU=Equifax Secure Certificate Authority +# Subject: O=Equifax OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure CA" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 4 Public Primary Certification Authority - G3" +# Serial: 314531972711909413743075096039378935511 +# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df +# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d +# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946059622 +# MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc +# SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe +# SHA256 Fingerprint: d1:c3:39:ea:27:84:eb:87:0f:93:4f:c5:63:4e:4a:a9:ad:55:05:01:64:01:f2:64:65:d3:7a:57:46:63:35:9f +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 +# Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 +# Label: "Equifax Secure eBusiness CA 2" +# Serial: 930140085 +# MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca +# SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc +# SHA256 Fingerprint: 2f:27:4e:48:ab:a4:ac:7b:76:59:33:10:17:75:50:6d:c3:0e:e3:8e:f6:ac:d5:c0:49:32:cf:e0:41:23:42:20 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Low-Value Services Root" +# Serial: 1 +# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc +# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d +# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Public Services Root" +# Serial: 1 +# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f +# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 +# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Qualified Certificates Root" +# Serial: 1 +# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb +# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf +# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Global CA 2" +# Serial: 1 +# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 +# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d +# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Label: "America Online Root Certification Authority 1" +# Serial: 1 +# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e +# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a +# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Label: "America Online Root Certification Authority 2" +# Serial: 1 +# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf +# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 +# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=Secure Certificate Services O=Comodo CA Limited +# Subject: CN=Secure Certificate Services O=Comodo CA Limited +# Label: "Comodo Secure Services root" +# Serial: 1 +# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd +# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 +# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- + +# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited +# Subject: CN=Trusted Certificate Services O=Comodo CA Limited +# Label: "Comodo Trusted Services root" +# Serial: 1 +# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 +# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd +# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN DATACorp SGC Root CA" +# Serial: 91374294542884689855167577680241077609 +# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06 +# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4 +# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48 +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN USERFirst Hardware Root CA" +# Serial: 91374294542884704022267039221184531197 +# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 +# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 +# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Label: "TC TrustCenter Class 2 CA II" +# Serial: 941389028203453866782103406992443 +# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 +# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e +# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Label: "TC TrustCenter Class 3 CA II" +# Serial: 1506523511417715638772220530020799 +# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e +# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 +# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Label: "TC TrustCenter Universal CA I" +# Serial: 601024842042189035295619584734726 +# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c +# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 +# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Label: "TC TrustCenter Universal CA III" +# Serial: 2010889993983507346460533407902964 +# MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b +# SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87 +# SHA256 Fingerprint: 30:9b:4a:87:f6:ca:56:c9:31:69:aa:a9:9c:6d:98:88:54:d7:89:2b:d5:43:7e:2d:07:b2:9c:be:da:55:d3:5d +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy +MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl +ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm +BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF +5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv +DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v +zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT +yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj +dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh +MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI +4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz +dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY +aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G +DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH +LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +# Issuer: O=Digital Signature Trust Co., CN=DST Root CA X3 +# Subject: O=Digital Signature Trust Co., CN=DST Root CA X3 +# Label: "IdenTrust DST Root CA X3" +# Serial: 44AFB080D6A327BA893039862EF8406B +# MD5 Fingerprint: 41:03:52:DC:0F:F7:50:1B:16:F0:02:8E:BA:6F:45:C5 +# SHA1 Fingerprint: DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13 +# SHA256 Fingerprint: 06:87:26:03:31:A7:24:03:D9:09:F1:05:E6:9B:CF:0D:32:E1:BD:24:93:FF:C6:D9:20:6D:11:BC:D6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US +# Subject: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US +# Serial: 33af1e6a711a9a0bb2864b11d09fae5 +# MD5 Fingerprint: E4:A6:8A:C8:54:AC:52:42:46:0A:FD:72:48:1B:2A:44 +# SHA1 Fingerprint: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 +# SHA256 Fingerprint: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- diff --git a/shotgun_api3/lib/httplib2/python3/certs.py b/shotgun_api3/lib/httplib2/python3/certs.py new file mode 100644 index 000000000..f8fcdd8eb --- /dev/null +++ b/shotgun_api3/lib/httplib2/python3/certs.py @@ -0,0 +1,42 @@ +"""Utilities for certificate management.""" + +import os + +certifi_available = False +certifi_where = None +try: + from certifi import where as certifi_where + certifi_available = True +except ImportError: + pass + +custom_ca_locater_available = False +custom_ca_locater_where = None +try: + from ca_certs_locater import get as custom_ca_locater_where + custom_ca_locater_available = True +except ImportError: + pass + + +BUILTIN_CA_CERTS = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "cacerts.txt" +) + + +def where(): + env = os.environ.get("HTTPLIB2_CA_CERTS") + if env is not None: + if os.path.isfile(env): + return env + else: + raise RuntimeError("Environment variable HTTPLIB2_CA_CERTS not a valid file") + if custom_ca_locater_available: + return custom_ca_locater_where() + if certifi_available: + return certifi_where() + return BUILTIN_CA_CERTS + + +if __name__ == "__main__": + print(where()) \ No newline at end of file diff --git a/shotgun_api3/lib/httplib2/python3/iri2uri.py b/shotgun_api3/lib/httplib2/python3/iri2uri.py new file mode 100644 index 000000000..439de7342 --- /dev/null +++ b/shotgun_api3/lib/httplib2/python3/iri2uri.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +"""Converts an IRI to a URI.""" + +__author__ = "Joe Gregorio (joe@bitworking.org)" +__copyright__ = "Copyright 2006, Joe Gregorio" +__contributors__ = [] +__version__ = "1.0.0" +__license__ = "MIT" + +import urllib.parse + +# Convert an IRI to a URI following the rules in RFC 3987 +# +# The characters we need to enocde and escape are defined in the spec: +# +# iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD +# ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF +# / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD +# / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD +# / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD +# / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD +# / %xD0000-DFFFD / %xE1000-EFFFD + +escape_range = [ + (0xA0, 0xD7FF), + (0xE000, 0xF8FF), + (0xF900, 0xFDCF), + (0xFDF0, 0xFFEF), + (0x10000, 0x1FFFD), + (0x20000, 0x2FFFD), + (0x30000, 0x3FFFD), + (0x40000, 0x4FFFD), + (0x50000, 0x5FFFD), + (0x60000, 0x6FFFD), + (0x70000, 0x7FFFD), + (0x80000, 0x8FFFD), + (0x90000, 0x9FFFD), + (0xA0000, 0xAFFFD), + (0xB0000, 0xBFFFD), + (0xC0000, 0xCFFFD), + (0xD0000, 0xDFFFD), + (0xE1000, 0xEFFFD), + (0xF0000, 0xFFFFD), + (0x100000, 0x10FFFD), +] + + +def encode(c): + retval = c + i = ord(c) + for low, high in escape_range: + if i < low: + break + if i >= low and i <= high: + retval = "".join(["%%%2X" % o for o in c.encode("utf-8")]) + break + return retval + + +def iri2uri(uri): + """Convert an IRI to a URI. Note that IRIs must be + passed in a unicode strings. That is, do not utf-8 encode + the IRI before passing it into the function.""" + if isinstance(uri, str): + (scheme, authority, path, query, fragment) = urllib.parse.urlsplit(uri) + authority = authority.encode("idna").decode("utf-8") + # For each character in 'ucschar' or 'iprivate' + # 1. encode as utf-8 + # 2. then %-encode each octet of that utf-8 + uri = urllib.parse.urlunsplit((scheme, authority, path, query, fragment)) + uri = "".join([encode(c) for c in uri]) + return uri + + +if __name__ == "__main__": + import unittest + + class Test(unittest.TestCase): + def test_uris(self): + """Test that URIs are invariant under the transformation.""" + invariant = [ + "ftp://ftp.is.co.za/rfc/rfc1808.txt", + "http://www.ietf.org/rfc/rfc2396.txt", + "ldap://[2001:db8::7]/c=GB?objectClass?one", + "mailto:John.Doe@example.com", + "news:comp.infosystems.www.servers.unix", + "tel:+1-816-555-1212", + "telnet://192.0.2.16:80/", + "urn:oasis:names:specification:docbook:dtd:xml:4.1.2", + ] + for uri in invariant: + self.assertEqual(uri, iri2uri(uri)) + + def test_iri(self): + """Test that the right type of escaping is done for each part of the URI.""" + self.assertEqual( + "http://xn--o3h.com/%E2%98%84", + iri2uri("http://\N{COMET}.com/\N{COMET}"), + ) + self.assertEqual( + "http://bitworking.org/?fred=%E2%98%84", + iri2uri("http://bitworking.org/?fred=\N{COMET}"), + ) + self.assertEqual( + "http://bitworking.org/#%E2%98%84", + iri2uri("http://bitworking.org/#\N{COMET}"), + ) + self.assertEqual("#%E2%98%84", iri2uri("#\N{COMET}")) + self.assertEqual( + "/fred?bar=%E2%98%9A#%E2%98%84", + iri2uri("/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}"), + ) + self.assertEqual( + "/fred?bar=%E2%98%9A#%E2%98%84", + iri2uri(iri2uri("/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}")), + ) + self.assertNotEqual( + "/fred?bar=%E2%98%9A#%E2%98%84", + iri2uri( + "/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}".encode("utf-8") + ), + ) + + unittest.main() \ No newline at end of file diff --git a/shotgun_api3/lib/httplib2/python3/socks.py b/shotgun_api3/lib/httplib2/python3/socks.py new file mode 100644 index 000000000..d5e5433a8 --- /dev/null +++ b/shotgun_api3/lib/httplib2/python3/socks.py @@ -0,0 +1,516 @@ +"""SocksiPy - Python SOCKS module. + +Version 1.00 + +Copyright 2006 Dan-Haim. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of Dan Haim nor the names of his contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE. + +This module provides a standard socket-like interface for Python +for tunneling connections through SOCKS proxies. + +Minor modifications made by Christopher Gilbert (http://motomastyle.com/) for +use in PyLoris (http://pyloris.sourceforge.net/). + +Minor modifications made by Mario Vilas (http://breakingcode.wordpress.com/) +mainly to merge bug fixes found in Sourceforge. +""" + +import base64 +import socket +import struct +import sys + +if getattr(socket, "socket", None) is None: + raise ImportError("socket.socket missing, proxy support unusable") + +PROXY_TYPE_SOCKS4 = 1 +PROXY_TYPE_SOCKS5 = 2 +PROXY_TYPE_HTTP = 3 +PROXY_TYPE_HTTP_NO_TUNNEL = 4 + +_defaultproxy = None +_orgsocket = socket.socket + + +class ProxyError(Exception): + pass + + +class GeneralProxyError(ProxyError): + pass + + +class Socks5AuthError(ProxyError): + pass + + +class Socks5Error(ProxyError): + pass + + +class Socks4Error(ProxyError): + pass + + +class HTTPError(ProxyError): + pass + + +_generalerrors = ( + "success", + "invalid data", + "not connected", + "not available", + "bad proxy type", + "bad input", +) + +_socks5errors = ( + "succeeded", + "general SOCKS server failure", + "connection not allowed by ruleset", + "Network unreachable", + "Host unreachable", + "Connection refused", + "TTL expired", + "Command not supported", + "Address type not supported", + "Unknown error", +) + +_socks5autherrors = ( + "succeeded", + "authentication is required", + "all offered authentication methods were rejected", + "unknown username or invalid password", + "unknown error", +) + +_socks4errors = ( + "request granted", + "request rejected or failed", + "request rejected because SOCKS server cannot connect to identd on the client", + "request rejected because the client program and identd report different " + "user-ids", + "unknown error", +) + + +def setdefaultproxy( + proxytype=None, addr=None, port=None, rdns=True, username=None, password=None +): + """setdefaultproxy(proxytype, addr[, port[, rdns[, username[, password]]]]) + Sets a default proxy which all further socksocket objects will use, + unless explicitly changed. + """ + global _defaultproxy + _defaultproxy = (proxytype, addr, port, rdns, username, password) + + +def wrapmodule(module): + """wrapmodule(module) + + Attempts to replace a module's socket library with a SOCKS socket. Must set + a default proxy using setdefaultproxy(...) first. + This will only work on modules that import socket directly into the + namespace; + most of the Python Standard Library falls into this category. + """ + if _defaultproxy != None: + module.socket.socket = socksocket + else: + raise GeneralProxyError((4, "no proxy specified")) + + +class socksocket(socket.socket): + """socksocket([family[, type[, proto]]]) -> socket object + Open a SOCKS enabled socket. The parameters are the same as + those of the standard socket init. In order for SOCKS to work, + you must specify family=AF_INET, type=SOCK_STREAM and proto=0. + """ + + def __init__( + self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None + ): + _orgsocket.__init__(self, family, type, proto, _sock) + if _defaultproxy != None: + self.__proxy = _defaultproxy + else: + self.__proxy = (None, None, None, None, None, None) + self.__proxysockname = None + self.__proxypeername = None + self.__httptunnel = True + + def __recvall(self, count): + """__recvall(count) -> data + Receive EXACTLY the number of bytes requested from the socket. + Blocks until the required number of bytes have been received. + """ + data = self.recv(count) + while len(data) < count: + d = self.recv(count - len(data)) + if not d: + raise GeneralProxyError((0, "connection closed unexpectedly")) + data = data + d + return data + + def sendall(self, content, *args): + """ override socket.socket.sendall method to rewrite the header + for non-tunneling proxies if needed + """ + if not self.__httptunnel: + content = self.__rewriteproxy(content) + return super(socksocket, self).sendall(content, *args) + + def __rewriteproxy(self, header): + """ rewrite HTTP request headers to support non-tunneling proxies + (i.e. those which do not support the CONNECT method). + This only works for HTTP (not HTTPS) since HTTPS requires tunneling. + """ + host, endpt = None, None + hdrs = header.split("\r\n") + for hdr in hdrs: + if hdr.lower().startswith("host:"): + host = hdr + elif hdr.lower().startswith("get") or hdr.lower().startswith("post"): + endpt = hdr + if host and endpt: + hdrs.remove(host) + hdrs.remove(endpt) + host = host.split(" ")[1] + endpt = endpt.split(" ") + if self.__proxy[4] != None and self.__proxy[5] != None: + hdrs.insert(0, self.__getauthheader()) + hdrs.insert(0, "Host: %s" % host) + hdrs.insert(0, "%s http://%s%s %s" % (endpt[0], host, endpt[1], endpt[2])) + return "\r\n".join(hdrs) + + def __getauthheader(self): + username = self.__proxy[4] + password = self.__proxy[5] + if isinstance(username, str): + username = username.encode() + if isinstance(password, str): + password = password.encode() + auth = username + b":" + password + return "Proxy-Authorization: Basic " + base64.b64encode(auth).decode() + + def setproxy( + self, + proxytype=None, + addr=None, + port=None, + rdns=True, + username=None, + password=None, + headers=None, + ): + """setproxy(proxytype, addr[, port[, rdns[, username[, password]]]]) + + Sets the proxy to be used. + proxytype - The type of the proxy to be used. Three types + are supported: PROXY_TYPE_SOCKS4 (including socks4a), + PROXY_TYPE_SOCKS5 and PROXY_TYPE_HTTP + addr - The address of the server (IP or DNS). + port - The port of the server. Defaults to 1080 for SOCKS + servers and 8080 for HTTP proxy servers. + rdns - Should DNS queries be preformed on the remote side + (rather than the local side). The default is True. + Note: This has no effect with SOCKS4 servers. + username - Username to authenticate with to the server. + The default is no authentication. + password - Password to authenticate with to the server. + Only relevant when username is also provided. + headers - Additional or modified headers for the proxy connect + request. + """ + self.__proxy = (proxytype, addr, port, rdns, username, password, headers) + + def __negotiatesocks5(self, destaddr, destport): + """__negotiatesocks5(self,destaddr,destport) + Negotiates a connection through a SOCKS5 server. + """ + # First we'll send the authentication packages we support. + if (self.__proxy[4] != None) and (self.__proxy[5] != None): + # The username/password details were supplied to the + # setproxy method so we support the USERNAME/PASSWORD + # authentication (in addition to the standard none). + self.sendall(struct.pack("BBBB", 0x05, 0x02, 0x00, 0x02)) + else: + # No username/password were entered, therefore we + # only support connections with no authentication. + self.sendall(struct.pack("BBB", 0x05, 0x01, 0x00)) + # We'll receive the server's response to determine which + # method was selected + chosenauth = self.__recvall(2) + if chosenauth[0:1] != chr(0x05).encode(): + self.close() + raise GeneralProxyError((1, _generalerrors[1])) + # Check the chosen authentication method + if chosenauth[1:2] == chr(0x00).encode(): + # No authentication is required + pass + elif chosenauth[1:2] == chr(0x02).encode(): + # Okay, we need to perform a basic username/password + # authentication. + self.sendall( + chr(0x01).encode() + + chr(len(self.__proxy[4])) + + self.__proxy[4] + + chr(len(self.__proxy[5])) + + self.__proxy[5] + ) + authstat = self.__recvall(2) + if authstat[0:1] != chr(0x01).encode(): + # Bad response + self.close() + raise GeneralProxyError((1, _generalerrors[1])) + if authstat[1:2] != chr(0x00).encode(): + # Authentication failed + self.close() + raise Socks5AuthError((3, _socks5autherrors[3])) + # Authentication succeeded + else: + # Reaching here is always bad + self.close() + if chosenauth[1] == chr(0xFF).encode(): + raise Socks5AuthError((2, _socks5autherrors[2])) + else: + raise GeneralProxyError((1, _generalerrors[1])) + # Now we can request the actual connection + req = struct.pack("BBB", 0x05, 0x01, 0x00) + # If the given destination address is an IP address, we'll + # use the IPv4 address request even if remote resolving was specified. + try: + ipaddr = socket.inet_aton(destaddr) + req = req + chr(0x01).encode() + ipaddr + except socket.error: + # Well it's not an IP number, so it's probably a DNS name. + if self.__proxy[3]: + # Resolve remotely + ipaddr = None + req = ( + req + + chr(0x03).encode() + + chr(len(destaddr)).encode() + + destaddr.encode() + ) + else: + # Resolve locally + ipaddr = socket.inet_aton(socket.gethostbyname(destaddr)) + req = req + chr(0x01).encode() + ipaddr + req = req + struct.pack(">H", destport) + self.sendall(req) + # Get the response + resp = self.__recvall(4) + if resp[0:1] != chr(0x05).encode(): + self.close() + raise GeneralProxyError((1, _generalerrors[1])) + elif resp[1:2] != chr(0x00).encode(): + # Connection failed + self.close() + if ord(resp[1:2]) <= 8: + raise Socks5Error((ord(resp[1:2]), _socks5errors[ord(resp[1:2])])) + else: + raise Socks5Error((9, _socks5errors[9])) + # Get the bound address/port + elif resp[3:4] == chr(0x01).encode(): + boundaddr = self.__recvall(4) + elif resp[3:4] == chr(0x03).encode(): + resp = resp + self.recv(1) + boundaddr = self.__recvall(ord(resp[4:5])) + else: + self.close() + raise GeneralProxyError((1, _generalerrors[1])) + boundport = struct.unpack(">H", self.__recvall(2))[0] + self.__proxysockname = (boundaddr, boundport) + if ipaddr != None: + self.__proxypeername = (socket.inet_ntoa(ipaddr), destport) + else: + self.__proxypeername = (destaddr, destport) + + def getproxysockname(self): + """getsockname() -> address info + Returns the bound IP address and port number at the proxy. + """ + return self.__proxysockname + + def getproxypeername(self): + """getproxypeername() -> address info + Returns the IP and port number of the proxy. + """ + return _orgsocket.getpeername(self) + + def getpeername(self): + """getpeername() -> address info + Returns the IP address and port number of the destination + machine (note: getproxypeername returns the proxy) + """ + return self.__proxypeername + + def __negotiatesocks4(self, destaddr, destport): + """__negotiatesocks4(self,destaddr,destport) + Negotiates a connection through a SOCKS4 server. + """ + # Check if the destination address provided is an IP address + rmtrslv = False + try: + ipaddr = socket.inet_aton(destaddr) + except socket.error: + # It's a DNS name. Check where it should be resolved. + if self.__proxy[3]: + ipaddr = struct.pack("BBBB", 0x00, 0x00, 0x00, 0x01) + rmtrslv = True + else: + ipaddr = socket.inet_aton(socket.gethostbyname(destaddr)) + # Construct the request packet + req = struct.pack(">BBH", 0x04, 0x01, destport) + ipaddr + # The username parameter is considered userid for SOCKS4 + if self.__proxy[4] != None: + req = req + self.__proxy[4] + req = req + chr(0x00).encode() + # DNS name if remote resolving is required + # NOTE: This is actually an extension to the SOCKS4 protocol + # called SOCKS4A and may not be supported in all cases. + if rmtrslv: + req = req + destaddr + chr(0x00).encode() + self.sendall(req) + # Get the response from the server + resp = self.__recvall(8) + if resp[0:1] != chr(0x00).encode(): + # Bad data + self.close() + raise GeneralProxyError((1, _generalerrors[1])) + if resp[1:2] != chr(0x5A).encode(): + # Server returned an error + self.close() + if ord(resp[1:2]) in (91, 92, 93): + self.close() + raise Socks4Error((ord(resp[1:2]), _socks4errors[ord(resp[1:2]) - 90])) + else: + raise Socks4Error((94, _socks4errors[4])) + # Get the bound address/port + self.__proxysockname = ( + socket.inet_ntoa(resp[4:]), + struct.unpack(">H", resp[2:4])[0], + ) + if rmtrslv != None: + self.__proxypeername = (socket.inet_ntoa(ipaddr), destport) + else: + self.__proxypeername = (destaddr, destport) + + def __negotiatehttp(self, destaddr, destport): + """__negotiatehttp(self,destaddr,destport) + Negotiates a connection through an HTTP server. + """ + # If we need to resolve locally, we do this now + if not self.__proxy[3]: + addr = socket.gethostbyname(destaddr) + else: + addr = destaddr + headers = ["CONNECT ", addr, ":", str(destport), " HTTP/1.1\r\n"] + wrote_host_header = False + wrote_auth_header = False + if self.__proxy[6] != None: + for key, val in self.__proxy[6].iteritems(): + headers += [key, ": ", val, "\r\n"] + wrote_host_header = key.lower() == "host" + wrote_auth_header = key.lower() == "proxy-authorization" + if not wrote_host_header: + headers += ["Host: ", destaddr, "\r\n"] + if not wrote_auth_header: + if self.__proxy[4] != None and self.__proxy[5] != None: + headers += [self.__getauthheader(), "\r\n"] + headers.append("\r\n") + self.sendall("".join(headers).encode()) + # We read the response until we get the string "\r\n\r\n" + resp = self.recv(1) + while resp.find("\r\n\r\n".encode()) == -1: + resp = resp + self.recv(1) + # We just need the first line to check if the connection + # was successful + statusline = resp.splitlines()[0].split(" ".encode(), 2) + if statusline[0] not in ("HTTP/1.0".encode(), "HTTP/1.1".encode()): + self.close() + raise GeneralProxyError((1, _generalerrors[1])) + try: + statuscode = int(statusline[1]) + except ValueError: + self.close() + raise GeneralProxyError((1, _generalerrors[1])) + if statuscode != 200: + self.close() + raise HTTPError((statuscode, statusline[2])) + self.__proxysockname = ("0.0.0.0", 0) + self.__proxypeername = (addr, destport) + + def connect(self, destpair): + """connect(self, despair) + Connects to the specified destination through a proxy. + destpar - A tuple of the IP/DNS address and the port number. + (identical to socket's connect). + To select the proxy server use setproxy(). + """ + # Do a minimal input check first + if ( + (not type(destpair) in (list, tuple)) + or (len(destpair) < 2) + or (not isinstance(destpair[0], (str, bytes))) + or (type(destpair[1]) != int) + ): + raise GeneralProxyError((5, _generalerrors[5])) + if self.__proxy[0] == PROXY_TYPE_SOCKS5: + if self.__proxy[2] != None: + portnum = self.__proxy[2] + else: + portnum = 1080 + _orgsocket.connect(self, (self.__proxy[1], portnum)) + self.__negotiatesocks5(destpair[0], destpair[1]) + elif self.__proxy[0] == PROXY_TYPE_SOCKS4: + if self.__proxy[2] != None: + portnum = self.__proxy[2] + else: + portnum = 1080 + _orgsocket.connect(self, (self.__proxy[1], portnum)) + self.__negotiatesocks4(destpair[0], destpair[1]) + elif self.__proxy[0] == PROXY_TYPE_HTTP: + if self.__proxy[2] != None: + portnum = self.__proxy[2] + else: + portnum = 8080 + _orgsocket.connect(self, (self.__proxy[1], portnum)) + self.__negotiatehttp(destpair[0], destpair[1]) + elif self.__proxy[0] == PROXY_TYPE_HTTP_NO_TUNNEL: + if self.__proxy[2] != None: + portnum = self.__proxy[2] + else: + portnum = 8080 + _orgsocket.connect(self, (self.__proxy[1], portnum)) + if destpair[1] == 443: + self.__negotiatehttp(destpair[0], destpair[1]) + else: + self.__httptunnel = False + elif self.__proxy[0] == None: + _orgsocket.connect(self, (destpair[0], destpair[1])) + else: + raise GeneralProxyError((4, _generalerrors[4])) \ No newline at end of file diff --git a/shotgun_api3/lib/mimetypes.py b/shotgun_api3/lib/mimetypes.py index a39b543c4..8416aa630 100644 --- a/shotgun_api3/lib/mimetypes.py +++ b/shotgun_api3/lib/mimetypes.py @@ -23,18 +23,19 @@ read_mime_types(file) -- parse one file, return a dictionary or None """ +from __future__ import print_function import os import sys import posixpath -import urllib +from .six.moves import urllib, range try: - import _winreg + from .six.moves import winreg except ImportError: - _winreg = None + winreg = None __all__ = [ - "guess_type","guess_extension","guess_all_extensions", - "add_type","read_mime_types","init" + "guess_type", "guess_extension", "guess_all_extensions", + "add_type", "read_mime_types", "init" ] knownfiles = [ @@ -47,7 +48,7 @@ "/usr/local/lib/netscape/mime.types", "/usr/local/etc/httpd/conf/mime.types", # Apache 1.2 "/usr/local/etc/mime.types", # Apache 1.3 - ] +] inited = False _db = None @@ -66,7 +67,7 @@ def __init__(self, filenames=(), strict=True): init() self.encodings_map = encodings_map.copy() self.suffix_map = suffix_map.copy() - self.types_map = ({}, {}) # dict for (non-strict, strict) + self.types_map = ({}, {}) # dict for (non-strict, strict) self.types_map_inv = ({}, {}) for (ext, type) in types_map.items(): self.add_type(type, ext, True) @@ -111,7 +112,7 @@ def guess_type(self, url, strict=True): Optional `strict' argument when False adds a bunch of commonly found, but non-standard types. """ - scheme, url = urllib.splittype(url) + scheme, url = urllib.parse.splittype(url) if scheme == 'data': # syntax of data URLs: # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data @@ -235,14 +236,14 @@ def read_windows_registry(self, strict=True): """ # Windows only - if not _winreg: + if not winreg: return def enum_types(mimedb): i = 0 while True: try: - ctype = _winreg.EnumKey(mimedb, i) + ctype = winreg.EnumKey(mimedb, i) except EnvironmentError: break else: @@ -251,17 +252,17 @@ def enum_types(mimedb): i += 1 default_encoding = sys.getdefaultencoding() - with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr: + with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, '') as hkcr: for subkeyname in enum_types(hkcr): try: - with _winreg.OpenKey(hkcr, subkeyname) as subkey: + with winreg.OpenKey(hkcr, subkeyname) as subkey: # Only check file extensions if not subkeyname.startswith("."): continue # raises EnvironmentError if no 'Content Type' value - mimetype, datatype = _winreg.QueryValueEx( + mimetype, datatype = winreg.QueryValueEx( subkey, 'Content Type') - if datatype != _winreg.REG_SZ: + if datatype != winreg.REG_SZ: continue try: mimetype = mimetype.encode(default_encoding) @@ -271,6 +272,7 @@ def enum_types(mimedb): except EnvironmentError: continue + def guess_type(url, strict=True): """Guess the type of a file based on its URL. @@ -311,6 +313,7 @@ def guess_all_extensions(type, strict=True): init() return _db.guess_all_extensions(type, strict) + def guess_extension(type, strict=True): """Guess the extension for a file based on its MIME type. @@ -327,6 +330,7 @@ def guess_extension(type, strict=True): init() return _db.guess_extension(type, strict) + def add_type(type, ext, strict=True): """Add a mapping between a type and an extension. @@ -350,7 +354,7 @@ def init(files=None): inited = True # so that MimeTypes.__init__() doesn't call us again db = MimeTypes() if files is None: - if _winreg: + if winreg: db.read_windows_registry() files = knownfiles for file in files: @@ -387,14 +391,14 @@ def _default_mime_types(): '.tz': '.tar.gz', '.tbz2': '.tar.bz2', '.txz': '.tar.xz', - } + } encodings_map = { '.gz': 'gzip', '.Z': 'compress', '.bz2': 'bzip2', '.xz': 'xz', - } + } # Before adding new types, make sure they are either registered with IANA, # at http://www.isi.edu/in-notes/iana/assignments/media-types @@ -402,147 +406,147 @@ def _default_mime_types(): # If you add to these, please keep them sorted! types_map = { - '.a' : 'application/octet-stream', - '.ai' : 'application/postscript', - '.aif' : 'audio/x-aiff', - '.aifc' : 'audio/x-aiff', - '.aiff' : 'audio/x-aiff', - '.au' : 'audio/basic', - '.avi' : 'video/x-msvideo', - '.bat' : 'text/plain', - '.bcpio' : 'application/x-bcpio', - '.bin' : 'application/octet-stream', - '.bmp' : 'image/x-ms-bmp', - '.c' : 'text/plain', + '.a': 'application/octet-stream', + '.ai': 'application/postscript', + '.aif': 'audio/x-aiff', + '.aifc': 'audio/x-aiff', + '.aiff': 'audio/x-aiff', + '.au': 'audio/basic', + '.avi': 'video/x-msvideo', + '.bat': 'text/plain', + '.bcpio': 'application/x-bcpio', + '.bin': 'application/octet-stream', + '.bmp': 'image/x-ms-bmp', + '.c': 'text/plain', # Duplicates :( - '.cdf' : 'application/x-cdf', - '.cdf' : 'application/x-netcdf', - '.cpio' : 'application/x-cpio', - '.csh' : 'application/x-csh', - '.css' : 'text/css', - '.dll' : 'application/octet-stream', - '.doc' : 'application/msword', - '.dot' : 'application/msword', - '.dvi' : 'application/x-dvi', - '.eml' : 'message/rfc822', - '.eps' : 'application/postscript', - '.etx' : 'text/x-setext', - '.exe' : 'application/octet-stream', - '.gif' : 'image/gif', - '.gtar' : 'application/x-gtar', - '.h' : 'text/plain', - '.hdf' : 'application/x-hdf', - '.htm' : 'text/html', - '.html' : 'text/html', - '.ico' : 'image/vnd.microsoft.icon', - '.ief' : 'image/ief', - '.jpe' : 'image/jpeg', - '.jpeg' : 'image/jpeg', - '.jpg' : 'image/jpeg', - '.js' : 'application/javascript', - '.ksh' : 'text/plain', - '.latex' : 'application/x-latex', - '.m1v' : 'video/mpeg', - '.man' : 'application/x-troff-man', - '.me' : 'application/x-troff-me', - '.mht' : 'message/rfc822', - '.mhtml' : 'message/rfc822', - '.mif' : 'application/x-mif', - '.mov' : 'video/quicktime', - '.movie' : 'video/x-sgi-movie', - '.mp2' : 'audio/mpeg', - '.mp3' : 'audio/mpeg', - '.mp4' : 'video/mp4', - '.mpa' : 'video/mpeg', - '.mpe' : 'video/mpeg', - '.mpeg' : 'video/mpeg', - '.mpg' : 'video/mpeg', - '.ms' : 'application/x-troff-ms', - '.nc' : 'application/x-netcdf', - '.nws' : 'message/rfc822', - '.o' : 'application/octet-stream', - '.obj' : 'application/octet-stream', - '.oda' : 'application/oda', - '.p12' : 'application/x-pkcs12', - '.p7c' : 'application/pkcs7-mime', - '.pbm' : 'image/x-portable-bitmap', - '.pdf' : 'application/pdf', - '.pfx' : 'application/x-pkcs12', - '.pgm' : 'image/x-portable-graymap', - '.pl' : 'text/plain', - '.png' : 'image/png', - '.pnm' : 'image/x-portable-anymap', - '.pot' : 'application/vnd.ms-powerpoint', - '.ppa' : 'application/vnd.ms-powerpoint', - '.ppm' : 'image/x-portable-pixmap', - '.pps' : 'application/vnd.ms-powerpoint', - '.ppt' : 'application/vnd.ms-powerpoint', - '.ps' : 'application/postscript', - '.pwz' : 'application/vnd.ms-powerpoint', - '.py' : 'text/x-python', - '.pyc' : 'application/x-python-code', - '.pyo' : 'application/x-python-code', - '.qt' : 'video/quicktime', - '.ra' : 'audio/x-pn-realaudio', - '.ram' : 'application/x-pn-realaudio', - '.ras' : 'image/x-cmu-raster', - '.rdf' : 'application/xml', - '.rgb' : 'image/x-rgb', - '.roff' : 'application/x-troff', - '.rtx' : 'text/richtext', - '.sgm' : 'text/x-sgml', - '.sgml' : 'text/x-sgml', - '.sh' : 'application/x-sh', - '.shar' : 'application/x-shar', - '.snd' : 'audio/basic', - '.so' : 'application/octet-stream', - '.src' : 'application/x-wais-source', + # '.cdf': 'application/x-cdf', + '.cdf': 'application/x-netcdf', + '.cpio': 'application/x-cpio', + '.csh': 'application/x-csh', + '.css': 'text/css', + '.dll': 'application/octet-stream', + '.doc': 'application/msword', + '.dot': 'application/msword', + '.dvi': 'application/x-dvi', + '.eml': 'message/rfc822', + '.eps': 'application/postscript', + '.etx': 'text/x-setext', + '.exe': 'application/octet-stream', + '.gif': 'image/gif', + '.gtar': 'application/x-gtar', + '.h': 'text/plain', + '.hdf': 'application/x-hdf', + '.htm': 'text/html', + '.html': 'text/html', + '.ico': 'image/vnd.microsoft.icon', + '.ief': 'image/ief', + '.jpe': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.jpg': 'image/jpeg', + '.js': 'application/javascript', + '.ksh': 'text/plain', + '.latex': 'application/x-latex', + '.m1v': 'video/mpeg', + '.man': 'application/x-troff-man', + '.me': 'application/x-troff-me', + '.mht': 'message/rfc822', + '.mhtml': 'message/rfc822', + '.mif': 'application/x-mif', + '.mov': 'video/quicktime', + '.movie': 'video/x-sgi-movie', + '.mp2': 'audio/mpeg', + '.mp3': 'audio/mpeg', + '.mp4': 'video/mp4', + '.mpa': 'video/mpeg', + '.mpe': 'video/mpeg', + '.mpeg': 'video/mpeg', + '.mpg': 'video/mpeg', + '.ms': 'application/x-troff-ms', + '.nc': 'application/x-netcdf', + '.nws': 'message/rfc822', + '.o': 'application/octet-stream', + '.obj': 'application/octet-stream', + '.oda': 'application/oda', + '.p12': 'application/x-pkcs12', + '.p7c': 'application/pkcs7-mime', + '.pbm': 'image/x-portable-bitmap', + '.pdf': 'application/pdf', + '.pfx': 'application/x-pkcs12', + '.pgm': 'image/x-portable-graymap', + '.pl': 'text/plain', + '.png': 'image/png', + '.pnm': 'image/x-portable-anymap', + '.pot': 'application/vnd.ms-powerpoint', + '.ppa': 'application/vnd.ms-powerpoint', + '.ppm': 'image/x-portable-pixmap', + '.pps': 'application/vnd.ms-powerpoint', + '.ppt': 'application/vnd.ms-powerpoint', + '.ps': 'application/postscript', + '.pwz': 'application/vnd.ms-powerpoint', + '.py': 'text/x-python', + '.pyc': 'application/x-python-code', + '.pyo': 'application/x-python-code', + '.qt': 'video/quicktime', + '.ra': 'audio/x-pn-realaudio', + '.ram': 'application/x-pn-realaudio', + '.ras': 'image/x-cmu-raster', + '.rdf': 'application/xml', + '.rgb': 'image/x-rgb', + '.roff': 'application/x-troff', + '.rtx': 'text/richtext', + '.sgm': 'text/x-sgml', + '.sgml': 'text/x-sgml', + '.sh': 'application/x-sh', + '.shar': 'application/x-shar', + '.snd': 'audio/basic', + '.so': 'application/octet-stream', + '.src': 'application/x-wais-source', '.sv4cpio': 'application/x-sv4cpio', - '.sv4crc' : 'application/x-sv4crc', - '.swf' : 'application/x-shockwave-flash', - '.t' : 'application/x-troff', - '.tar' : 'application/x-tar', - '.tcl' : 'application/x-tcl', - '.tex' : 'application/x-tex', - '.texi' : 'application/x-texinfo', + '.sv4crc': 'application/x-sv4crc', + '.swf': 'application/x-shockwave-flash', + '.t': 'application/x-troff', + '.tar': 'application/x-tar', + '.tcl': 'application/x-tcl', + '.tex': 'application/x-tex', + '.texi': 'application/x-texinfo', '.texinfo': 'application/x-texinfo', - '.tif' : 'image/tiff', - '.tiff' : 'image/tiff', - '.tr' : 'application/x-troff', - '.tsv' : 'text/tab-separated-values', - '.txt' : 'text/plain', - '.ustar' : 'application/x-ustar', - '.vcf' : 'text/x-vcard', - '.wav' : 'audio/x-wav', - '.wiz' : 'application/msword', - '.wsdl' : 'application/xml', - '.xbm' : 'image/x-xbitmap', - '.xlb' : 'application/vnd.ms-excel', + '.tif': 'image/tiff', + '.tiff': 'image/tiff', + '.tr': 'application/x-troff', + '.tsv': 'text/tab-separated-values', + '.txt': 'text/plain', + '.ustar': 'application/x-ustar', + '.vcf': 'text/x-vcard', + '.wav': 'audio/x-wav', + '.wiz': 'application/msword', + '.wsdl': 'application/xml', + '.xbm': 'image/x-xbitmap', + '.xlb': 'application/vnd.ms-excel', # Duplicates :( - '.xls' : 'application/excel', - '.xls' : 'application/vnd.ms-excel', - '.xml' : 'text/xml', - '.xpdl' : 'application/xml', - '.xpm' : 'image/x-xpixmap', - '.xsl' : 'application/xml', - '.xwd' : 'image/x-xwindowdump', - '.zip' : 'application/zip', - } + # '.xls': 'application/excel', + '.xls': 'application/vnd.ms-excel', + '.xml': 'text/xml', + '.xpdl': 'application/xml', + '.xpm': 'image/x-xpixmap', + '.xsl': 'application/xml', + '.xwd': 'image/x-xwindowdump', + '.zip': 'application/zip', + } # These are non-standard types, commonly found in the wild. They will # only match if strict=0 flag is given to the API methods. # Please sort these too common_types = { - '.jpg' : 'image/jpg', - '.mid' : 'audio/midi', + '.jpg': 'image/jpg', + '.mid': 'audio/midi', '.midi': 'audio/midi', - '.pct' : 'image/pict', - '.pic' : 'image/pict', + '.pct': 'image/pict', + '.pic': 'image/pict', '.pict': 'image/pict', - '.rtf' : 'application/rtf', - '.xul' : 'text/xul' - } + '.rtf': 'application/rtf', + '.xul': 'text/xul' + } _default_mime_types() @@ -564,14 +568,15 @@ def _default_mime_types(): """ def usage(code, msg=''): - print USAGE - if msg: print msg + print(USAGE) + if msg: + print(msg) sys.exit(code) try: opts, args = getopt.getopt(sys.argv[1:], 'hle', ['help', 'lenient', 'extension']) - except getopt.error, msg: + except getopt.error as msg: usage(1, msg) strict = 1 @@ -586,9 +591,13 @@ def usage(code, msg=''): for gtype in args: if extension: guess = guess_extension(gtype, strict) - if not guess: print "I don't know anything about type", gtype - else: print guess + if not guess: + print("I don't know anything about type {}".format(gtype)) + else: + print(guess) else: guess, encoding = guess_type(gtype, strict) - if not guess: print "I don't know anything about type", gtype - else: print 'type:', guess, 'encoding:', encoding + if not guess: + print("I don't know anything about type {}".format(gtype)) + else: + print("type: {} encoding: {}".format(guess, encoding)) diff --git a/shotgun_api3/lib/mockgun/mockgun.py b/shotgun_api3/lib/mockgun/mockgun.py index d8f33cebb..e94d92b49 100644 --- a/shotgun_api3/lib/mockgun/mockgun.py +++ b/shotgun_api3/lib/mockgun/mockgun.py @@ -87,11 +87,11 @@ sg = mockgun.Shotgun("https://mysite.shotgunstudio.com", script_name="xyz", api_key="abc") # now you can start putting stuff in - print sg.create("HumanUser", {"firstname": "John", "login": "john"}) + print(sg.create("HumanUser", {"firstname": "John", "login": "john"})) # prints {'login': 'john', 'type': 'HumanUser', 'id': 1, 'firstname': 'John'} # and find what you have created - print sg.find("HumanUser", [["login", "is", "john"]]) + print(sg.find("HumanUser", [["login", "is", "john"]])) prints [{'type': 'HumanUser', 'id': 1}] That's it! Mockgun is used to run the Shotgun Pipeline Toolkit unit test rig. @@ -120,6 +120,7 @@ from ...shotgun import _Config from .errors import MockgunError from .schema import SchemaFactory +from .. import six # ---------------------------------------------------------------------------- # Version @@ -491,12 +492,12 @@ def _validate_entity_data(self, entity_type, data): "float": float, "checkbox": bool, "percent": int, - "text": basestring, + "text": six.string_types, "serializable": dict, "date": datetime.date, "date_time": datetime.datetime, - "list": basestring, - "status_list": basestring, + "list": six.string_types, + "status_list": six.string_types, "url": dict}[sg_type] except KeyError: raise ShotgunError( diff --git a/shotgun_api3/lib/mockgun/schema.py b/shotgun_api3/lib/mockgun/schema.py index edd4b889a..a5c584ca6 100644 --- a/shotgun_api3/lib/mockgun/schema.py +++ b/shotgun_api3/lib/mockgun/schema.py @@ -30,9 +30,8 @@ ----------------------------------------------------------------------------- """ -import cPickle as pickle +from ..six.moves import cPickle as pickle import os -import copy from .errors import MockgunError diff --git a/shotgun_api3/lib/requirements.txt b/shotgun_api3/lib/requirements.txt index 595e085db..15cf82712 100644 --- a/shotgun_api3/lib/requirements.txt +++ b/shotgun_api3/lib/requirements.txt @@ -29,4 +29,4 @@ # This file is unused. It is left there so Github can warn us is a CVE is # released for our dependencies. httplib2==0.12.0 -simplejson=2.1.6 \ No newline at end of file +six==1.12.0 \ No newline at end of file diff --git a/shotgun_api3/lib/sgsix.py b/shotgun_api3/lib/sgsix.py new file mode 100644 index 000000000..e66e88123 --- /dev/null +++ b/shotgun_api3/lib/sgsix.py @@ -0,0 +1,57 @@ +""" + ----------------------------------------------------------------------------- + Copyright (c) 2009-2019, Shotgun Software Inc. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + - Neither the name of the Shotgun Software Inc nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +# This module contains addtional functions and variables to supplement the six +# module for python 2/3 compatibility. + +from . import six +import io + +# For python 3, the `file` type no longer exists, and open() returns an +# io.IOBase instance. We add file_types to allow comparison across python +# versions. See https://stackoverflow.com/questions/36321030#36321030 +# +# This means that to test if a variable contains a file in both Python 2 and 3 +# you can use an isinstance test like: +# isinstance(value, sgsix.file_types) +if six.PY3: + file_types = (io.IOBase, ) +else: + file_types = (file, io.IOBase) # noqa warning for undefined `file` in python 3 + +# For python-api calls that result in an SSL error, the exception raised is +# different on Python 2 and 3. Store the approriate exception class in a +# variable to allow easier exception handling across Python 2/3. +if six.PY3: + import ssl + ShotgunSSLError = ssl.SSLError +else: + from .httplib2 import SSLHandshakeError + ShotgunSSLError = SSLHandshakeError diff --git a/shotgun_api3/lib/sgtimezone.py b/shotgun_api3/lib/sgtimezone.py index ef06c8640..df0b73281 100644 --- a/shotgun_api3/lib/sgtimezone.py +++ b/shotgun_api3/lib/sgtimezone.py @@ -1,13 +1,25 @@ #! /opt/local/bin/python + +# Copyright (c) 2019 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + # ---------------------------------------------------------------------------- # SG_TIMEZONE module -# this is rolled into the this shotgun api file to avoid having to require +# this is rolled into the this shotgun api file to avoid having to require # current users of api2 to install new modules and modify PYTHONPATH info. # ---------------------------------------------------------------------------- -from datetime import tzinfo, timedelta, datetime +from datetime import tzinfo, timedelta import time as _time + class SgTimezone(object): ''' Shotgun's server infrastructure is configured for Coordinated Universal @@ -16,14 +28,14 @@ class SgTimezone(object): ''' ZERO = timedelta(0) - STDOFFSET = timedelta(seconds = -_time.timezone) + STDOFFSET = timedelta(seconds=-_time.timezone) if _time.daylight: - DSTOFFSET = timedelta(seconds = -_time.altzone) + DSTOFFSET = timedelta(seconds=-_time.altzone) else: DSTOFFSET = STDOFFSET DSTDIFF = DSTOFFSET - STDOFFSET - - def __init__(self): + + def __init__(self): self.utc = UTC() self.local = LocalTimezone() @@ -42,28 +54,30 @@ def LocalTimezone(cls): class, we allow instantiation via SgTimezone ''' return LocalTimezone() - + + class UTC(tzinfo): ''' Implementation of datetime's tzinfo to provide consistent calculated offsets against Coordinated Universal Time (UTC) ''' - + def utcoffset(self, dt): return SgTimezone.ZERO - + def tzname(self, dt): return "UTC" - + def dst(self, dt): return SgTimezone.ZERO + class LocalTimezone(tzinfo): ''' Implementation of datetime's tzinfo to provide convenient conversion between Shotgun server time and local user time ''' - + def utcoffset(self, dt): ''' Difference between the user's local timezone and UTC timezone in seconds @@ -72,7 +86,7 @@ def utcoffset(self, dt): return SgTimezone.DSTOFFSET else: return SgTimezone.STDOFFSET - + def dst(self, dt): ''' Daylight savings time (dst) offset in seconds @@ -81,14 +95,14 @@ def dst(self, dt): return SgTimezone.DSTDIFF else: return SgTimezone.ZERO - + def tzname(self, dt): ''' Name of the user's local timezone, including a reference to daylight savings time (dst) if applicable ''' return _time.tzname[self._isdst(dt)] - + def _isdst(self, dt): ''' Calculate whether the timestamp in question was in daylight savings diff --git a/shotgun_api3/lib/simplejson/__init__.py b/shotgun_api3/lib/simplejson/__init__.py deleted file mode 100644 index 210b957a9..000000000 --- a/shotgun_api3/lib/simplejson/__init__.py +++ /dev/null @@ -1,438 +0,0 @@ -r"""JSON (JavaScript Object Notation) is a subset of -JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data -interchange format. - -:mod:`simplejson` exposes an API familiar to users of the standard library -:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained -version of the :mod:`json` library contained in Python 2.6, but maintains -compatibility with Python 2.4 and Python 2.5 and (currently) has -significant performance advantages, even without using the optional C -extension for speedups. - -Encoding basic Python object hierarchies:: - - >>> import simplejson as json - >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) - '["foo", {"bar": ["baz", null, 1.0, 2]}]' - >>> print json.dumps("\"foo\bar") - "\"foo\bar" - >>> print json.dumps(u'\u1234') - "\u1234" - >>> print json.dumps('\\') - "\\" - >>> print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True) - {"a": 0, "b": 0, "c": 0} - >>> from StringIO import StringIO - >>> io = StringIO() - >>> json.dump(['streaming API'], io) - >>> io.getvalue() - '["streaming API"]' - -Compact encoding:: - - >>> import simplejson as json - >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':')) - '[1,2,3,{"4":5,"6":7}]' - -Pretty printing:: - - >>> import simplejson as json - >>> s = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=' ') - >>> print '\n'.join([l.rstrip() for l in s.splitlines()]) - { - "4": 5, - "6": 7 - } - -Decoding JSON:: - - >>> import simplejson as json - >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}] - >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj - True - >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar' - True - >>> from StringIO import StringIO - >>> io = StringIO('["streaming API"]') - >>> json.load(io)[0] == 'streaming API' - True - -Specializing JSON object decoding:: - - >>> import simplejson as json - >>> def as_complex(dct): - ... if '__complex__' in dct: - ... return complex(dct['real'], dct['imag']) - ... return dct - ... - >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}', - ... object_hook=as_complex) - (1+2j) - >>> from decimal import Decimal - >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1') - True - -Specializing JSON object encoding:: - - >>> import simplejson as json - >>> def encode_complex(obj): - ... if isinstance(obj, complex): - ... return [obj.real, obj.imag] - ... raise TypeError(repr(o) + " is not JSON serializable") - ... - >>> json.dumps(2 + 1j, default=encode_complex) - '[2.0, 1.0]' - >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j) - '[2.0, 1.0]' - >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j)) - '[2.0, 1.0]' - - -Using simplejson.tool from the shell to validate and pretty-print:: - - $ echo '{"json":"obj"}' | python -m simplejson.tool - { - "json": "obj" - } - $ echo '{ 1.2:3.4}' | python -m simplejson.tool - Expecting property name: line 1 column 2 (char 2) -""" -__version__ = '2.1.6' -__all__ = [ - 'dump', 'dumps', 'load', 'loads', - 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder', - 'OrderedDict', -] - -__author__ = 'Bob Ippolito ' - -from decimal import Decimal - -from decoder import JSONDecoder, JSONDecodeError -from encoder import JSONEncoder -def _import_OrderedDict(): - import collections - try: - return collections.OrderedDict - except AttributeError: - import ordered_dict - return ordered_dict.OrderedDict -OrderedDict = _import_OrderedDict() - -def _import_c_make_encoder(): - try: - from simplejson._speedups import make_encoder - return make_encoder - except ImportError: - return None - -_default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - use_decimal=False, -) - -def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=False, **kw): - """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a - ``.write()``-supporting file-like object). - - If ``skipkeys`` is true then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If ``ensure_ascii`` is false, then the some chunks written to ``fp`` - may be ``unicode`` instances, subject to normal Python ``str`` to - ``unicode`` coercion rules. Unless ``fp.write()`` explicitly - understands ``unicode`` (as in ``codecs.getwriter()``) this is likely - to cause an error. - - If ``check_circular`` is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If ``allow_nan`` is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) - in strict compliance of the JSON specification, instead of using the - JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). - - If *indent* is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If ``separators`` is an ``(item_separator, dict_separator)`` tuple - then it will be used instead of the default ``(', ', ': ')`` separators. - ``(',', ':')`` is the most compact JSON representation. - - ``encoding`` is the character encoding for str instances, default is UTF-8. - - ``default(obj)`` is a function that should return a serializable version - of obj or raise TypeError. The default simply raises TypeError. - - If *use_decimal* is true (default: ``False``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. - - """ - # cached encoder - if (not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and not use_decimal - and not kw): - iterable = _default_encoder.iterencode(obj) - else: - if cls is None: - cls = JSONEncoder - iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, - default=default, use_decimal=use_decimal, **kw).iterencode(obj) - # could accelerate with writelines in some versions of Python, at - # a debuggability cost - for chunk in iterable: - fp.write(chunk) - - -def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=False, **kw): - """Serialize ``obj`` to a JSON formatted ``str``. - - If ``skipkeys`` is false then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If ``ensure_ascii`` is false, then the return value will be a - ``unicode`` instance subject to normal Python ``str`` to ``unicode`` - coercion rules instead of being escaped to an ASCII ``str``. - - If ``check_circular`` is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If ``allow_nan`` is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in - strict compliance of the JSON specification, instead of using the - JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). - - If ``indent`` is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If ``separators`` is an ``(item_separator, dict_separator)`` tuple - then it will be used instead of the default ``(', ', ': ')`` separators. - ``(',', ':')`` is the most compact JSON representation. - - ``encoding`` is the character encoding for str instances, default is UTF-8. - - ``default(obj)`` is a function that should return a serializable version - of obj or raise TypeError. The default simply raises TypeError. - - If *use_decimal* is true (default: ``False``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. - - """ - # cached encoder - if (not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and not use_decimal - and not kw): - return _default_encoder.encode(obj) - if cls is None: - cls = JSONEncoder - return cls( - skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, default=default, - use_decimal=use_decimal, **kw).encode(obj) - - -_default_decoder = JSONDecoder(encoding=None, object_hook=None, - object_pairs_hook=None) - - -def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, **kw): - """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing - a JSON document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. - - """ - return loads(fp.read(), - encoding=encoding, cls=cls, object_hook=object_hook, - parse_float=parse_float, parse_int=parse_int, - parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, - use_decimal=use_decimal, **kw) - - -def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, **kw): - """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON - document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. - - """ - if (cls is None and encoding is None and object_hook is None and - parse_int is None and parse_float is None and - parse_constant is None and object_pairs_hook is None - and not use_decimal and not kw): - return _default_decoder.decode(s) - if cls is None: - cls = JSONDecoder - if object_hook is not None: - kw['object_hook'] = object_hook - if object_pairs_hook is not None: - kw['object_pairs_hook'] = object_pairs_hook - if parse_float is not None: - kw['parse_float'] = parse_float - if parse_int is not None: - kw['parse_int'] = parse_int - if parse_constant is not None: - kw['parse_constant'] = parse_constant - if use_decimal: - if parse_float is not None: - raise TypeError("use_decimal=True implies parse_float=Decimal") - kw['parse_float'] = Decimal - return cls(encoding=encoding, **kw).decode(s) - - -def _toggle_speedups(enabled): - import simplejson.decoder as dec - import simplejson.encoder as enc - import simplejson.scanner as scan - c_make_encoder = _import_c_make_encoder() - if enabled: - dec.scanstring = dec.c_scanstring or dec.py_scanstring - enc.c_make_encoder = c_make_encoder - enc.encode_basestring_ascii = (enc.c_encode_basestring_ascii or - enc.py_encode_basestring_ascii) - scan.make_scanner = scan.c_make_scanner or scan.py_make_scanner - else: - dec.scanstring = dec.py_scanstring - enc.c_make_encoder = None - enc.encode_basestring_ascii = enc.py_encode_basestring_ascii - scan.make_scanner = scan.py_make_scanner - dec.make_scanner = scan.make_scanner - global _default_decoder - _default_decoder = JSONDecoder( - encoding=None, - object_hook=None, - object_pairs_hook=None, - ) - global _default_encoder - _default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - ) diff --git a/shotgun_api3/lib/simplejson/_speedups.c b/shotgun_api3/lib/simplejson/_speedups.c deleted file mode 100644 index 8b3474702..000000000 --- a/shotgun_api3/lib/simplejson/_speedups.c +++ /dev/null @@ -1,2652 +0,0 @@ -#include "Python.h" -#include "structmember.h" -#if PY_VERSION_HEX < 0x02070000 && !defined(PyOS_string_to_double) -#define PyOS_string_to_double json_PyOS_string_to_double -static double -json_PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception); -static double -json_PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception) { - double x; - assert(endptr == NULL); - assert(overflow_exception == NULL); - PyFPE_START_PROTECT("json_PyOS_string_to_double", return -1.0;) - x = PyOS_ascii_atof(s); - PyFPE_END_PROTECT(x) - return x; -} -#endif -#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TYPE) -#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) -#endif -#if PY_VERSION_HEX < 0x02060000 && !defined(Py_SIZE) -#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) -#endif -#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) -typedef int Py_ssize_t; -#define PY_SSIZE_T_MAX INT_MAX -#define PY_SSIZE_T_MIN INT_MIN -#define PyInt_FromSsize_t PyInt_FromLong -#define PyInt_AsSsize_t PyInt_AsLong -#endif -#ifndef Py_IS_FINITE -#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) -#endif - -#ifdef __GNUC__ -#define UNUSED __attribute__((__unused__)) -#else -#define UNUSED -#endif - -#define DEFAULT_ENCODING "utf-8" - -#define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType) -#define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType) -#define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType) -#define PyEncoder_CheckExact(op) (Py_TYPE(op) == &PyEncoderType) -#define Decimal_Check(op) (PyObject_TypeCheck(op, DecimalTypePtr)) - -static PyTypeObject PyScannerType; -static PyTypeObject PyEncoderType; -static PyTypeObject *DecimalTypePtr; - -typedef struct _PyScannerObject { - PyObject_HEAD - PyObject *encoding; - PyObject *strict; - PyObject *object_hook; - PyObject *pairs_hook; - PyObject *parse_float; - PyObject *parse_int; - PyObject *parse_constant; - PyObject *memo; -} PyScannerObject; - -static PyMemberDef scanner_members[] = { - {"encoding", T_OBJECT, offsetof(PyScannerObject, encoding), READONLY, "encoding"}, - {"strict", T_OBJECT, offsetof(PyScannerObject, strict), READONLY, "strict"}, - {"object_hook", T_OBJECT, offsetof(PyScannerObject, object_hook), READONLY, "object_hook"}, - {"object_pairs_hook", T_OBJECT, offsetof(PyScannerObject, pairs_hook), READONLY, "object_pairs_hook"}, - {"parse_float", T_OBJECT, offsetof(PyScannerObject, parse_float), READONLY, "parse_float"}, - {"parse_int", T_OBJECT, offsetof(PyScannerObject, parse_int), READONLY, "parse_int"}, - {"parse_constant", T_OBJECT, offsetof(PyScannerObject, parse_constant), READONLY, "parse_constant"}, - {NULL} -}; - -typedef struct _PyEncoderObject { - PyObject_HEAD - PyObject *markers; - PyObject *defaultfn; - PyObject *encoder; - PyObject *indent; - PyObject *key_separator; - PyObject *item_separator; - PyObject *sort_keys; - PyObject *skipkeys; - PyObject *key_memo; - int fast_encode; - int allow_nan; - int use_decimal; -} PyEncoderObject; - -static PyMemberDef encoder_members[] = { - {"markers", T_OBJECT, offsetof(PyEncoderObject, markers), READONLY, "markers"}, - {"default", T_OBJECT, offsetof(PyEncoderObject, defaultfn), READONLY, "default"}, - {"encoder", T_OBJECT, offsetof(PyEncoderObject, encoder), READONLY, "encoder"}, - {"indent", T_OBJECT, offsetof(PyEncoderObject, indent), READONLY, "indent"}, - {"key_separator", T_OBJECT, offsetof(PyEncoderObject, key_separator), READONLY, "key_separator"}, - {"item_separator", T_OBJECT, offsetof(PyEncoderObject, item_separator), READONLY, "item_separator"}, - {"sort_keys", T_OBJECT, offsetof(PyEncoderObject, sort_keys), READONLY, "sort_keys"}, - {"skipkeys", T_OBJECT, offsetof(PyEncoderObject, skipkeys), READONLY, "skipkeys"}, - {"key_memo", T_OBJECT, offsetof(PyEncoderObject, key_memo), READONLY, "key_memo"}, - {NULL} -}; - -static Py_ssize_t -ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars); -static PyObject * -ascii_escape_unicode(PyObject *pystr); -static PyObject * -ascii_escape_str(PyObject *pystr); -static PyObject * -py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr); -void init_speedups(void); -static PyObject * -scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); -static PyObject * -scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); -static PyObject * -_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx); -static PyObject * -scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds); -static int -scanner_init(PyObject *self, PyObject *args, PyObject *kwds); -static void -scanner_dealloc(PyObject *self); -static int -scanner_clear(PyObject *self); -static PyObject * -encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds); -static int -encoder_init(PyObject *self, PyObject *args, PyObject *kwds); -static void -encoder_dealloc(PyObject *self); -static int -encoder_clear(PyObject *self); -static int -encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level); -static int -encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level); -static int -encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level); -static PyObject * -_encoded_const(PyObject *obj); -static void -raise_errmsg(char *msg, PyObject *s, Py_ssize_t end); -static PyObject * -encoder_encode_string(PyEncoderObject *s, PyObject *obj); -static int -_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr); -static PyObject * -_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr); -static PyObject * -encoder_encode_float(PyEncoderObject *s, PyObject *obj); - -#define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"') -#define IS_WHITESPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r')) - -#define MIN_EXPANSION 6 -#ifdef Py_UNICODE_WIDE -#define MAX_EXPANSION (2 * MIN_EXPANSION) -#else -#define MAX_EXPANSION MIN_EXPANSION -#endif - -static int -_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr) -{ - /* PyObject to Py_ssize_t converter */ - *size_ptr = PyInt_AsSsize_t(o); - if (*size_ptr == -1 && PyErr_Occurred()) - return 0; - return 1; -} - -static PyObject * -_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr) -{ - /* Py_ssize_t to PyObject converter */ - return PyInt_FromSsize_t(*size_ptr); -} - -static Py_ssize_t -ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars) -{ - /* Escape unicode code point c to ASCII escape sequences - in char *output. output must have at least 12 bytes unused to - accommodate an escaped surrogate pair "\uXXXX\uXXXX" */ - output[chars++] = '\\'; - switch (c) { - case '\\': output[chars++] = (char)c; break; - case '"': output[chars++] = (char)c; break; - case '\b': output[chars++] = 'b'; break; - case '\f': output[chars++] = 'f'; break; - case '\n': output[chars++] = 'n'; break; - case '\r': output[chars++] = 'r'; break; - case '\t': output[chars++] = 't'; break; - default: -#ifdef Py_UNICODE_WIDE - if (c >= 0x10000) { - /* UTF-16 surrogate pair */ - Py_UNICODE v = c - 0x10000; - c = 0xd800 | ((v >> 10) & 0x3ff); - output[chars++] = 'u'; - output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; - output[chars++] = "0123456789abcdef"[(c ) & 0xf]; - c = 0xdc00 | (v & 0x3ff); - output[chars++] = '\\'; - } -#endif - output[chars++] = 'u'; - output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; - output[chars++] = "0123456789abcdef"[(c ) & 0xf]; - } - return chars; -} - -static PyObject * -ascii_escape_unicode(PyObject *pystr) -{ - /* Take a PyUnicode pystr and return a new ASCII-only escaped PyString */ - Py_ssize_t i; - Py_ssize_t input_chars; - Py_ssize_t output_size; - Py_ssize_t max_output_size; - Py_ssize_t chars; - PyObject *rval; - char *output; - Py_UNICODE *input_unicode; - - input_chars = PyUnicode_GET_SIZE(pystr); - input_unicode = PyUnicode_AS_UNICODE(pystr); - - /* One char input can be up to 6 chars output, estimate 4 of these */ - output_size = 2 + (MIN_EXPANSION * 4) + input_chars; - max_output_size = 2 + (input_chars * MAX_EXPANSION); - rval = PyString_FromStringAndSize(NULL, output_size); - if (rval == NULL) { - return NULL; - } - output = PyString_AS_STRING(rval); - chars = 0; - output[chars++] = '"'; - for (i = 0; i < input_chars; i++) { - Py_UNICODE c = input_unicode[i]; - if (S_CHAR(c)) { - output[chars++] = (char)c; - } - else { - chars = ascii_escape_char(c, output, chars); - } - if (output_size - chars < (1 + MAX_EXPANSION)) { - /* There's more than four, so let's resize by a lot */ - Py_ssize_t new_output_size = output_size * 2; - /* This is an upper bound */ - if (new_output_size > max_output_size) { - new_output_size = max_output_size; - } - /* Make sure that the output size changed before resizing */ - if (new_output_size != output_size) { - output_size = new_output_size; - if (_PyString_Resize(&rval, output_size) == -1) { - return NULL; - } - output = PyString_AS_STRING(rval); - } - } - } - output[chars++] = '"'; - if (_PyString_Resize(&rval, chars) == -1) { - return NULL; - } - return rval; -} - -static PyObject * -ascii_escape_str(PyObject *pystr) -{ - /* Take a PyString pystr and return a new ASCII-only escaped PyString */ - Py_ssize_t i; - Py_ssize_t input_chars; - Py_ssize_t output_size; - Py_ssize_t chars; - PyObject *rval; - char *output; - char *input_str; - - input_chars = PyString_GET_SIZE(pystr); - input_str = PyString_AS_STRING(pystr); - - /* Fast path for a string that's already ASCII */ - for (i = 0; i < input_chars; i++) { - Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i]; - if (!S_CHAR(c)) { - /* If we have to escape something, scan the string for unicode */ - Py_ssize_t j; - for (j = i; j < input_chars; j++) { - c = (Py_UNICODE)(unsigned char)input_str[j]; - if (c > 0x7f) { - /* We hit a non-ASCII character, bail to unicode mode */ - PyObject *uni; - uni = PyUnicode_DecodeUTF8(input_str, input_chars, "strict"); - if (uni == NULL) { - return NULL; - } - rval = ascii_escape_unicode(uni); - Py_DECREF(uni); - return rval; - } - } - break; - } - } - - if (i == input_chars) { - /* Input is already ASCII */ - output_size = 2 + input_chars; - } - else { - /* One char input can be up to 6 chars output, estimate 4 of these */ - output_size = 2 + (MIN_EXPANSION * 4) + input_chars; - } - rval = PyString_FromStringAndSize(NULL, output_size); - if (rval == NULL) { - return NULL; - } - output = PyString_AS_STRING(rval); - output[0] = '"'; - - /* We know that everything up to i is ASCII already */ - chars = i + 1; - memcpy(&output[1], input_str, i); - - for (; i < input_chars; i++) { - Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i]; - if (S_CHAR(c)) { - output[chars++] = (char)c; - } - else { - chars = ascii_escape_char(c, output, chars); - } - /* An ASCII char can't possibly expand to a surrogate! */ - if (output_size - chars < (1 + MIN_EXPANSION)) { - /* There's more than four, so let's resize by a lot */ - output_size *= 2; - if (output_size > 2 + (input_chars * MIN_EXPANSION)) { - output_size = 2 + (input_chars * MIN_EXPANSION); - } - if (_PyString_Resize(&rval, output_size) == -1) { - return NULL; - } - output = PyString_AS_STRING(rval); - } - } - output[chars++] = '"'; - if (_PyString_Resize(&rval, chars) == -1) { - return NULL; - } - return rval; -} - -static void -raise_errmsg(char *msg, PyObject *s, Py_ssize_t end) -{ - /* Use the Python function simplejson.decoder.errmsg to raise a nice - looking ValueError exception */ - static PyObject *JSONDecodeError = NULL; - PyObject *exc; - if (JSONDecodeError == NULL) { - PyObject *decoder = PyImport_ImportModule("simplejson.decoder"); - if (decoder == NULL) - return; - JSONDecodeError = PyObject_GetAttrString(decoder, "JSONDecodeError"); - Py_DECREF(decoder); - if (JSONDecodeError == NULL) - return; - } - exc = PyObject_CallFunction(JSONDecodeError, "(zOO&)", msg, s, _convertPyInt_FromSsize_t, &end); - if (exc) { - PyErr_SetObject(JSONDecodeError, exc); - Py_DECREF(exc); - } -} - -static PyObject * -join_list_unicode(PyObject *lst) -{ - /* return u''.join(lst) */ - static PyObject *joinfn = NULL; - if (joinfn == NULL) { - PyObject *ustr = PyUnicode_FromUnicode(NULL, 0); - if (ustr == NULL) - return NULL; - - joinfn = PyObject_GetAttrString(ustr, "join"); - Py_DECREF(ustr); - if (joinfn == NULL) - return NULL; - } - return PyObject_CallFunctionObjArgs(joinfn, lst, NULL); -} - -static PyObject * -join_list_string(PyObject *lst) -{ - /* return ''.join(lst) */ - static PyObject *joinfn = NULL; - if (joinfn == NULL) { - PyObject *ustr = PyString_FromStringAndSize(NULL, 0); - if (ustr == NULL) - return NULL; - - joinfn = PyObject_GetAttrString(ustr, "join"); - Py_DECREF(ustr); - if (joinfn == NULL) - return NULL; - } - return PyObject_CallFunctionObjArgs(joinfn, lst, NULL); -} - -static PyObject * -_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) { - /* return (rval, idx) tuple, stealing reference to rval */ - PyObject *tpl; - PyObject *pyidx; - /* - steal a reference to rval, returns (rval, idx) - */ - if (rval == NULL) { - return NULL; - } - pyidx = PyInt_FromSsize_t(idx); - if (pyidx == NULL) { - Py_DECREF(rval); - return NULL; - } - tpl = PyTuple_New(2); - if (tpl == NULL) { - Py_DECREF(pyidx); - Py_DECREF(rval); - return NULL; - } - PyTuple_SET_ITEM(tpl, 0, rval); - PyTuple_SET_ITEM(tpl, 1, pyidx); - return tpl; -} - -#define APPEND_OLD_CHUNK \ - if (chunk != NULL) { \ - if (chunks == NULL) { \ - chunks = PyList_New(0); \ - if (chunks == NULL) { \ - goto bail; \ - } \ - } \ - if (PyList_Append(chunks, chunk)) { \ - goto bail; \ - } \ - Py_CLEAR(chunk); \ - } - -static PyObject * -scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_ssize_t *next_end_ptr) -{ - /* Read the JSON string from PyString pystr. - end is the index of the first character after the quote. - encoding is the encoding of pystr (must be an ASCII superset) - if strict is zero then literal control characters are allowed - *next_end_ptr is a return-by-reference index of the character - after the end quote - - Return value is a new PyString (if ASCII-only) or PyUnicode - */ - PyObject *rval; - Py_ssize_t len = PyString_GET_SIZE(pystr); - Py_ssize_t begin = end - 1; - Py_ssize_t next = begin; - int has_unicode = 0; - char *buf = PyString_AS_STRING(pystr); - PyObject *chunks = NULL; - PyObject *chunk = NULL; - - if (end < 0 || len <= end) { - PyErr_SetString(PyExc_ValueError, "end is out of bounds"); - goto bail; - } - while (1) { - /* Find the end of the string or the next escape */ - Py_UNICODE c = 0; - for (next = end; next < len; next++) { - c = (unsigned char)buf[next]; - if (c == '"' || c == '\\') { - break; - } - else if (strict && c <= 0x1f) { - raise_errmsg("Invalid control character at", pystr, next); - goto bail; - } - else if (c > 0x7f) { - has_unicode = 1; - } - } - if (!(c == '"' || c == '\\')) { - raise_errmsg("Unterminated string starting at", pystr, begin); - goto bail; - } - /* Pick up this chunk if it's not zero length */ - if (next != end) { - PyObject *strchunk; - APPEND_OLD_CHUNK - strchunk = PyString_FromStringAndSize(&buf[end], next - end); - if (strchunk == NULL) { - goto bail; - } - if (has_unicode) { - chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL); - Py_DECREF(strchunk); - if (chunk == NULL) { - goto bail; - } - } - else { - chunk = strchunk; - } - } - next++; - if (c == '"') { - end = next; - break; - } - if (next == len) { - raise_errmsg("Unterminated string starting at", pystr, begin); - goto bail; - } - c = buf[next]; - if (c != 'u') { - /* Non-unicode backslash escapes */ - end = next + 1; - switch (c) { - case '"': break; - case '\\': break; - case '/': break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - default: c = 0; - } - if (c == 0) { - raise_errmsg("Invalid \\escape", pystr, end - 2); - goto bail; - } - } - else { - c = 0; - next++; - end = next + 4; - if (end >= len) { - raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1); - goto bail; - } - /* Decode 4 hex digits */ - for (; next < end; next++) { - Py_UNICODE digit = buf[next]; - c <<= 4; - switch (digit) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - c |= (digit - '0'); break; - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': - c |= (digit - 'a' + 10); break; - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': - c |= (digit - 'A' + 10); break; - default: - raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); - goto bail; - } - } -#ifdef Py_UNICODE_WIDE - /* Surrogate pair */ - if ((c & 0xfc00) == 0xd800) { - Py_UNICODE c2 = 0; - if (end + 6 >= len) { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - if (buf[next++] != '\\' || buf[next++] != 'u') { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - end += 6; - /* Decode 4 hex digits */ - for (; next < end; next++) { - c2 <<= 4; - Py_UNICODE digit = buf[next]; - switch (digit) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - c2 |= (digit - '0'); break; - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': - c2 |= (digit - 'a' + 10); break; - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': - c2 |= (digit - 'A' + 10); break; - default: - raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); - goto bail; - } - } - if ((c2 & 0xfc00) != 0xdc00) { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00)); - } - else if ((c & 0xfc00) == 0xdc00) { - raise_errmsg("Unpaired low surrogate", pystr, end - 5); - goto bail; - } -#endif - } - if (c > 0x7f) { - has_unicode = 1; - } - APPEND_OLD_CHUNK - if (has_unicode) { - chunk = PyUnicode_FromUnicode(&c, 1); - if (chunk == NULL) { - goto bail; - } - } - else { - char c_char = Py_CHARMASK(c); - chunk = PyString_FromStringAndSize(&c_char, 1); - if (chunk == NULL) { - goto bail; - } - } - } - - if (chunks == NULL) { - if (chunk != NULL) - rval = chunk; - else - rval = PyString_FromStringAndSize("", 0); - } - else { - APPEND_OLD_CHUNK - rval = join_list_string(chunks); - if (rval == NULL) { - goto bail; - } - Py_CLEAR(chunks); - } - - *next_end_ptr = end; - return rval; -bail: - *next_end_ptr = -1; - Py_XDECREF(chunk); - Py_XDECREF(chunks); - return NULL; -} - - -static PyObject * -scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr) -{ - /* Read the JSON string from PyUnicode pystr. - end is the index of the first character after the quote. - if strict is zero then literal control characters are allowed - *next_end_ptr is a return-by-reference index of the character - after the end quote - - Return value is a new PyUnicode - */ - PyObject *rval; - Py_ssize_t len = PyUnicode_GET_SIZE(pystr); - Py_ssize_t begin = end - 1; - Py_ssize_t next = begin; - const Py_UNICODE *buf = PyUnicode_AS_UNICODE(pystr); - PyObject *chunks = NULL; - PyObject *chunk = NULL; - - if (end < 0 || len <= end) { - PyErr_SetString(PyExc_ValueError, "end is out of bounds"); - goto bail; - } - while (1) { - /* Find the end of the string or the next escape */ - Py_UNICODE c = 0; - for (next = end; next < len; next++) { - c = buf[next]; - if (c == '"' || c == '\\') { - break; - } - else if (strict && c <= 0x1f) { - raise_errmsg("Invalid control character at", pystr, next); - goto bail; - } - } - if (!(c == '"' || c == '\\')) { - raise_errmsg("Unterminated string starting at", pystr, begin); - goto bail; - } - /* Pick up this chunk if it's not zero length */ - if (next != end) { - APPEND_OLD_CHUNK - chunk = PyUnicode_FromUnicode(&buf[end], next - end); - if (chunk == NULL) { - goto bail; - } - } - next++; - if (c == '"') { - end = next; - break; - } - if (next == len) { - raise_errmsg("Unterminated string starting at", pystr, begin); - goto bail; - } - c = buf[next]; - if (c != 'u') { - /* Non-unicode backslash escapes */ - end = next + 1; - switch (c) { - case '"': break; - case '\\': break; - case '/': break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - default: c = 0; - } - if (c == 0) { - raise_errmsg("Invalid \\escape", pystr, end - 2); - goto bail; - } - } - else { - c = 0; - next++; - end = next + 4; - if (end >= len) { - raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1); - goto bail; - } - /* Decode 4 hex digits */ - for (; next < end; next++) { - Py_UNICODE digit = buf[next]; - c <<= 4; - switch (digit) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - c |= (digit - '0'); break; - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': - c |= (digit - 'a' + 10); break; - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': - c |= (digit - 'A' + 10); break; - default: - raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); - goto bail; - } - } -#ifdef Py_UNICODE_WIDE - /* Surrogate pair */ - if ((c & 0xfc00) == 0xd800) { - Py_UNICODE c2 = 0; - if (end + 6 >= len) { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - if (buf[next++] != '\\' || buf[next++] != 'u') { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - end += 6; - /* Decode 4 hex digits */ - for (; next < end; next++) { - c2 <<= 4; - Py_UNICODE digit = buf[next]; - switch (digit) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - c2 |= (digit - '0'); break; - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': - c2 |= (digit - 'a' + 10); break; - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': - c2 |= (digit - 'A' + 10); break; - default: - raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5); - goto bail; - } - } - if ((c2 & 0xfc00) != 0xdc00) { - raise_errmsg("Unpaired high surrogate", pystr, end - 5); - goto bail; - } - c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00)); - } - else if ((c & 0xfc00) == 0xdc00) { - raise_errmsg("Unpaired low surrogate", pystr, end - 5); - goto bail; - } -#endif - } - APPEND_OLD_CHUNK - chunk = PyUnicode_FromUnicode(&c, 1); - if (chunk == NULL) { - goto bail; - } - } - - if (chunks == NULL) { - if (chunk != NULL) - rval = chunk; - else - rval = PyUnicode_FromUnicode(NULL, 0); - } - else { - APPEND_OLD_CHUNK - rval = join_list_unicode(chunks); - if (rval == NULL) { - goto bail; - } - Py_CLEAR(chunks); - } - *next_end_ptr = end; - return rval; -bail: - *next_end_ptr = -1; - Py_XDECREF(chunk); - Py_XDECREF(chunks); - return NULL; -} - -PyDoc_STRVAR(pydoc_scanstring, - "scanstring(basestring, end, encoding, strict=True) -> (str, end)\n" - "\n" - "Scan the string s for a JSON string. End is the index of the\n" - "character in s after the quote that started the JSON string.\n" - "Unescapes all valid JSON string escape sequences and raises ValueError\n" - "on attempt to decode an invalid string. If strict is False then literal\n" - "control characters are allowed in the string.\n" - "\n" - "Returns a tuple of the decoded string and the index of the character in s\n" - "after the end quote." -); - -static PyObject * -py_scanstring(PyObject* self UNUSED, PyObject *args) -{ - PyObject *pystr; - PyObject *rval; - Py_ssize_t end; - Py_ssize_t next_end = -1; - char *encoding = NULL; - int strict = 1; - if (!PyArg_ParseTuple(args, "OO&|zi:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &encoding, &strict)) { - return NULL; - } - if (encoding == NULL) { - encoding = DEFAULT_ENCODING; - } - if (PyString_Check(pystr)) { - rval = scanstring_str(pystr, end, encoding, strict, &next_end); - } - else if (PyUnicode_Check(pystr)) { - rval = scanstring_unicode(pystr, end, strict, &next_end); - } - else { - PyErr_Format(PyExc_TypeError, - "first argument must be a string, not %.80s", - Py_TYPE(pystr)->tp_name); - return NULL; - } - return _build_rval_index_tuple(rval, next_end); -} - -PyDoc_STRVAR(pydoc_encode_basestring_ascii, - "encode_basestring_ascii(basestring) -> str\n" - "\n" - "Return an ASCII-only JSON representation of a Python string" -); - -static PyObject * -py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr) -{ - /* Return an ASCII-only JSON representation of a Python string */ - /* METH_O */ - if (PyString_Check(pystr)) { - return ascii_escape_str(pystr); - } - else if (PyUnicode_Check(pystr)) { - return ascii_escape_unicode(pystr); - } - else { - PyErr_Format(PyExc_TypeError, - "first argument must be a string, not %.80s", - Py_TYPE(pystr)->tp_name); - return NULL; - } -} - -static void -scanner_dealloc(PyObject *self) -{ - /* Deallocate scanner object */ - scanner_clear(self); - Py_TYPE(self)->tp_free(self); -} - -static int -scanner_traverse(PyObject *self, visitproc visit, void *arg) -{ - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - Py_VISIT(s->encoding); - Py_VISIT(s->strict); - Py_VISIT(s->object_hook); - Py_VISIT(s->pairs_hook); - Py_VISIT(s->parse_float); - Py_VISIT(s->parse_int); - Py_VISIT(s->parse_constant); - Py_VISIT(s->memo); - return 0; -} - -static int -scanner_clear(PyObject *self) -{ - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - Py_CLEAR(s->encoding); - Py_CLEAR(s->strict); - Py_CLEAR(s->object_hook); - Py_CLEAR(s->pairs_hook); - Py_CLEAR(s->parse_float); - Py_CLEAR(s->parse_int); - Py_CLEAR(s->parse_constant); - Py_CLEAR(s->memo); - return 0; -} - -static PyObject * -_parse_object_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { - /* Read a JSON object from PyString pystr. - idx is the index of the first character after the opening curly brace. - *next_idx_ptr is a return-by-reference index to the first character after - the closing curly brace. - - Returns a new PyObject (usually a dict, but object_hook or - object_pairs_hook can change that) - */ - char *str = PyString_AS_STRING(pystr); - Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; - PyObject *rval = NULL; - PyObject *pairs = NULL; - PyObject *item; - PyObject *key = NULL; - PyObject *val = NULL; - char *encoding = PyString_AS_STRING(s->encoding); - int strict = PyObject_IsTrue(s->strict); - int has_pairs_hook = (s->pairs_hook != Py_None); - Py_ssize_t next_idx; - if (has_pairs_hook) { - pairs = PyList_New(0); - if (pairs == NULL) - return NULL; - } - else { - rval = PyDict_New(); - if (rval == NULL) - return NULL; - } - - /* skip whitespace after { */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* only loop if the object is non-empty */ - if (idx <= end_idx && str[idx] != '}') { - while (idx <= end_idx) { - PyObject *memokey; - - /* read key */ - if (str[idx] != '"') { - raise_errmsg("Expecting property name", pystr, idx); - goto bail; - } - key = scanstring_str(pystr, idx + 1, encoding, strict, &next_idx); - if (key == NULL) - goto bail; - memokey = PyDict_GetItem(s->memo, key); - if (memokey != NULL) { - Py_INCREF(memokey); - Py_DECREF(key); - key = memokey; - } - else { - if (PyDict_SetItem(s->memo, key, key) < 0) - goto bail; - } - idx = next_idx; - - /* skip whitespace between key and : delimiter, read :, skip whitespace */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - if (idx > end_idx || str[idx] != ':') { - raise_errmsg("Expecting : delimiter", pystr, idx); - goto bail; - } - idx++; - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* read any JSON data type */ - val = scan_once_str(s, pystr, idx, &next_idx); - if (val == NULL) - goto bail; - - if (has_pairs_hook) { - item = PyTuple_Pack(2, key, val); - if (item == NULL) - goto bail; - Py_CLEAR(key); - Py_CLEAR(val); - if (PyList_Append(pairs, item) == -1) { - Py_DECREF(item); - goto bail; - } - Py_DECREF(item); - } - else { - if (PyDict_SetItem(rval, key, val) < 0) - goto bail; - Py_CLEAR(key); - Py_CLEAR(val); - } - idx = next_idx; - - /* skip whitespace before } or , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* bail if the object is closed or we didn't get the , delimiter */ - if (idx > end_idx) break; - if (str[idx] == '}') { - break; - } - else if (str[idx] != ',') { - raise_errmsg("Expecting , delimiter", pystr, idx); - goto bail; - } - idx++; - - /* skip whitespace after , delimiter */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - } - } - /* verify that idx < end_idx, str[idx] should be '}' */ - if (idx > end_idx || str[idx] != '}') { - raise_errmsg("Expecting object", pystr, end_idx); - goto bail; - } - - /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */ - if (s->pairs_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL); - if (val == NULL) - goto bail; - Py_DECREF(pairs); - *next_idx_ptr = idx + 1; - return val; - } - - /* if object_hook is not None: rval = object_hook(rval) */ - if (s->object_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); - if (val == NULL) - goto bail; - Py_DECREF(rval); - rval = val; - val = NULL; - } - *next_idx_ptr = idx + 1; - return rval; -bail: - Py_XDECREF(rval); - Py_XDECREF(key); - Py_XDECREF(val); - Py_XDECREF(pairs); - return NULL; -} - -static PyObject * -_parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { - /* Read a JSON object from PyUnicode pystr. - idx is the index of the first character after the opening curly brace. - *next_idx_ptr is a return-by-reference index to the first character after - the closing curly brace. - - Returns a new PyObject (usually a dict, but object_hook can change that) - */ - Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); - Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; - PyObject *rval = NULL; - PyObject *pairs = NULL; - PyObject *item; - PyObject *key = NULL; - PyObject *val = NULL; - int strict = PyObject_IsTrue(s->strict); - int has_pairs_hook = (s->pairs_hook != Py_None); - Py_ssize_t next_idx; - - if (has_pairs_hook) { - pairs = PyList_New(0); - if (pairs == NULL) - return NULL; - } - else { - rval = PyDict_New(); - if (rval == NULL) - return NULL; - } - - /* skip whitespace after { */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* only loop if the object is non-empty */ - if (idx <= end_idx && str[idx] != '}') { - while (idx <= end_idx) { - PyObject *memokey; - - /* read key */ - if (str[idx] != '"') { - raise_errmsg("Expecting property name", pystr, idx); - goto bail; - } - key = scanstring_unicode(pystr, idx + 1, strict, &next_idx); - if (key == NULL) - goto bail; - memokey = PyDict_GetItem(s->memo, key); - if (memokey != NULL) { - Py_INCREF(memokey); - Py_DECREF(key); - key = memokey; - } - else { - if (PyDict_SetItem(s->memo, key, key) < 0) - goto bail; - } - idx = next_idx; - - /* skip whitespace between key and : delimiter, read :, skip whitespace */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - if (idx > end_idx || str[idx] != ':') { - raise_errmsg("Expecting : delimiter", pystr, idx); - goto bail; - } - idx++; - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* read any JSON term */ - val = scan_once_unicode(s, pystr, idx, &next_idx); - if (val == NULL) - goto bail; - - if (has_pairs_hook) { - item = PyTuple_Pack(2, key, val); - if (item == NULL) - goto bail; - Py_CLEAR(key); - Py_CLEAR(val); - if (PyList_Append(pairs, item) == -1) { - Py_DECREF(item); - goto bail; - } - Py_DECREF(item); - } - else { - if (PyDict_SetItem(rval, key, val) < 0) - goto bail; - Py_CLEAR(key); - Py_CLEAR(val); - } - idx = next_idx; - - /* skip whitespace before } or , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* bail if the object is closed or we didn't get the , delimiter */ - if (idx > end_idx) break; - if (str[idx] == '}') { - break; - } - else if (str[idx] != ',') { - raise_errmsg("Expecting , delimiter", pystr, idx); - goto bail; - } - idx++; - - /* skip whitespace after , delimiter */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - } - } - - /* verify that idx < end_idx, str[idx] should be '}' */ - if (idx > end_idx || str[idx] != '}') { - raise_errmsg("Expecting object", pystr, end_idx); - goto bail; - } - - /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */ - if (s->pairs_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL); - if (val == NULL) - goto bail; - Py_DECREF(pairs); - *next_idx_ptr = idx + 1; - return val; - } - - /* if object_hook is not None: rval = object_hook(rval) */ - if (s->object_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); - if (val == NULL) - goto bail; - Py_DECREF(rval); - rval = val; - val = NULL; - } - *next_idx_ptr = idx + 1; - return rval; -bail: - Py_XDECREF(rval); - Py_XDECREF(key); - Py_XDECREF(val); - Py_XDECREF(pairs); - return NULL; -} - -static PyObject * -_parse_array_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { - /* Read a JSON array from PyString pystr. - idx is the index of the first character after the opening brace. - *next_idx_ptr is a return-by-reference index to the first character after - the closing brace. - - Returns a new PyList - */ - char *str = PyString_AS_STRING(pystr); - Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; - PyObject *val = NULL; - PyObject *rval = PyList_New(0); - Py_ssize_t next_idx; - if (rval == NULL) - return NULL; - - /* skip whitespace after [ */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* only loop if the array is non-empty */ - if (idx <= end_idx && str[idx] != ']') { - while (idx <= end_idx) { - - /* read any JSON term and de-tuplefy the (rval, idx) */ - val = scan_once_str(s, pystr, idx, &next_idx); - if (val == NULL) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) { - PyErr_Clear(); - raise_errmsg("Expecting object", pystr, idx); - } - goto bail; - } - - if (PyList_Append(rval, val) == -1) - goto bail; - - Py_CLEAR(val); - idx = next_idx; - - /* skip whitespace between term and , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* bail if the array is closed or we didn't get the , delimiter */ - if (idx > end_idx) break; - if (str[idx] == ']') { - break; - } - else if (str[idx] != ',') { - raise_errmsg("Expecting , delimiter", pystr, idx); - goto bail; - } - idx++; - - /* skip whitespace after , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - } - } - - /* verify that idx < end_idx, str[idx] should be ']' */ - if (idx > end_idx || str[idx] != ']') { - raise_errmsg("Expecting object", pystr, end_idx); - goto bail; - } - *next_idx_ptr = idx + 1; - return rval; -bail: - Py_XDECREF(val); - Py_DECREF(rval); - return NULL; -} - -static PyObject * -_parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { - /* Read a JSON array from PyString pystr. - idx is the index of the first character after the opening brace. - *next_idx_ptr is a return-by-reference index to the first character after - the closing brace. - - Returns a new PyList - */ - Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); - Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; - PyObject *val = NULL; - PyObject *rval = PyList_New(0); - Py_ssize_t next_idx; - if (rval == NULL) - return NULL; - - /* skip whitespace after [ */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* only loop if the array is non-empty */ - if (idx <= end_idx && str[idx] != ']') { - while (idx <= end_idx) { - - /* read any JSON term */ - val = scan_once_unicode(s, pystr, idx, &next_idx); - if (val == NULL) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) { - PyErr_Clear(); - raise_errmsg("Expecting object", pystr, idx); - } - goto bail; - } - - if (PyList_Append(rval, val) == -1) - goto bail; - - Py_CLEAR(val); - idx = next_idx; - - /* skip whitespace between term and , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - - /* bail if the array is closed or we didn't get the , delimiter */ - if (idx > end_idx) break; - if (str[idx] == ']') { - break; - } - else if (str[idx] != ',') { - raise_errmsg("Expecting , delimiter", pystr, idx); - goto bail; - } - idx++; - - /* skip whitespace after , */ - while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++; - } - } - - /* verify that idx < end_idx, str[idx] should be ']' */ - if (idx > end_idx || str[idx] != ']') { - raise_errmsg("Expecting object", pystr, end_idx); - goto bail; - } - *next_idx_ptr = idx + 1; - return rval; -bail: - Py_XDECREF(val); - Py_DECREF(rval); - return NULL; -} - -static PyObject * -_parse_constant(PyScannerObject *s, char *constant, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) { - /* Read a JSON constant from PyString pystr. - constant is the constant string that was found - ("NaN", "Infinity", "-Infinity"). - idx is the index of the first character of the constant - *next_idx_ptr is a return-by-reference index to the first character after - the constant. - - Returns the result of parse_constant - */ - PyObject *cstr; - PyObject *rval; - /* constant is "NaN", "Infinity", or "-Infinity" */ - cstr = PyString_InternFromString(constant); - if (cstr == NULL) - return NULL; - - /* rval = parse_constant(constant) */ - rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL); - idx += PyString_GET_SIZE(cstr); - Py_DECREF(cstr); - *next_idx_ptr = idx; - return rval; -} - -static PyObject * -_match_number_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) { - /* Read a JSON number from PyString pystr. - idx is the index of the first character of the number - *next_idx_ptr is a return-by-reference index to the first character after - the number. - - Returns a new PyObject representation of that number: - PyInt, PyLong, or PyFloat. - May return other types if parse_int or parse_float are set - */ - char *str = PyString_AS_STRING(pystr); - Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1; - Py_ssize_t idx = start; - int is_float = 0; - PyObject *rval; - PyObject *numstr; - - /* read a sign if it's there, make sure it's not the end of the string */ - if (str[idx] == '-') { - idx++; - if (idx > end_idx) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - } - - /* read as many integer digits as we find as long as it doesn't start with 0 */ - if (str[idx] >= '1' && str[idx] <= '9') { - idx++; - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - } - /* if it starts with 0 we only expect one integer digit */ - else if (str[idx] == '0') { - idx++; - } - /* no integer digits, error */ - else { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - - /* if the next char is '.' followed by a digit then read all float digits */ - if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') { - is_float = 1; - idx += 2; - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - } - - /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */ - if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) { - - /* save the index of the 'e' or 'E' just in case we need to backtrack */ - Py_ssize_t e_start = idx; - idx++; - - /* read an exponent sign if present */ - if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++; - - /* read all digits */ - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - - /* if we got a digit, then parse as float. if not, backtrack */ - if (str[idx - 1] >= '0' && str[idx - 1] <= '9') { - is_float = 1; - } - else { - idx = e_start; - } - } - - /* copy the section we determined to be a number */ - numstr = PyString_FromStringAndSize(&str[start], idx - start); - if (numstr == NULL) - return NULL; - if (is_float) { - /* parse as a float using a fast path if available, otherwise call user defined method */ - if (s->parse_float != (PyObject *)&PyFloat_Type) { - rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL); - } - else { - /* rval = PyFloat_FromDouble(PyOS_ascii_atof(PyString_AS_STRING(numstr))); */ - double d = PyOS_string_to_double(PyString_AS_STRING(numstr), - NULL, NULL); - if (d == -1.0 && PyErr_Occurred()) - return NULL; - rval = PyFloat_FromDouble(d); - } - } - else { - /* parse as an int using a fast path if available, otherwise call user defined method */ - if (s->parse_int != (PyObject *)&PyInt_Type) { - rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL); - } - else { - rval = PyInt_FromString(PyString_AS_STRING(numstr), NULL, 10); - } - } - Py_DECREF(numstr); - *next_idx_ptr = idx; - return rval; -} - -static PyObject * -_match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) { - /* Read a JSON number from PyUnicode pystr. - idx is the index of the first character of the number - *next_idx_ptr is a return-by-reference index to the first character after - the number. - - Returns a new PyObject representation of that number: - PyInt, PyLong, or PyFloat. - May return other types if parse_int or parse_float are set - */ - Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); - Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1; - Py_ssize_t idx = start; - int is_float = 0; - PyObject *rval; - PyObject *numstr; - - /* read a sign if it's there, make sure it's not the end of the string */ - if (str[idx] == '-') { - idx++; - if (idx > end_idx) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - } - - /* read as many integer digits as we find as long as it doesn't start with 0 */ - if (str[idx] >= '1' && str[idx] <= '9') { - idx++; - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - } - /* if it starts with 0 we only expect one integer digit */ - else if (str[idx] == '0') { - idx++; - } - /* no integer digits, error */ - else { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - - /* if the next char is '.' followed by a digit then read all float digits */ - if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') { - is_float = 1; - idx += 2; - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - } - - /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */ - if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) { - Py_ssize_t e_start = idx; - idx++; - - /* read an exponent sign if present */ - if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++; - - /* read all digits */ - while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++; - - /* if we got a digit, then parse as float. if not, backtrack */ - if (str[idx - 1] >= '0' && str[idx - 1] <= '9') { - is_float = 1; - } - else { - idx = e_start; - } - } - - /* copy the section we determined to be a number */ - numstr = PyUnicode_FromUnicode(&str[start], idx - start); - if (numstr == NULL) - return NULL; - if (is_float) { - /* parse as a float using a fast path if available, otherwise call user defined method */ - if (s->parse_float != (PyObject *)&PyFloat_Type) { - rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL); - } - else { - rval = PyFloat_FromString(numstr, NULL); - } - } - else { - /* no fast path for unicode -> int, just call */ - rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL); - } - Py_DECREF(numstr); - *next_idx_ptr = idx; - return rval; -} - -static PyObject * -scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) -{ - /* Read one JSON term (of any kind) from PyString pystr. - idx is the index of the first character of the term - *next_idx_ptr is a return-by-reference index to the first character after - the number. - - Returns a new PyObject representation of the term. - */ - char *str = PyString_AS_STRING(pystr); - Py_ssize_t length = PyString_GET_SIZE(pystr); - PyObject *rval = NULL; - int fallthrough = 0; - if (idx >= length) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - if (Py_EnterRecursiveCall(" while decoding a JSON document")) - return NULL; - switch (str[idx]) { - case '"': - /* string */ - rval = scanstring_str(pystr, idx + 1, - PyString_AS_STRING(s->encoding), - PyObject_IsTrue(s->strict), - next_idx_ptr); - break; - case '{': - /* object */ - rval = _parse_object_str(s, pystr, idx + 1, next_idx_ptr); - break; - case '[': - /* array */ - rval = _parse_array_str(s, pystr, idx + 1, next_idx_ptr); - break; - case 'n': - /* null */ - if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') { - Py_INCREF(Py_None); - *next_idx_ptr = idx + 4; - rval = Py_None; - } - else - fallthrough = 1; - break; - case 't': - /* true */ - if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') { - Py_INCREF(Py_True); - *next_idx_ptr = idx + 4; - rval = Py_True; - } - else - fallthrough = 1; - break; - case 'f': - /* false */ - if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') { - Py_INCREF(Py_False); - *next_idx_ptr = idx + 5; - rval = Py_False; - } - else - fallthrough = 1; - break; - case 'N': - /* NaN */ - if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') { - rval = _parse_constant(s, "NaN", idx, next_idx_ptr); - } - else - fallthrough = 1; - break; - case 'I': - /* Infinity */ - if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') { - rval = _parse_constant(s, "Infinity", idx, next_idx_ptr); - } - else - fallthrough = 1; - break; - case '-': - /* -Infinity */ - if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') { - rval = _parse_constant(s, "-Infinity", idx, next_idx_ptr); - } - else - fallthrough = 1; - break; - default: - fallthrough = 1; - } - /* Didn't find a string, object, array, or named constant. Look for a number. */ - if (fallthrough) - rval = _match_number_str(s, pystr, idx, next_idx_ptr); - Py_LeaveRecursiveCall(); - return rval; -} - -static PyObject * -scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) -{ - /* Read one JSON term (of any kind) from PyUnicode pystr. - idx is the index of the first character of the term - *next_idx_ptr is a return-by-reference index to the first character after - the number. - - Returns a new PyObject representation of the term. - */ - Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr); - Py_ssize_t length = PyUnicode_GET_SIZE(pystr); - PyObject *rval = NULL; - int fallthrough = 0; - if (idx >= length) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - if (Py_EnterRecursiveCall(" while decoding a JSON document")) - return NULL; - switch (str[idx]) { - case '"': - /* string */ - rval = scanstring_unicode(pystr, idx + 1, - PyObject_IsTrue(s->strict), - next_idx_ptr); - break; - case '{': - /* object */ - rval = _parse_object_unicode(s, pystr, idx + 1, next_idx_ptr); - break; - case '[': - /* array */ - rval = _parse_array_unicode(s, pystr, idx + 1, next_idx_ptr); - break; - case 'n': - /* null */ - if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') { - Py_INCREF(Py_None); - *next_idx_ptr = idx + 4; - rval = Py_None; - } - else - fallthrough = 1; - break; - case 't': - /* true */ - if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') { - Py_INCREF(Py_True); - *next_idx_ptr = idx + 4; - rval = Py_True; - } - else - fallthrough = 1; - break; - case 'f': - /* false */ - if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') { - Py_INCREF(Py_False); - *next_idx_ptr = idx + 5; - rval = Py_False; - } - else - fallthrough = 1; - break; - case 'N': - /* NaN */ - if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') { - rval = _parse_constant(s, "NaN", idx, next_idx_ptr); - } - else - fallthrough = 1; - break; - case 'I': - /* Infinity */ - if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') { - rval = _parse_constant(s, "Infinity", idx, next_idx_ptr); - } - else - fallthrough = 1; - break; - case '-': - /* -Infinity */ - if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') { - rval = _parse_constant(s, "-Infinity", idx, next_idx_ptr); - } - else - fallthrough = 1; - break; - default: - fallthrough = 1; - } - /* Didn't find a string, object, array, or named constant. Look for a number. */ - if (fallthrough) - rval = _match_number_unicode(s, pystr, idx, next_idx_ptr); - Py_LeaveRecursiveCall(); - return rval; -} - -static PyObject * -scanner_call(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* Python callable interface to scan_once_{str,unicode} */ - PyObject *pystr; - PyObject *rval; - Py_ssize_t idx; - Py_ssize_t next_idx = -1; - static char *kwlist[] = {"string", "idx", NULL}; - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:scan_once", kwlist, &pystr, _convertPyInt_AsSsize_t, &idx)) - return NULL; - - if (PyString_Check(pystr)) { - rval = scan_once_str(s, pystr, idx, &next_idx); - } - else if (PyUnicode_Check(pystr)) { - rval = scan_once_unicode(s, pystr, idx, &next_idx); - } - else { - PyErr_Format(PyExc_TypeError, - "first argument must be a string, not %.80s", - Py_TYPE(pystr)->tp_name); - return NULL; - } - PyDict_Clear(s->memo); - return _build_rval_index_tuple(rval, next_idx); -} - -static PyObject * -scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyScannerObject *s; - s = (PyScannerObject *)type->tp_alloc(type, 0); - if (s != NULL) { - s->encoding = NULL; - s->strict = NULL; - s->object_hook = NULL; - s->pairs_hook = NULL; - s->parse_float = NULL; - s->parse_int = NULL; - s->parse_constant = NULL; - } - return (PyObject *)s; -} - -static int -scanner_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* Initialize Scanner object */ - PyObject *ctx; - static char *kwlist[] = {"context", NULL}; - PyScannerObject *s; - - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx)) - return -1; - - if (s->memo == NULL) { - s->memo = PyDict_New(); - if (s->memo == NULL) - goto bail; - } - - /* PyString_AS_STRING is used on encoding */ - s->encoding = PyObject_GetAttrString(ctx, "encoding"); - if (s->encoding == NULL) - goto bail; - if (s->encoding == Py_None) { - Py_DECREF(Py_None); - s->encoding = PyString_InternFromString(DEFAULT_ENCODING); - } - else if (PyUnicode_Check(s->encoding)) { - PyObject *tmp = PyUnicode_AsEncodedString(s->encoding, NULL, NULL); - Py_DECREF(s->encoding); - s->encoding = tmp; - } - if (s->encoding == NULL || !PyString_Check(s->encoding)) - goto bail; - - /* All of these will fail "gracefully" so we don't need to verify them */ - s->strict = PyObject_GetAttrString(ctx, "strict"); - if (s->strict == NULL) - goto bail; - s->object_hook = PyObject_GetAttrString(ctx, "object_hook"); - if (s->object_hook == NULL) - goto bail; - s->pairs_hook = PyObject_GetAttrString(ctx, "object_pairs_hook"); - if (s->pairs_hook == NULL) - goto bail; - s->parse_float = PyObject_GetAttrString(ctx, "parse_float"); - if (s->parse_float == NULL) - goto bail; - s->parse_int = PyObject_GetAttrString(ctx, "parse_int"); - if (s->parse_int == NULL) - goto bail; - s->parse_constant = PyObject_GetAttrString(ctx, "parse_constant"); - if (s->parse_constant == NULL) - goto bail; - - return 0; - -bail: - Py_CLEAR(s->encoding); - Py_CLEAR(s->strict); - Py_CLEAR(s->object_hook); - Py_CLEAR(s->pairs_hook); - Py_CLEAR(s->parse_float); - Py_CLEAR(s->parse_int); - Py_CLEAR(s->parse_constant); - return -1; -} - -PyDoc_STRVAR(scanner_doc, "JSON scanner object"); - -static -PyTypeObject PyScannerType = { - PyObject_HEAD_INIT(NULL) - 0, /* tp_internal */ - "simplejson._speedups.Scanner", /* tp_name */ - sizeof(PyScannerObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - scanner_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - scanner_call, /* tp_call */ - 0, /* tp_str */ - 0,/* PyObject_GenericGetAttr, */ /* tp_getattro */ - 0,/* PyObject_GenericSetAttr, */ /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - scanner_doc, /* tp_doc */ - scanner_traverse, /* tp_traverse */ - scanner_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - scanner_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - scanner_init, /* tp_init */ - 0,/* PyType_GenericAlloc, */ /* tp_alloc */ - scanner_new, /* tp_new */ - 0,/* PyObject_GC_Del, */ /* tp_free */ -}; - -static PyObject * -encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyEncoderObject *s; - s = (PyEncoderObject *)type->tp_alloc(type, 0); - if (s != NULL) { - s->markers = NULL; - s->defaultfn = NULL; - s->encoder = NULL; - s->indent = NULL; - s->key_separator = NULL; - s->item_separator = NULL; - s->sort_keys = NULL; - s->skipkeys = NULL; - s->key_memo = NULL; - } - return (PyObject *)s; -} - -static int -encoder_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* initialize Encoder object */ - static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", "key_memo", "use_decimal", NULL}; - - PyEncoderObject *s; - PyObject *markers, *defaultfn, *encoder, *indent, *key_separator; - PyObject *item_separator, *sort_keys, *skipkeys, *allow_nan, *key_memo, *use_decimal; - - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOOOOOOOO:make_encoder", kwlist, - &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator, - &sort_keys, &skipkeys, &allow_nan, &key_memo, &use_decimal)) - return -1; - - s->markers = markers; - s->defaultfn = defaultfn; - s->encoder = encoder; - s->indent = indent; - s->key_separator = key_separator; - s->item_separator = item_separator; - s->sort_keys = sort_keys; - s->skipkeys = skipkeys; - s->key_memo = key_memo; - s->fast_encode = (PyCFunction_Check(s->encoder) && PyCFunction_GetFunction(s->encoder) == (PyCFunction)py_encode_basestring_ascii); - s->allow_nan = PyObject_IsTrue(allow_nan); - s->use_decimal = PyObject_IsTrue(use_decimal); - - Py_INCREF(s->markers); - Py_INCREF(s->defaultfn); - Py_INCREF(s->encoder); - Py_INCREF(s->indent); - Py_INCREF(s->key_separator); - Py_INCREF(s->item_separator); - Py_INCREF(s->sort_keys); - Py_INCREF(s->skipkeys); - Py_INCREF(s->key_memo); - return 0; -} - -static PyObject * -encoder_call(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* Python callable interface to encode_listencode_obj */ - static char *kwlist[] = {"obj", "_current_indent_level", NULL}; - PyObject *obj; - PyObject *rval; - Py_ssize_t indent_level; - PyEncoderObject *s; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist, - &obj, _convertPyInt_AsSsize_t, &indent_level)) - return NULL; - rval = PyList_New(0); - if (rval == NULL) - return NULL; - if (encoder_listencode_obj(s, rval, obj, indent_level)) { - Py_DECREF(rval); - return NULL; - } - return rval; -} - -static PyObject * -_encoded_const(PyObject *obj) -{ - /* Return the JSON string representation of None, True, False */ - if (obj == Py_None) { - static PyObject *s_null = NULL; - if (s_null == NULL) { - s_null = PyString_InternFromString("null"); - } - Py_INCREF(s_null); - return s_null; - } - else if (obj == Py_True) { - static PyObject *s_true = NULL; - if (s_true == NULL) { - s_true = PyString_InternFromString("true"); - } - Py_INCREF(s_true); - return s_true; - } - else if (obj == Py_False) { - static PyObject *s_false = NULL; - if (s_false == NULL) { - s_false = PyString_InternFromString("false"); - } - Py_INCREF(s_false); - return s_false; - } - else { - PyErr_SetString(PyExc_ValueError, "not a const"); - return NULL; - } -} - -static PyObject * -encoder_encode_float(PyEncoderObject *s, PyObject *obj) -{ - /* Return the JSON representation of a PyFloat */ - double i = PyFloat_AS_DOUBLE(obj); - if (!Py_IS_FINITE(i)) { - if (!s->allow_nan) { - PyErr_SetString(PyExc_ValueError, "Out of range float values are not JSON compliant"); - return NULL; - } - if (i > 0) { - return PyString_FromString("Infinity"); - } - else if (i < 0) { - return PyString_FromString("-Infinity"); - } - else { - return PyString_FromString("NaN"); - } - } - /* Use a better float format here? */ - return PyObject_Repr(obj); -} - -static PyObject * -encoder_encode_string(PyEncoderObject *s, PyObject *obj) -{ - /* Return the JSON representation of a string */ - if (s->fast_encode) - return py_encode_basestring_ascii(NULL, obj); - else - return PyObject_CallFunctionObjArgs(s->encoder, obj, NULL); -} - -static int -_steal_list_append(PyObject *lst, PyObject *stolen) -{ - /* Append stolen and then decrement its reference count */ - int rval = PyList_Append(lst, stolen); - Py_DECREF(stolen); - return rval; -} - -static int -encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level) -{ - /* Encode Python object obj to a JSON term, rval is a PyList */ - int rv = -1; - if (Py_EnterRecursiveCall(" while encoding a JSON document")) - return rv; - do { - if (obj == Py_None || obj == Py_True || obj == Py_False) { - PyObject *cstr = _encoded_const(obj); - if (cstr != NULL) - rv = _steal_list_append(rval, cstr); - } - else if (PyString_Check(obj) || PyUnicode_Check(obj)) - { - PyObject *encoded = encoder_encode_string(s, obj); - if (encoded != NULL) - rv = _steal_list_append(rval, encoded); - } - else if (PyInt_Check(obj) || PyLong_Check(obj)) { - PyObject *encoded = PyObject_Str(obj); - if (encoded != NULL) - rv = _steal_list_append(rval, encoded); - } - else if (PyFloat_Check(obj)) { - PyObject *encoded = encoder_encode_float(s, obj); - if (encoded != NULL) - rv = _steal_list_append(rval, encoded); - } - else if (PyList_Check(obj) || PyTuple_Check(obj)) { - rv = encoder_listencode_list(s, rval, obj, indent_level); - } - else if (PyDict_Check(obj)) { - rv = encoder_listencode_dict(s, rval, obj, indent_level); - } - else if (s->use_decimal && Decimal_Check(obj)) { - PyObject *encoded = PyObject_Str(obj); - if (encoded != NULL) - rv = _steal_list_append(rval, encoded); - } - else { - PyObject *ident = NULL; - PyObject *newobj; - if (s->markers != Py_None) { - int has_key; - ident = PyLong_FromVoidPtr(obj); - if (ident == NULL) - break; - has_key = PyDict_Contains(s->markers, ident); - if (has_key) { - if (has_key != -1) - PyErr_SetString(PyExc_ValueError, "Circular reference detected"); - Py_DECREF(ident); - break; - } - if (PyDict_SetItem(s->markers, ident, obj)) { - Py_DECREF(ident); - break; - } - } - newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL); - if (newobj == NULL) { - Py_XDECREF(ident); - break; - } - rv = encoder_listencode_obj(s, rval, newobj, indent_level); - Py_DECREF(newobj); - if (rv) { - Py_XDECREF(ident); - rv = -1; - } - else if (ident != NULL) { - if (PyDict_DelItem(s->markers, ident)) { - Py_XDECREF(ident); - rv = -1; - } - Py_XDECREF(ident); - } - } - } while (0); - Py_LeaveRecursiveCall(); - return rv; -} - -static int -encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level) -{ - /* Encode Python dict dct a JSON term, rval is a PyList */ - static PyObject *open_dict = NULL; - static PyObject *close_dict = NULL; - static PyObject *empty_dict = NULL; - static PyObject *iteritems = NULL; - PyObject *kstr = NULL; - PyObject *ident = NULL; - PyObject *iter = NULL; - PyObject *item = NULL; - PyObject *items = NULL; - PyObject *encoded = NULL; - int skipkeys; - Py_ssize_t idx; - - if (open_dict == NULL || close_dict == NULL || empty_dict == NULL || iteritems == NULL) { - open_dict = PyString_InternFromString("{"); - close_dict = PyString_InternFromString("}"); - empty_dict = PyString_InternFromString("{}"); - iteritems = PyString_InternFromString("iteritems"); - if (open_dict == NULL || close_dict == NULL || empty_dict == NULL || iteritems == NULL) - return -1; - } - if (PyDict_Size(dct) == 0) - return PyList_Append(rval, empty_dict); - - if (s->markers != Py_None) { - int has_key; - ident = PyLong_FromVoidPtr(dct); - if (ident == NULL) - goto bail; - has_key = PyDict_Contains(s->markers, ident); - if (has_key) { - if (has_key != -1) - PyErr_SetString(PyExc_ValueError, "Circular reference detected"); - goto bail; - } - if (PyDict_SetItem(s->markers, ident, dct)) { - goto bail; - } - } - - if (PyList_Append(rval, open_dict)) - goto bail; - - if (s->indent != Py_None) { - /* TODO: DOES NOT RUN */ - indent_level += 1; - /* - newline_indent = '\n' + (_indent * _current_indent_level) - separator = _item_separator + newline_indent - buf += newline_indent - */ - } - - if (PyObject_IsTrue(s->sort_keys)) { - /* First sort the keys then replace them with (key, value) tuples. */ - Py_ssize_t i, nitems; - if (PyDict_CheckExact(dct)) - items = PyDict_Keys(dct); - else - items = PyMapping_Keys(dct); - if (items == NULL) - goto bail; - if (!PyList_Check(items)) { - PyErr_SetString(PyExc_ValueError, "keys must return list"); - goto bail; - } - if (PyList_Sort(items) < 0) - goto bail; - nitems = PyList_GET_SIZE(items); - for (i = 0; i < nitems; i++) { - PyObject *key, *value; - key = PyList_GET_ITEM(items, i); - value = PyDict_GetItem(dct, key); - item = PyTuple_Pack(2, key, value); - if (item == NULL) - goto bail; - PyList_SET_ITEM(items, i, item); - Py_DECREF(key); - } - } - else { - if (PyDict_CheckExact(dct)) - items = PyDict_Items(dct); - else - items = PyMapping_Items(dct); - } - if (items == NULL) - goto bail; - iter = PyObject_GetIter(items); - Py_DECREF(items); - if (iter == NULL) - goto bail; - - skipkeys = PyObject_IsTrue(s->skipkeys); - idx = 0; - while ((item = PyIter_Next(iter))) { - PyObject *encoded, *key, *value; - if (!PyTuple_Check(item) || Py_SIZE(item) != 2) { - PyErr_SetString(PyExc_ValueError, "items must return 2-tuples"); - goto bail; - } - key = PyTuple_GET_ITEM(item, 0); - if (key == NULL) - goto bail; - value = PyTuple_GET_ITEM(item, 1); - if (value == NULL) - goto bail; - - encoded = PyDict_GetItem(s->key_memo, key); - if (encoded != NULL) { - Py_INCREF(encoded); - } - else if (PyString_Check(key) || PyUnicode_Check(key)) { - Py_INCREF(key); - kstr = key; - } - else if (PyFloat_Check(key)) { - kstr = encoder_encode_float(s, key); - if (kstr == NULL) - goto bail; - } - else if (key == Py_True || key == Py_False || key == Py_None) { - /* This must come before the PyInt_Check because - True and False are also 1 and 0.*/ - kstr = _encoded_const(key); - if (kstr == NULL) - goto bail; - } - else if (PyInt_Check(key) || PyLong_Check(key)) { - kstr = PyObject_Str(key); - if (kstr == NULL) - goto bail; - } - else if (skipkeys) { - Py_DECREF(item); - continue; - } - else { - /* TODO: include repr of key */ - PyErr_SetString(PyExc_TypeError, "keys must be a string"); - goto bail; - } - - if (idx) { - if (PyList_Append(rval, s->item_separator)) - goto bail; - } - - if (encoded == NULL) { - encoded = encoder_encode_string(s, kstr); - Py_CLEAR(kstr); - if (encoded == NULL) - goto bail; - if (PyDict_SetItem(s->key_memo, key, encoded)) - goto bail; - } - if (PyList_Append(rval, encoded)) { - goto bail; - } - Py_CLEAR(encoded); - if (PyList_Append(rval, s->key_separator)) - goto bail; - if (encoder_listencode_obj(s, rval, value, indent_level)) - goto bail; - Py_CLEAR(item); - idx += 1; - } - Py_CLEAR(iter); - if (PyErr_Occurred()) - goto bail; - if (ident != NULL) { - if (PyDict_DelItem(s->markers, ident)) - goto bail; - Py_CLEAR(ident); - } - if (s->indent != Py_None) { - /* TODO: DOES NOT RUN */ - indent_level -= 1; - /* - yield '\n' + (_indent * _current_indent_level) - */ - } - if (PyList_Append(rval, close_dict)) - goto bail; - return 0; - -bail: - Py_XDECREF(encoded); - Py_XDECREF(items); - Py_XDECREF(iter); - Py_XDECREF(kstr); - Py_XDECREF(ident); - return -1; -} - - -static int -encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level) -{ - /* Encode Python list seq to a JSON term, rval is a PyList */ - static PyObject *open_array = NULL; - static PyObject *close_array = NULL; - static PyObject *empty_array = NULL; - PyObject *ident = NULL; - PyObject *iter = NULL; - PyObject *obj = NULL; - int is_true; - int i = 0; - - if (open_array == NULL || close_array == NULL || empty_array == NULL) { - open_array = PyString_InternFromString("["); - close_array = PyString_InternFromString("]"); - empty_array = PyString_InternFromString("[]"); - if (open_array == NULL || close_array == NULL || empty_array == NULL) - return -1; - } - ident = NULL; - is_true = PyObject_IsTrue(seq); - if (is_true == -1) - return -1; - else if (is_true == 0) - return PyList_Append(rval, empty_array); - - if (s->markers != Py_None) { - int has_key; - ident = PyLong_FromVoidPtr(seq); - if (ident == NULL) - goto bail; - has_key = PyDict_Contains(s->markers, ident); - if (has_key) { - if (has_key != -1) - PyErr_SetString(PyExc_ValueError, "Circular reference detected"); - goto bail; - } - if (PyDict_SetItem(s->markers, ident, seq)) { - goto bail; - } - } - - iter = PyObject_GetIter(seq); - if (iter == NULL) - goto bail; - - if (PyList_Append(rval, open_array)) - goto bail; - if (s->indent != Py_None) { - /* TODO: DOES NOT RUN */ - indent_level += 1; - /* - newline_indent = '\n' + (_indent * _current_indent_level) - separator = _item_separator + newline_indent - buf += newline_indent - */ - } - while ((obj = PyIter_Next(iter))) { - if (i) { - if (PyList_Append(rval, s->item_separator)) - goto bail; - } - if (encoder_listencode_obj(s, rval, obj, indent_level)) - goto bail; - i++; - Py_CLEAR(obj); - } - Py_CLEAR(iter); - if (PyErr_Occurred()) - goto bail; - if (ident != NULL) { - if (PyDict_DelItem(s->markers, ident)) - goto bail; - Py_CLEAR(ident); - } - if (s->indent != Py_None) { - /* TODO: DOES NOT RUN */ - indent_level -= 1; - /* - yield '\n' + (_indent * _current_indent_level) - */ - } - if (PyList_Append(rval, close_array)) - goto bail; - return 0; - -bail: - Py_XDECREF(obj); - Py_XDECREF(iter); - Py_XDECREF(ident); - return -1; -} - -static void -encoder_dealloc(PyObject *self) -{ - /* Deallocate Encoder */ - encoder_clear(self); - Py_TYPE(self)->tp_free(self); -} - -static int -encoder_traverse(PyObject *self, visitproc visit, void *arg) -{ - PyEncoderObject *s; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - Py_VISIT(s->markers); - Py_VISIT(s->defaultfn); - Py_VISIT(s->encoder); - Py_VISIT(s->indent); - Py_VISIT(s->key_separator); - Py_VISIT(s->item_separator); - Py_VISIT(s->sort_keys); - Py_VISIT(s->skipkeys); - Py_VISIT(s->key_memo); - return 0; -} - -static int -encoder_clear(PyObject *self) -{ - /* Deallocate Encoder */ - PyEncoderObject *s; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - Py_CLEAR(s->markers); - Py_CLEAR(s->defaultfn); - Py_CLEAR(s->encoder); - Py_CLEAR(s->indent); - Py_CLEAR(s->key_separator); - Py_CLEAR(s->item_separator); - Py_CLEAR(s->sort_keys); - Py_CLEAR(s->skipkeys); - Py_CLEAR(s->key_memo); - return 0; -} - -PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable"); - -static -PyTypeObject PyEncoderType = { - PyObject_HEAD_INIT(NULL) - 0, /* tp_internal */ - "simplejson._speedups.Encoder", /* tp_name */ - sizeof(PyEncoderObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - encoder_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - encoder_call, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - encoder_doc, /* tp_doc */ - encoder_traverse, /* tp_traverse */ - encoder_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - encoder_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - encoder_init, /* tp_init */ - 0, /* tp_alloc */ - encoder_new, /* tp_new */ - 0, /* tp_free */ -}; - -static PyMethodDef speedups_methods[] = { - {"encode_basestring_ascii", - (PyCFunction)py_encode_basestring_ascii, - METH_O, - pydoc_encode_basestring_ascii}, - {"scanstring", - (PyCFunction)py_scanstring, - METH_VARARGS, - pydoc_scanstring}, - {NULL, NULL, 0, NULL} -}; - -PyDoc_STRVAR(module_doc, -"simplejson speedups\n"); - -void -init_speedups(void) -{ - PyObject *m, *decimal; - PyScannerType.tp_new = PyType_GenericNew; - if (PyType_Ready(&PyScannerType) < 0) - return; - PyEncoderType.tp_new = PyType_GenericNew; - if (PyType_Ready(&PyEncoderType) < 0) - return; - - decimal = PyImport_ImportModule("decimal"); - if (decimal == NULL) - return; - DecimalTypePtr = (PyTypeObject*)PyObject_GetAttrString(decimal, "Decimal"); - Py_DECREF(decimal); - if (DecimalTypePtr == NULL) - return; - - m = Py_InitModule3("_speedups", speedups_methods, module_doc); - Py_INCREF((PyObject*)&PyScannerType); - PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType); - Py_INCREF((PyObject*)&PyEncoderType); - PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType); -} diff --git a/shotgun_api3/lib/simplejson/decoder.py b/shotgun_api3/lib/simplejson/decoder.py deleted file mode 100644 index e5496d6e7..000000000 --- a/shotgun_api3/lib/simplejson/decoder.py +++ /dev/null @@ -1,421 +0,0 @@ -"""Implementation of JSONDecoder -""" -import re -import sys -import struct - -from simplejson.scanner import make_scanner -def _import_c_scanstring(): - try: - from simplejson._speedups import scanstring - return scanstring - except ImportError: - return None -c_scanstring = _import_c_scanstring() - -__all__ = ['JSONDecoder'] - -FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL - -def _floatconstants(): - _BYTES = '7FF80000000000007FF0000000000000'.decode('hex') - # The struct module in Python 2.4 would get frexp() out of range here - # when an endian is specified in the format string. Fixed in Python 2.5+ - if sys.byteorder != 'big': - _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1] - nan, inf = struct.unpack('dd', _BYTES) - return nan, inf, -inf - -NaN, PosInf, NegInf = _floatconstants() - - -class JSONDecodeError(ValueError): - """Subclass of ValueError with the following additional properties: - - msg: The unformatted error message - doc: The JSON document being parsed - pos: The start index of doc where parsing failed - end: The end index of doc where parsing failed (may be None) - lineno: The line corresponding to pos - colno: The column corresponding to pos - endlineno: The line corresponding to end (may be None) - endcolno: The column corresponding to end (may be None) - - """ - def __init__(self, msg, doc, pos, end=None): - ValueError.__init__(self, errmsg(msg, doc, pos, end=end)) - self.msg = msg - self.doc = doc - self.pos = pos - self.end = end - self.lineno, self.colno = linecol(doc, pos) - if end is not None: - self.endlineno, self.endcolno = linecol(doc, end) - else: - self.endlineno, self.endcolno = None, None - - -def linecol(doc, pos): - lineno = doc.count('\n', 0, pos) + 1 - if lineno == 1: - colno = pos - else: - colno = pos - doc.rindex('\n', 0, pos) - return lineno, colno - - -def errmsg(msg, doc, pos, end=None): - # Note that this function is called from _speedups - lineno, colno = linecol(doc, pos) - if end is None: - #fmt = '{0}: line {1} column {2} (char {3})' - #return fmt.format(msg, lineno, colno, pos) - fmt = '%s: line %d column %d (char %d)' - return fmt % (msg, lineno, colno, pos) - endlineno, endcolno = linecol(doc, end) - #fmt = '{0}: line {1} column {2} - line {3} column {4} (char {5} - {6})' - #return fmt.format(msg, lineno, colno, endlineno, endcolno, pos, end) - fmt = '%s: line %d column %d - line %d column %d (char %d - %d)' - return fmt % (msg, lineno, colno, endlineno, endcolno, pos, end) - - -_CONSTANTS = { - '-Infinity': NegInf, - 'Infinity': PosInf, - 'NaN': NaN, -} - -STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) -BACKSLASH = { - '"': u'"', '\\': u'\\', '/': u'/', - 'b': u'\b', 'f': u'\f', 'n': u'\n', 'r': u'\r', 't': u'\t', -} - -DEFAULT_ENCODING = "utf-8" - -def py_scanstring(s, end, encoding=None, strict=True, - _b=BACKSLASH, _m=STRINGCHUNK.match): - """Scan the string s for a JSON string. End is the index of the - character in s after the quote that started the JSON string. - Unescapes all valid JSON string escape sequences and raises ValueError - on attempt to decode an invalid string. If strict is False then literal - control characters are allowed in the string. - - Returns a tuple of the decoded string and the index of the character in s - after the end quote.""" - if encoding is None: - encoding = DEFAULT_ENCODING - chunks = [] - _append = chunks.append - begin = end - 1 - while 1: - chunk = _m(s, end) - if chunk is None: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - end = chunk.end() - content, terminator = chunk.groups() - # Content is contains zero or more unescaped string characters - if content: - if not isinstance(content, unicode): - content = unicode(content, encoding) - _append(content) - # Terminator is the end of string, a literal control character, - # or a backslash denoting that an escape sequence follows - if terminator == '"': - break - elif terminator != '\\': - if strict: - msg = "Invalid control character %r at" % (terminator,) - #msg = "Invalid control character {0!r} at".format(terminator) - raise JSONDecodeError(msg, s, end) - else: - _append(terminator) - continue - try: - esc = s[end] - except IndexError: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - # If not a unicode escape sequence, must be in the lookup table - if esc != 'u': - try: - char = _b[esc] - except KeyError: - msg = "Invalid \\escape: " + repr(esc) - raise JSONDecodeError(msg, s, end) - end += 1 - else: - # Unicode escape sequence - esc = s[end + 1:end + 5] - next_end = end + 5 - if len(esc) != 4: - msg = "Invalid \\uXXXX escape" - raise JSONDecodeError(msg, s, end) - uni = int(esc, 16) - # Check for surrogate pair on UCS-4 systems - if 0xd800 <= uni <= 0xdbff and sys.maxunicode > 65535: - msg = "Invalid \\uXXXX\\uXXXX surrogate pair" - if not s[end + 5:end + 7] == '\\u': - raise JSONDecodeError(msg, s, end) - esc2 = s[end + 7:end + 11] - if len(esc2) != 4: - raise JSONDecodeError(msg, s, end) - uni2 = int(esc2, 16) - uni = 0x10000 + (((uni - 0xd800) << 10) | (uni2 - 0xdc00)) - next_end += 6 - char = unichr(uni) - end = next_end - # Append the unescaped character - _append(char) - return u''.join(chunks), end - - -# Use speedup if available -scanstring = c_scanstring or py_scanstring - -WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) -WHITESPACE_STR = ' \t\n\r' - -def JSONObject((s, end), encoding, strict, scan_once, object_hook, - object_pairs_hook, memo=None, - _w=WHITESPACE.match, _ws=WHITESPACE_STR): - # Backwards compatibility - if memo is None: - memo = {} - memo_get = memo.setdefault - pairs = [] - # Use a slice to prevent IndexError from being raised, the following - # check will raise a more specific ValueError if the string is empty - nextchar = s[end:end + 1] - # Normally we expect nextchar == '"' - if nextchar != '"': - if nextchar in _ws: - end = _w(s, end).end() - nextchar = s[end:end + 1] - # Trivial empty object - if nextchar == '}': - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end + 1 - pairs = {} - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end + 1 - elif nextchar != '"': - raise JSONDecodeError("Expecting property name", s, end) - end += 1 - while True: - key, end = scanstring(s, end, encoding, strict) - key = memo_get(key, key) - - # To skip some function call overhead we optimize the fast paths where - # the JSON key separator is ": " or just ":". - if s[end:end + 1] != ':': - end = _w(s, end).end() - if s[end:end + 1] != ':': - raise JSONDecodeError("Expecting : delimiter", s, end) - - end += 1 - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - try: - value, end = scan_once(s, end) - except StopIteration: - raise JSONDecodeError("Expecting object", s, end) - pairs.append((key, value)) - - try: - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - end += 1 - - if nextchar == '}': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting , delimiter", s, end - 1) - - try: - nextchar = s[end] - if nextchar in _ws: - end += 1 - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - - end += 1 - if nextchar != '"': - raise JSONDecodeError("Expecting property name", s, end - 1) - - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end - pairs = dict(pairs) - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end - -def JSONArray((s, end), scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): - values = [] - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - # Look-ahead for trivial empty array - if nextchar == ']': - return values, end + 1 - _append = values.append - while True: - try: - value, end = scan_once(s, end) - except StopIteration: - raise JSONDecodeError("Expecting object", s, end) - _append(value) - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - end += 1 - if nextchar == ']': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting , delimiter", s, end) - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - return values, end - -class JSONDecoder(object): - """Simple JSON decoder - - Performs the following translations in decoding by default: - - +---------------+-------------------+ - | JSON | Python | - +===============+===================+ - | object | dict | - +---------------+-------------------+ - | array | list | - +---------------+-------------------+ - | string | unicode | - +---------------+-------------------+ - | number (int) | int, long | - +---------------+-------------------+ - | number (real) | float | - +---------------+-------------------+ - | true | True | - +---------------+-------------------+ - | false | False | - +---------------+-------------------+ - | null | None | - +---------------+-------------------+ - - It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as - their corresponding ``float`` values, which is outside the JSON spec. - - """ - - def __init__(self, encoding=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, strict=True, - object_pairs_hook=None): - """ - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - *strict* controls the parser's behavior when it encounters an - invalid control character in a string. The default setting of - ``True`` means that unescaped control characters are parse errors, if - ``False`` then control characters will be allowed in strings. - - """ - self.encoding = encoding - self.object_hook = object_hook - self.object_pairs_hook = object_pairs_hook - self.parse_float = parse_float or float - self.parse_int = parse_int or int - self.parse_constant = parse_constant or _CONSTANTS.__getitem__ - self.strict = strict - self.parse_object = JSONObject - self.parse_array = JSONArray - self.parse_string = scanstring - self.memo = {} - self.scan_once = make_scanner(self) - - def decode(self, s, _w=WHITESPACE.match): - """Return the Python representation of ``s`` (a ``str`` or ``unicode`` - instance containing a JSON document) - - """ - obj, end = self.raw_decode(s, idx=_w(s, 0).end()) - end = _w(s, end).end() - if end != len(s): - raise JSONDecodeError("Extra data", s, end, len(s)) - return obj - - def raw_decode(self, s, idx=0): - """Decode a JSON document from ``s`` (a ``str`` or ``unicode`` - beginning with a JSON document) and return a 2-tuple of the Python - representation and the index in ``s`` where the document ended. - - This can be used to decode a JSON document from a string that may - have extraneous data at the end. - - """ - try: - obj, end = self.scan_once(s, idx) - except StopIteration: - raise JSONDecodeError("No JSON object could be decoded", s, idx) - return obj, end diff --git a/shotgun_api3/lib/simplejson/encoder.py b/shotgun_api3/lib/simplejson/encoder.py deleted file mode 100644 index f43f6f430..000000000 --- a/shotgun_api3/lib/simplejson/encoder.py +++ /dev/null @@ -1,503 +0,0 @@ -"""Implementation of JSONEncoder -""" -import re -from decimal import Decimal - -def _import_speedups(): - try: - from simplejson import _speedups - return _speedups.encode_basestring_ascii, _speedups.make_encoder - except ImportError: - return None, None -c_encode_basestring_ascii, c_make_encoder = _import_speedups() - -from simplejson.decoder import PosInf - -ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]') -ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') -HAS_UTF8 = re.compile(r'[\x80-\xff]') -ESCAPE_DCT = { - '\\': '\\\\', - '"': '\\"', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', -} -for i in range(0x20): - #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) - ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) - -FLOAT_REPR = repr - -def encode_basestring(s): - """Return a JSON representation of a Python string - - """ - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - return ESCAPE_DCT[match.group(0)] - return u'"' + ESCAPE.sub(replace, s) + u'"' - - -def py_encode_basestring_ascii(s): - """Return an ASCII-only JSON representation of a Python string - - """ - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - s = match.group(0) - try: - return ESCAPE_DCT[s] - except KeyError: - n = ord(s) - if n < 0x10000: - #return '\\u{0:04x}'.format(n) - return '\\u%04x' % (n,) - else: - # surrogate pair - n -= 0x10000 - s1 = 0xd800 | ((n >> 10) & 0x3ff) - s2 = 0xdc00 | (n & 0x3ff) - #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2) - return '\\u%04x\\u%04x' % (s1, s2) - return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"' - - -encode_basestring_ascii = ( - c_encode_basestring_ascii or py_encode_basestring_ascii) - -class JSONEncoder(object): - """Extensible JSON encoder for Python data structures. - - Supports the following objects and types by default: - - +-------------------+---------------+ - | Python | JSON | - +===================+===============+ - | dict | object | - +-------------------+---------------+ - | list, tuple | array | - +-------------------+---------------+ - | str, unicode | string | - +-------------------+---------------+ - | int, long, float | number | - +-------------------+---------------+ - | True | true | - +-------------------+---------------+ - | False | false | - +-------------------+---------------+ - | None | null | - +-------------------+---------------+ - - To extend this to recognize other objects, subclass and implement a - ``.default()`` method with another method that returns a serializable - object for ``o`` if possible, otherwise it should call the superclass - implementation (to raise ``TypeError``). - - """ - item_separator = ', ' - key_separator = ': ' - def __init__(self, skipkeys=False, ensure_ascii=True, - check_circular=True, allow_nan=True, sort_keys=False, - indent=None, separators=None, encoding='utf-8', default=None, - use_decimal=False): - """Constructor for JSONEncoder, with sensible defaults. - - If skipkeys is false, then it is a TypeError to attempt - encoding of keys that are not str, int, long, float or None. If - skipkeys is True, such items are simply skipped. - - If ensure_ascii is true, the output is guaranteed to be str - objects with all incoming unicode characters escaped. If - ensure_ascii is false, the output will be unicode object. - - If check_circular is true, then lists, dicts, and custom encoded - objects will be checked for circular references during encoding to - prevent an infinite recursion (which would cause an OverflowError). - Otherwise, no such check takes place. - - If allow_nan is true, then NaN, Infinity, and -Infinity will be - encoded as such. This behavior is not JSON specification compliant, - but is consistent with most JavaScript based encoders and decoders. - Otherwise, it will be a ValueError to encode such floats. - - If sort_keys is true, then the output of dictionaries will be - sorted by key; this is useful for regression tests to ensure - that JSON serializations can be compared on a day-to-day basis. - - If indent is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, separators should be a (item_separator, key_separator) - tuple. The default is (', ', ': '). To get the most compact JSON - representation you should specify (',', ':') to eliminate whitespace. - - If specified, default is a function that gets called for objects - that can't otherwise be serialized. It should return a JSON encodable - version of the object or raise a ``TypeError``. - - If encoding is not None, then all input strings will be - transformed into unicode using that encoding prior to JSON-encoding. - The default is UTF-8. - - If use_decimal is true (not the default), ``decimal.Decimal`` will - be supported directly by the encoder. For the inverse, decode JSON - with ``parse_float=decimal.Decimal``. - - """ - - self.skipkeys = skipkeys - self.ensure_ascii = ensure_ascii - self.check_circular = check_circular - self.allow_nan = allow_nan - self.sort_keys = sort_keys - self.use_decimal = use_decimal - if isinstance(indent, (int, long)): - indent = ' ' * indent - self.indent = indent - if separators is not None: - self.item_separator, self.key_separator = separators - elif indent is not None: - self.item_separator = ',' - if default is not None: - self.default = default - self.encoding = encoding - - def default(self, o): - """Implement this method in a subclass such that it returns - a serializable object for ``o``, or calls the base implementation - (to raise a ``TypeError``). - - For example, to support arbitrary iterators, you could - implement default like this:: - - def default(self, o): - try: - iterable = iter(o) - except TypeError: - pass - else: - return list(iterable) - return JSONEncoder.default(self, o) - - """ - raise TypeError(repr(o) + " is not JSON serializable") - - def encode(self, o): - """Return a JSON string representation of a Python data structure. - - >>> from simplejson import JSONEncoder - >>> JSONEncoder().encode({"foo": ["bar", "baz"]}) - '{"foo": ["bar", "baz"]}' - - """ - # This is for extremely simple cases and benchmarks. - if isinstance(o, basestring): - if isinstance(o, str): - _encoding = self.encoding - if (_encoding is not None - and not (_encoding == 'utf-8')): - o = o.decode(_encoding) - if self.ensure_ascii: - return encode_basestring_ascii(o) - else: - return encode_basestring(o) - # This doesn't pass the iterator directly to ''.join() because the - # exceptions aren't as detailed. The list call should be roughly - # equivalent to the PySequence_Fast that ''.join() would do. - chunks = self.iterencode(o, _one_shot=True) - if not isinstance(chunks, (list, tuple)): - chunks = list(chunks) - if self.ensure_ascii: - return ''.join(chunks) - else: - return u''.join(chunks) - - def iterencode(self, o, _one_shot=False): - """Encode the given object and yield each string - representation as available. - - For example:: - - for chunk in JSONEncoder().iterencode(bigobject): - mysocket.write(chunk) - - """ - if self.check_circular: - markers = {} - else: - markers = None - if self.ensure_ascii: - _encoder = encode_basestring_ascii - else: - _encoder = encode_basestring - if self.encoding != 'utf-8': - def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding): - if isinstance(o, str): - o = o.decode(_encoding) - return _orig_encoder(o) - - def floatstr(o, allow_nan=self.allow_nan, - _repr=FLOAT_REPR, _inf=PosInf, _neginf=-PosInf): - # Check for specials. Note that this type of test is processor - # and/or platform-specific, so do tests which don't depend on - # the internals. - - if o != o: - text = 'NaN' - elif o == _inf: - text = 'Infinity' - elif o == _neginf: - text = '-Infinity' - else: - return _repr(o) - - if not allow_nan: - raise ValueError( - "Out of range float values are not JSON compliant: " + - repr(o)) - - return text - - - key_memo = {} - if (_one_shot and c_make_encoder is not None - and self.indent is None): - _iterencode = c_make_encoder( - markers, self.default, _encoder, self.indent, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, self.allow_nan, key_memo, self.use_decimal) - else: - _iterencode = _make_iterencode( - markers, self.default, _encoder, self.indent, floatstr, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, _one_shot, self.use_decimal) - try: - return _iterencode(o, 0) - finally: - key_memo.clear() - - -class JSONEncoderForHTML(JSONEncoder): - """An encoder that produces JSON safe to embed in HTML. - - To embed JSON content in, say, a script tag on a web page, the - characters &, < and > should be escaped. They cannot be escaped - with the usual entities (e.g. &) because they are not expanded - within