From af998eefcf0b3f1c4b9b5831d1c11f265817751d Mon Sep 17 00:00:00 2001 From: Shilpa Bijam Date: Mon, 18 May 2020 14:39:37 -0700 Subject: [PATCH 01/21] Updates to release 1.6.13 --- CHANGELOG.md | 5 +++++ README.md | 4 ++-- examples/searchcommands_app/setup.py | 2 +- splunklib/__init__.py | 2 +- splunklib/binding.py | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 083a9595d..22cd4e742 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Splunk SDK for Python Changelog +## Version 1.6.13 + +### Bug fix +* Fixes regression in mod inputs which resulted in an error ’file' object has no attribute 'readable’, by not forcing to text/bytes in mod inputs event writer any longer. + ## Version 1.6.12 ### New features and APIs diff --git a/README.md b/README.md index 4ad69f04d..92c7220c0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # The Splunk Software Development Kit for Python -#### Version 1.6.12 +#### Version 1.6.13 The Splunk Software Development Kit (SDK) for Python contains library code and examples designed to enable developers to build applications using Splunk. @@ -17,7 +17,7 @@ monitoring of IT machine data, security, compliance and a wide variety of other scenarios that share a requirement to efficiently index, search, analyze and generate real-time notifications from large volumes of time series data. -The Splunk developer platform enables ^Fdevelopers to take advantage of the same +The Splunk developer platform enables developers to take advantage of the same technology used by the Splunk product to build exciting new applications that are enabled by Splunk's unique capabilities. diff --git a/examples/searchcommands_app/setup.py b/examples/searchcommands_app/setup.py index 2cf51a4c2..359199a37 100755 --- a/examples/searchcommands_app/setup.py +++ b/examples/searchcommands_app/setup.py @@ -439,7 +439,7 @@ def run(self): setup( description='Custom Search Command examples', name=os.path.basename(project_dir), - version='1.6.12', + version='1.6.13', author='Splunk, Inc.', author_email='devinfo@splunk.com', url='http://github.com/splunk/splunk-sdk-python', diff --git a/splunklib/__init__.py b/splunklib/__init__.py index 929a63172..e4cde3bdc 100644 --- a/splunklib/__init__.py +++ b/splunklib/__init__.py @@ -16,5 +16,5 @@ from __future__ import absolute_import from splunklib.six.moves import map -__version_info__ = (1, 6, 12) +__version_info__ = (1, 6, 13) __version__ = ".".join(map(str, __version_info__)) diff --git a/splunklib/binding.py b/splunklib/binding.py index b0ed20e1b..81780c6ed 100644 --- a/splunklib/binding.py +++ b/splunklib/binding.py @@ -1378,7 +1378,7 @@ def request(url, message, **kwargs): head = { "Content-Length": str(len(body)), "Host": host, - "User-Agent": "splunk-sdk-python/1.6.12", + "User-Agent": "splunk-sdk-python/1.6.13", "Accept": "*/*", "Connection": "Close", } # defaults From 5f80fbd814a264bc73084cb397dd974137c215b6 Mon Sep 17 00:00:00 2001 From: Shilpa Bijam Date: Mon, 18 May 2020 15:30:33 -0700 Subject: [PATCH 02/21] updated changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22cd4e742..d6f28c9fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,10 @@ ## Version 1.6.13 ### Bug fix -* Fixes regression in mod inputs which resulted in an error ’file' object has no attribute 'readable’, by not forcing to text/bytes in mod inputs event writer any longer. +* Fixed regression in mod inputs which resulted in error ’file' object has no attribute 'readable’, by not forcing to text/bytes in mod inputs event writer any longer. + +### Minor changes +* Minor updates to the splunklib search commands to support Python3 ## Version 1.6.12 From 7ff830d458713e5c996b205cdff651bbe0006c65 Mon Sep 17 00:00:00 2001 From: Amy Sutedja Date: Thu, 21 May 2020 17:13:34 -0700 Subject: [PATCH 03/21] Install sdk-app-collection via docker-compose --- .travis.yml | 14 ++++++-------- docker-compose.yml | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 docker-compose.yml diff --git a/.travis.yml b/.travis.yml index cf2a71612..882f41b33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,14 +12,12 @@ before_install: - echo password=changed! >> $HOME/.splunkrc # Set SPLUNK_HOME - export SPLUNK_HOME="/opt/splunk" - # Pull docker image - - docker pull splunk/splunk-sdk-travis-ci:$SPLUNK_VERSION # Add DOCKER to iptables, 1/10 times this is needed, force 0 exit status - sudo iptables -N DOCKER || true - # Start Docker container - - docker run -p 127.0.0.1:8089:8089 -d splunk/splunk-sdk-travis-ci:$SPLUNK_VERSION - # curl Splunk until it returns valid data indicating it has been setup, try 20 times maximum - - for i in `seq 0 20`; do if curl --fail -k https://localhost:8089/services/server/info &> /dev/null; then break; fi; echo $i; sleep 1; done + # Start docker-compose in detached mode + - docker-compose up -d + # Health Check (3 minutes) + - for i in `seq 0 180`; do if docker exec -it splunk /sbin/checkstate.sh &> /dev/null; then break; fi; echo $i; sleep 1; done # The upload test needs to refer to a file that Splunk has in the docker # container - export INPUT_EXAMPLE_UPLOAD=$SPLUNK_HOME/var/log/splunk/splunkd_ui_access.log @@ -32,8 +30,8 @@ before_install: language: python env: - - SPLUNK_VERSION=7.3-sdk - - SPLUNK_VERSION=8.0-sdk + - SPLUNK_VERSION=7.3 + - SPLUNK_VERSION=8.0 python: - "2.7" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..c4107d5dc --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +version: '3.6' + +services: + splunk: + image: "splunk/splunk:${SPLUNK_VERSION}" + container_name: splunk + environment: + - SPLUNK_START_ARGS=--accept-license + - SPLUNK_HEC_TOKEN=11111111-1111-1111-1111-1111111111113 + - SPLUNK_PASSWORD=changed! + - SPLUNK_APPS_URL=https://github.com/splunk/sdk-app-collection/releases/download/v1.0.0/sdk-app-collection.tgz + ports: + - 8000:8000 + - 8088:8088 + - 8089:8089 + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:8000'] + interval: 5s + timeout: 5s + retries: 20 From b8aefd6cac3d064a1d281539eba2fdc31bca8d72 Mon Sep 17 00:00:00 2001 From: Amy Sutedja Date: Thu, 21 May 2020 19:32:30 -0700 Subject: [PATCH 04/21] Helpful instructions around docker usage --- Makefile | 20 ++++++++++++++++++++ README.md | 16 ++++++++++++++-- scripts/build-splunkrc.py | 4 ++-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index f9d3e1691..a829f5d85 100644 --- a/Makefile +++ b/Makefile @@ -56,3 +56,23 @@ splunkrc: @echo "$(ATTN_COLOR)==> splunkrc $(NO_COLOR)" @echo "To make a .splunkrc:" @echo " [SPLUNK_INSTANCE_JSON] | python scripts/build-splunkrc.py ~/.splunkrc" + +.PHONY: splunkrc_default +splunkrc_default: + @echo "$(ATTN_COLOR)==> splunkrc_default $(NO_COLOR)" + @python scripts/build-splunkrc.py ~/.splunkrc + +.PHONY: up +up: + @echo "$(ATTN_COLOR)==> up $(NO_COLOR)" + @docker-compose up -d + +.PHONY: wait_up +wait_up: + @echo "$(ATTN_COLOR)==> wait_up $(NO_COLOR)" + @for i in `seq 0 180`; do if docker exec -it splunk /sbin/checkstate.sh &> /dev/null; then break; fi; printf "\rWaiting for Splunk for %s seconds..." $$i; sleep 1; done + +.PHONY: down +down: + @echo "$(ATTN_COLOR)==> down $(NO_COLOR)" + @docker-compose stop diff --git a/README.md b/README.md index 92c7220c0..ffefaf4ac 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ The Splunk developer platform enables developers to take advantage of the same technology used by the Splunk product to build exciting new applications that are enabled by Splunk's unique capabilities. - ## Getting started with the Splunk SDK for Python The Splunk SDK for Python contains library code and examples that show how to @@ -45,7 +44,9 @@ The Splunk SDK for Python requires Python 2.7+, including Python 3. The Splunk S If you haven't already installed Splunk, download it [here](http://www.splunk.com/download). For more about installing and running Splunk and system requirements, see -[Installing & Running Splunk](http://dev.splunk.com/view/SP-CAAADRV). The Splunk SDK for Python has been tested with Splunk Enterprise 7.0 and 7.2. +[Installing & Running Splunk](http://dev.splunk.com/view/SP-CAAADRV). The Splunk SDK for Python has been tested with Splunk Enterprise 7.3 and 8.0. + +You can also run `SPLUNK_VERSION=(VERSION) make up` to run a version of [Splunk from DockerHub](https://hub.docker.com/r/splunk/splunk/). #### Splunk SDK for Python Get the Splunk SDK for Python; [download the SDK as a ZIP](http://dev.splunk.com/view/SP-CAAAEBB) @@ -74,6 +75,17 @@ Alternatively, you can use **setup.py** on the sources you cloned from GitHub: However, it's not necessary to install the libraries to run the examples and unit tests from the SDK. +## Testing Quickstart + +You'll need `docker` and `docker-compose` to get up and running using this method. + +``` +SPLUNK_VERSION=8.0 make up +make wait_up +make splunkrc_default +make test +make down +``` ### Running the examples and unit tests diff --git a/scripts/build-splunkrc.py b/scripts/build-splunkrc.py index 464d7cf6a..0d544665c 100644 --- a/scripts/build-splunkrc.py +++ b/scripts/build-splunkrc.py @@ -25,9 +25,9 @@ 'host': 'localhost', 'port': '8089', 'username': 'admin', - 'password': 'changeme', + 'password': 'changed!', 'scheme': 'https', - 'version': '6.3' + 'version': '8.0' } DEFAULT_SPLUNKRC_PATH = os.path.join(str(Path.home()), '.splunkrc') From 3e0c6f105f1f3777e68973bfa8acb37f097f4ba5 Mon Sep 17 00:00:00 2001 From: Amy Sutedja Date: Thu, 28 May 2020 17:12:21 -0700 Subject: [PATCH 05/21] Move env variable directive in README quickstart to after the command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ffefaf4ac..442d92179 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ examples and unit tests from the SDK. You'll need `docker` and `docker-compose` to get up and running using this method. ``` -SPLUNK_VERSION=8.0 make up +make up SPLUNK_VERSION=8.0 make wait_up make splunkrc_default make test From 6b51317fb174ea6cf0d717d6cbeeb11f242fd4c5 Mon Sep 17 00:00:00 2001 From: Ivan Jager Date: Fri, 3 Jan 2020 12:10:35 -0800 Subject: [PATCH 06/21] Fix extra chunks being sent for large chunks Previously, when an external command used the SCPv2 (chunked=true) protocol via splunklib and returned with 50,000 or more rows for one chunk, it would send two replies intead of one. This caused the external command to get out of sync, sending chunk replies before reading the corresponding request. Fixes #150 --- splunklib/searchcommands/internals.py | 5 +++++ splunklib/searchcommands/search_command.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/splunklib/searchcommands/internals.py b/splunklib/searchcommands/internals.py index 9a2a4e9e2..d421d27be 100644 --- a/splunklib/searchcommands/internals.py +++ b/splunklib/searchcommands/internals.py @@ -750,6 +750,11 @@ def flush(self, finished=None, partial=None): RecordWriter.flush(self, finished, partial) # validates arguments and the state of this instance inspector = self._inspector + if partial: + # Don't flush partial chunks, since the SCP v2 protocol does not + # provide a way to send partial chunks yet. + return + if self._flushed is False: self._total_record_count += self._record_count diff --git a/splunklib/searchcommands/search_command.py b/splunklib/searchcommands/search_command.py index 47d1016a5..af34dce92 100644 --- a/splunklib/searchcommands/search_command.py +++ b/splunklib/searchcommands/search_command.py @@ -398,7 +398,7 @@ def flush(self): :return: :const:`None` """ - self._record_writer.flush(partial=True) + self._record_writer.flush(finished=False) def prepare(self): """ Prepare for execution. From 2beb3e34e19cd90ff9a94083a7ea0b94eca94960 Mon Sep 17 00:00:00 2001 From: Ivan Jager Date: Fri, 17 Jan 2020 12:17:50 -0800 Subject: [PATCH 07/21] Keep chunk requests and responses synchronized --- .../searchcommands/generating_command.py | 26 +++++---- splunklib/searchcommands/internals.py | 58 +++++++++---------- splunklib/searchcommands/search_command.py | 51 ++++++---------- 3 files changed, 61 insertions(+), 74 deletions(-) diff --git a/splunklib/searchcommands/generating_command.py b/splunklib/searchcommands/generating_command.py index 56bf42338..45a743bcd 100644 --- a/splunklib/searchcommands/generating_command.py +++ b/splunklib/searchcommands/generating_command.py @@ -194,6 +194,16 @@ def generate(self): """ raise NotImplementedError('GeneratingCommand.generate(self)') + + def __generate_chunk(self, unused_input): + count = 0 + for row in generate(): + yield row + count += 1 + if count == self._record_writer._maxresultrows: + # count = 0 + return + def _execute(self, ifile, process): """ Execution loop @@ -204,18 +214,10 @@ def _execute(self, ifile, process): """ if self._protocol_version == 2: - result = self._read_chunk(ifile) - - if not result: - return - - metadata, body = result - action = getattr(metadata, 'action', None) - - if action != 'execute': - raise RuntimeError('Expected execute action, not {}'.format(action)) - - self._record_writer.write_records(self.generate()) + self._execute_v2(ifile, self.__generate_chunk) + else: + assert self._protocol_version == 1 + self._record_writer.write_records(self.generate()) self.finish() # endregion diff --git a/splunklib/searchcommands/internals.py b/splunklib/searchcommands/internals.py index d421d27be..3451deb3c 100644 --- a/splunklib/searchcommands/internals.py +++ b/splunklib/searchcommands/internals.py @@ -654,6 +654,7 @@ def _write_record(self, record): self._record_count += 1 if self._record_count >= self._maxresultrows: + self.flush(partial=True) try: @@ -748,42 +749,39 @@ class RecordWriterV2(RecordWriter): def flush(self, finished=None, partial=None): RecordWriter.flush(self, finished, partial) # validates arguments and the state of this instance - inspector = self._inspector - if partial: + if partial or not finished: # Don't flush partial chunks, since the SCP v2 protocol does not # provide a way to send partial chunks yet. return - if self._flushed is False: - - self._total_record_count += self._record_count - self._chunk_count += 1 - - # TODO: DVPL-6448: splunklib.searchcommands | Add support for partial: true when it is implemented in - # ChunkedExternProcessor (See SPL-103525) - # - # We will need to replace the following block of code with this block: - # - # metadata = [ - # ('inspector', self._inspector if len(self._inspector) else None), - # ('finished', finished), - # ('partial', partial)] - - if len(inspector) == 0: - inspector = None + #if finished is True: + self.write_chunk(finished=True) - if partial is True: - finished = False - - metadata = [item for item in (('inspector', inspector), ('finished', finished))] - self._write_chunk(metadata, self._buffer.getvalue()) - self._clear() - - elif finished is True: - self._write_chunk((('finished', True),), '') - - self._finished = finished is True + def write_chunk(self, finished=None): + inspector = self._inspector + self._total_record_count += self._record_count + self._chunk_count += 1 + + # TODO: DVPL-6448: splunklib.searchcommands | Add support for partial: true when it is implemented in + # ChunkedExternProcessor (See SPL-103525) + # + # We will need to replace the following block of code with this block: + # + # metadata = [ + # ('inspector', self._inspector if len(self._inspector) else None), + # ('finished', finished), + # ('partial', partial)] + + if len(inspector) == 0: + inspector = None + + #if partial is True: + # finished = False + + metadata = [item for item in (('inspector', inspector), ('finished', finished))] + self._write_chunk(metadata, self._buffer.getvalue()) + self._clear() def write_metadata(self, configuration): self._ensure_validity() diff --git a/splunklib/searchcommands/search_command.py b/splunklib/searchcommands/search_command.py index af34dce92..c57c1f908 100644 --- a/splunklib/searchcommands/search_command.py +++ b/splunklib/searchcommands/search_command.py @@ -776,7 +776,7 @@ def _process_protocol_v2(self, argv, ifile, ofile): # noinspection PyBroadException try: debug('Executing under protocol_version=2') - self._records = self._records_protocol_v2 + #self._records = self._records_protocol_v2 self._metadata.action = 'execute' self._execute(ifile, None) except SystemExit: @@ -833,6 +833,8 @@ def _decode_list(mv): _encoded_value = re.compile(r'\$(?P(?:\$\$|[^$])*)\$(?:;|$)') # matches a single value in an encoded list + # Note: Subclasses must override this method so that it can be called + # called as self._execute(ifile, None) def _execute(self, ifile, process): """ Default processing loop @@ -846,8 +848,12 @@ def _execute(self, ifile, process): :rtype: NoneType """ - self._record_writer.write_records(process(self._records(ifile))) - self.finish() + if self.protocol_version == 1: + self._record_writer.write_records(process(self._records(ifile))) + self.finish() + else: + assert self._protocol_version == 2 + self._execute_v2(ifile, process) @staticmethod def _read_chunk(ifile): @@ -896,7 +902,9 @@ def _read_chunk(ifile): _header = re.compile(r'chunked\s+1.0\s*,\s*(\d+)\s*,\s*(\d+)\s*\n') def _records_protocol_v1(self, ifile): + return self._read_csv_records(ifile) + def _read_csv_records(self, ifile): reader = csv.reader(ifile, dialect=CsvDialect) try: @@ -921,7 +929,7 @@ def _records_protocol_v1(self, ifile): record[fieldname] = value yield record - def _records_protocol_v2(self, ifile): + def _execute_v2(self, ifile, process): while True: result = self._read_chunk(ifile) @@ -931,41 +939,20 @@ def _records_protocol_v2(self, ifile): metadata, body = result action = getattr(metadata, 'action', None) - if action != 'execute': raise RuntimeError('Expected execute action, not {}'.format(action)) - - finished = getattr(metadata, 'finished', False) self._record_writer.is_flushed = False - if len(body) > 0: - reader = csv.reader(StringIO(body), dialect=CsvDialect) + self._execute_chunk_v2(process, result) - try: - fieldnames = next(reader) - except StopIteration: - return + self._record_writer.write_chunk() - mv_fieldnames = dict([(name, name[len('__mv_'):]) for name in fieldnames if name.startswith('__mv_')]) - - if len(mv_fieldnames) == 0: - for values in reader: - yield OrderedDict(izip(fieldnames, values)) - else: - for values in reader: - record = OrderedDict() - for fieldname, value in izip(fieldnames, values): - if fieldname.startswith('__mv_'): - if len(value) > 0: - record[mv_fieldnames[fieldname]] = self._decode_list(value) - elif fieldname not in record: - record[fieldname] = value - yield record - - if finished: - return + def _execute_chunk_v2(self, process, chunk): + metadata, body = chunk + if len(body) > 0: + records = self._read_csv_records(StringIO(body)) + self._record_writer.write_records(process(records)) - self.flush() def _report_unexpected_error(self): From 5002dc61c35a9f3d24b4086dec88ab9a0a9cc572 Mon Sep 17 00:00:00 2001 From: Ivan Jager Date: Tue, 21 Jan 2020 09:12:31 -0800 Subject: [PATCH 08/21] Fix generating commands --- .../searchcommands/generating_command.py | 20 ++++++++++--------- splunklib/searchcommands/search_command.py | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/splunklib/searchcommands/generating_command.py b/splunklib/searchcommands/generating_command.py index 45a743bcd..ce8080928 100644 --- a/splunklib/searchcommands/generating_command.py +++ b/splunklib/searchcommands/generating_command.py @@ -195,14 +195,6 @@ def generate(self): raise NotImplementedError('GeneratingCommand.generate(self)') - def __generate_chunk(self, unused_input): - count = 0 - for row in generate(): - yield row - count += 1 - if count == self._record_writer._maxresultrows: - # count = 0 - return def _execute(self, ifile, process): """ Execution loop @@ -214,12 +206,22 @@ def _execute(self, ifile, process): """ if self._protocol_version == 2: - self._execute_v2(ifile, self.__generate_chunk) + self._execute_v2(ifile, self.generate()) else: assert self._protocol_version == 1 self._record_writer.write_records(self.generate()) self.finish() + def _execute_chunk_v2(self, process, chunk): + count = 0 + for row in process: + self._record_writer.write_record(row) + count += 1 + if count == self._record_writer._maxresultrows: + self._finished = False + return + self._finished = True + # endregion # region Types diff --git a/splunklib/searchcommands/search_command.py b/splunklib/searchcommands/search_command.py index c57c1f908..d66de5a3b 100644 --- a/splunklib/searchcommands/search_command.py +++ b/splunklib/searchcommands/search_command.py @@ -945,7 +945,7 @@ def _execute_v2(self, ifile, process): self._execute_chunk_v2(process, result) - self._record_writer.write_chunk() + self._record_writer.write_chunk(finished=self._finished) def _execute_chunk_v2(self, process, chunk): metadata, body = chunk From da3fc20fd8738a4614b45eb15d3f1b9cc0ad91f3 Mon Sep 17 00:00:00 2001 From: Ivan Jager Date: Wed, 22 Jan 2020 11:04:28 -0800 Subject: [PATCH 09/21] Clean up and match previous behavior more closely --- splunklib/searchcommands/generating_command.py | 2 -- splunklib/searchcommands/internals.py | 8 +++----- splunklib/searchcommands/search_command.py | 2 ++ 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/splunklib/searchcommands/generating_command.py b/splunklib/searchcommands/generating_command.py index ce8080928..724d45dd9 100644 --- a/splunklib/searchcommands/generating_command.py +++ b/splunklib/searchcommands/generating_command.py @@ -194,8 +194,6 @@ def generate(self): """ raise NotImplementedError('GeneratingCommand.generate(self)') - - def _execute(self, ifile, process): """ Execution loop diff --git a/splunklib/searchcommands/internals.py b/splunklib/searchcommands/internals.py index 3451deb3c..d9fdf9e7a 100644 --- a/splunklib/searchcommands/internals.py +++ b/splunklib/searchcommands/internals.py @@ -556,7 +556,6 @@ def _clear(self): self._buffer.truncate() self._inspector.clear() self._record_count = 0 - self._flushed = False def _ensure_validity(self): if self._finished is True: @@ -654,7 +653,6 @@ def _write_record(self, record): self._record_count += 1 if self._record_count >= self._maxresultrows: - self.flush(partial=True) try: @@ -755,8 +753,8 @@ def flush(self, finished=None, partial=None): # provide a way to send partial chunks yet. return - #if finished is True: - self.write_chunk(finished=True) + if not self.is_flushed: + self.write_chunk(finished=True) def write_chunk(self, finished=None): inspector = self._inspector @@ -821,4 +819,4 @@ def _write_chunk(self, metadata, body): self.write(metadata) self.write(body) self._ofile.flush() - self._flushed = False + self._flushed = True diff --git a/splunklib/searchcommands/search_command.py b/splunklib/searchcommands/search_command.py index d66de5a3b..ef94f5a09 100644 --- a/splunklib/searchcommands/search_command.py +++ b/splunklib/searchcommands/search_command.py @@ -941,6 +941,8 @@ def _execute_v2(self, ifile, process): action = getattr(metadata, 'action', None) if action != 'execute': raise RuntimeError('Expected execute action, not {}'.format(action)) + + self._finished = getattr(metadata, 'finished', False) self._record_writer.is_flushed = False self._execute_chunk_v2(process, result) From 9052c904a757220da1c73a283137986f039539b3 Mon Sep 17 00:00:00 2001 From: Ivan Jager Date: Wed, 22 Jan 2020 11:32:18 -0800 Subject: [PATCH 10/21] Fix test_internals_v2.py --- ...record_writer_with_recordings.1443154424.42.output | 10 ++-------- tests/searchcommands/test_internals_v2.py | 11 ++++++----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/tests/searchcommands/recordings/scpv2/Splunk-6.3/TestInternals.test_record_writer_with_recordings.1443154424.42.output b/tests/searchcommands/recordings/scpv2/Splunk-6.3/TestInternals.test_record_writer_with_recordings.1443154424.42.output index cc12b13fe..92f5bb5dc 100644 --- a/tests/searchcommands/recordings/scpv2/Splunk-6.3/TestInternals.test_record_writer_with_recordings.1443154424.42.output +++ b/tests/searchcommands/recordings/scpv2/Splunk-6.3/TestInternals.test_record_writer_with_recordings.1443154424.42.output @@ -1,5 +1,5 @@ -chunked 1.0,18,237289 -{"finished":false}_serial,__mv__serial,_time,__mv__time,random_bytes,__mv_random_bytes,random_dict,__mv_random_dict,random_integers,__mv_random_integers,random_unicode,__mv_random_unicode +chunked 1.0,14904,762288 +{"inspector":{"messages":[["debug","\u2b71\ud7de\uc73d\ud2d8\uc3b8\uafe5\u6650\ucc7f\u7666\ud8ff\uc51a\uc679\u4512\ubdbc\ud6bc\u934e\u2932\ue944\u3161\u655c\ua84d\u51b6\uf218\u27dc\ub55c\ubd45\u661e\u5407\u358c\u1a0e\u81f3\uec99\ubdd7\u6ff9\ue56b\u7ae1\u1afb\u0a0f\ud751\u35b9\ueda7\u3680\ua3c9\u8008\ucd29\ud793\udd36\u905b\ua9d2\u0a3b\u8c7c\ua1b1\u113f\u0efc\u0c10\u3cbd\uddea\u7e67\ub9e5\u0dbb\u3c24\uda5e\u3331\ufd25\u8519\ua20d\uada0\ue10a\u8b00\u481d\ua0f2\ud391\u2e9f\ucc11\u450c\uf1e5\u37b6\ud12a\u98f3\uc258\u2138\u83a9\uf4f2\ua2ba\u022d\ue419\u97d2\u72f7\u1990\uf453\u4d24\u2877\u80d0\u0b86\u4bd1\u04a4\uf6f8\u0c89\uf941\u7981\u6705\uec0d\u89bb\u1182\ua225\ua8c4\uf84f\u989f\u4e5f\ue1ff\ua409\uae3b\ucb29\u48c4\ubec6\ued2c\ubfd4\u7a81\ub7e8\u8c58\u958b\ue6aa\u9683\u8abe\u5c15\ud9cf\u115a\u9527\ubef8\ue4d0\u010a\u9d2c\u8045\uddd8\u2aae\uafae\ub6d9\u7fe4\u130f\uee23\u406f\ud18e\ufd10\ua0dc\u6b15\u8cb4\ue0b1\u2d21\ud781\u1824\ucceb\u3ca2\ua7d2\u114e\uc6eb\u2eef\u3301\ub367\ubc72\uc9ef\u3c71\u52a7\ud7aa\ub1d1\u1266\ua4f6\u65d0\u1592\ufda8\u83a7\u465d\u6e0c\u2571\ua67b\u932e\u53b8\u505f\uac0b\u2fc6\u59b1\u1858\u3180\uf2c6\u870a\uec86\ude63\ub306\u9896\u5c17\u0aff\ue179\u40f0\ua347\u5d83\u7008\u8d05\u8b96\u8b99\u615b\u712f\u5277\u41ae\u7d44\ud32f\u5e8e\uafa0\u7b6e\u387e\uc261\u1aa6\ua1dd\uaa68\ua440\u2c87\u0968\ucdf1\ud643\u317a\u3951\u1512\u1358\u8a2b\u923b\u69a1\u6cd1\u5443\u5938\u6ea7\u8726\u64d1\u4890\ud884\uf045\u3fab\u3592\u1389\ue3a7\ua3ce\ub33c\ud365\u90e5\u2ef6\uf32f\u2667\u6576\ufc52\u6fac\uf229\u70c3\u8e69\u5970\ufee5\u6381\u12c9\u3734\ua6e7\ud9ec\ue53b\u009a\u4508\u3170\u3011\u955c\ud034\u3ab7\u8248\uf430\u6b56\u0434\u5bc6\u71c0\u73d4\ued94\u219e\u48a9\u255f\u509b\u6116\uc448\u0e34\u2a00\uabb1\u1d8f\u4f55\uc2b4\ud012\ub948\u37f2\u71c9\u2654\ua560\u596e\u6d3a\u1042\uad3c\ua096\u7043\u045b\ud667\u37b7\ucf9f\u7c04\u67f6\u21f7\ud845\u10ad\u3b3b\u7514\u7571\u56c5\uf859\u7838\u43cc\u9d1d\ufd92\uc008\u0909\uc61f\u0747\uebb5\u93b6\ud260\u32fc\u1287\ucfaf\u07db\udf3a\u8051\u3ed1\uf371\u067e\u5d12\u7846\u1667\u65fe\uf748\u060c\u1d42\u4a80\u9ccf\uc4c9\udfff\u95ca\u2ece\u796f\u1a61\uce85\ucf3f\u21d5\ud753\u0d36\uce43\u257a\u4e94\u9daa\ud94c\ud64e\uf9a3\u614c\ucfb8\u1b9b\u61bb\uc92e\ue359\u0651\u050a\u48ed\u393b\ud7bb\u13d9\ua1fa\u0a45\uf930\u529b\u6510\u54de\uaf5e\uc0db\u5eeb\u3f15\ueb8a\u74d6\u61cc\u0c12\u54c8\u4422\ua31e\u42d9\ue603\u6026\u15d3\u7236\uab0c\ue70f\u4537\u87dd\ud006\ud1ee\ue3f5\u3cef\u5b0d\u1e2a\u2562\u2e5a\ud2a0\u7ca0\u77ef\u7bf2\uccaf\ub20e\ue76b\u41fe\udd62\u0e7e\u8846\uf6ed\u0d01\u4295\udcf2\u382f\u81ff\u3114\uc76a\u8e5a\u9256\u2974\u5365\u74b5\u8291\u6ab2\u720f\u5464\ub512\u00cb\u7c62\u5ca4\u0b9d\u48fb\u8922\uc319\u3f9b\uc6ed\ude05\u9f06\u4f22\u3454\u3e61\u822b\u61f4\uf3c1\u2ab4\ua048\u8915\ud624\u74f1\u3fee\uc189\ueb5a\u0955\u4be2\u7c9a\u2a71\ufed8\ud31e\u5071\u05db\u031a\udf81\uec49\u01fb\ud88b\u1c88\u7731\u9103\ua683\u321f\u2744\udb82\u64f0\u5afe\u4553\u129b\u97eb\u640e\u2e4f\u4bcd\u2629\u7035\ube78\u1e1f\ue030\ud91b\u4e58\u804c\ub939\u4dd8\ue049\u1796\u1b87\u28c3\udea9\u1578\u1fea\u5cc7\u0379\ud877\u1137\u2b1a\u45e3\uc00f\u2ad4\uf286\u883e\ub7d4\u1346\ub53a\uce79\uc43a\u8697\uc100\ua8f5\u8f99\ue8cf\u42af\u1cab\uac78\ua481\u436c\u2832\u20cc\u18cb\u93d4\u1ce6\uf30d\uad7e\ucb81\ucd3f\u9bff\ua36d\u1c46\ucdb7\uf38c\u3be1\u0a3d\u30e3\u2dcf\u2e40\u2a77~\u26ed\u6580\u6f0b\uaa7f\ud05a\uca78\ue4ee\u92c8\u57a3\uc756\u3e0c\u4a13\u60dc\u2bb8\u36f8\uf6f0\u9622\ud65e\u3d35\uea3c\u3aee\u182a\u44b5\uf0e5\u9229\u4dee\u0375\ub87e\udc0d\uebdd\u22a2\uad89\u106b\u789e\u760b"],["error","\u1253\u427b\u42a5\u5c6f\u531d\uc76c\u1a20\uf3a4\u0801\u0e4a\ub0e0\uc6d7\u1582\u2f42\u4c33\u58e7\uf830\u93e7\ue509\ua9b9\u60e1\u6d71\ub872\u0bd1\ue6df\u7fec\u1f46\u1211\u9349\u1cb1\u1abe\u1848\u53d8\uf9cb\u05b3\uf616\ud9db\ud7d4\uc567\ua65f\ucd41\u966a\u5a32\u9f05\u31fc\u1442\u3760\u47f4\u9c31\ue4fa\u39bb\ub837\uc9ac\u2108\u1265\u1393\u91a2\uc182\ub300\u4add\uebed\uf4a5\u6a48\u93bc\ue800\u8742\ufe41\ue2d4\u3432\u89f7\u229f\u0376\u9d8a\u05e7\u7d44\u586a\u99ba\ua043\u97dd\ud85c\u6754\u3c0e\uac78\u78b4\u9b12\uf1bc\u7318\u2c17\u101c\u174c\ub29d\ue9c7\uf6a4\u0fa9\ua53c\ud160\u2504\u11f0\u9f6a\uf372\uf208\u3e15\u3076\u2c89\u37c4\u9a7f\ud782\u3372\u93ff\udaec\u44f3\ud4c4\u5404\u0f4f\u2d63\ua977\u2884\u520b\ufd8c\u2b56\ub7d9\ued24\u4e4c\u920a\ucbda\u23f8\udf02\u5d7e\ud124\u3ea6\u1933\ua440\u7b39\uef3c\u023e\u1fab\ua132\ud4f0\u85e5\ubc21\uf321\u7b95\u0383\u7393\u092e\u112a\u57ae\ub9cd\uffab\u4979\u48e9\u04ed\uc55c\u6656\uf531\u286c\ufc11\uc7cc\u9362\u6516\u0259\u6f35\u0d9d\uea31\u1be8\u000f\u2927\u06ea\ubfbc\ucd92\ubd04\ub964\u0c3d\u0e92\u2f08\u243e\ua4e4\udd00\u55fe\u77b4\ub4af\uf336\u1191\u9e43\u431c\u8a52\u6bd7\u0a1a\u8728\uea55\ufe8b\u6a28\ub73b\ua875\u543e\u7e2e\u2f21\ufa8f\ud911\udc09\ufaea\u35a6\u9968\u4a65\u9a48\ue949\udc87\u33bb\u0f93\ufde1\u5021\uc841\u7736\uadfc\u315f\u642d\ua9a8\u6ab8\u1478\uddc7\ua155\u8cb7\u46ca\ud1ff\uf726\u9cb3\u2c5f\u4d29\uf3c4\ua934\u75a7\ufaa9\u183b\uf2b6\ub654\u9320\u6d4a\ue70c\uac3d\u4dda\u1808\u40f4\u2447\ub741\u4928\u8bdf\uf468\u1baa\u8371\u370f\u2c43\u0af4\uf438\u3dce\u0d5f\u7610\u01c8\ufff9\u04b1\udcaa\u6854\u0cf9\u44f1\udfbe\u79db\u83c7\u5947\u4e20\ua60e\ubb8d\ua0cb\u8e3f\u2b19\u91dd\u922e\u68cf\udec5\u781c\u255c\ud7aa\ub2f4\u8d0e\u91e5\uc5af\uc575\u7dea\u0c5d\u9f2b\ue6bd\u5048\u8256\u3bf3\u0d8e\ud3da\u3405\u37fb\u59d4\u6c47\u308f\u36fc\u7d92\u47a8\u5c86\u3316\u9d00\u1844\u5b70\u758c\ub5a9\u26d9\u49e9\u2283\u1587\uefa5\u5f25\uf45e\ubed6\u8685\uc7ee\u6b7b\u8e27\ua051\uff38\u1dcc\ud620\ub583\ua126\u447d\ucadb\u9adc\udb27\uaa8e\u3e3c\u6dac\u4656\u454b\ubc75\ud0b1\uc2d1\u698e\ufa11\uc90d\u0811\u5065\u4d6f\u7b9a\u7442\ubd1a\u05a5\u349c\u5cfb\u311c\u5094\u52db\u9d33\ua1ed\u7362\u56df\ub1a6\u8aa2\u7e70\ud3b6\u78fb\u66b3\ua882\u60c2\u674a\u5927\u5cf1\u693a\u49b4\ud14f\uf6dd\uf90d\u0b0c\u6e2b\u3027\u3cc6\u43cd\ua999\u2c86\u1024\u85c1\ud243\u69b6\ueb93\ub604\ua887\u6974\u5f7a\ub37b\u8236\u424f\ud692\u87ee\u0632\u43dc\u5863\ueae7\ua770\uf34c\ud24c\u2197\u0a98\u1845\u8d3a\u745d\ue316\u52c6\u455d\u94ca\u2bc6\u9a28\u0ef1\u09ad\ufa71\u2f30\u1bb9\uf990\u9b7c\u26f1\uc1b8\u657e\ub47e\uefcb\ua120\u5061\ub91f\u29b4\u0b72\u68fc\uf025\u0c6e\u46df\u77fd\uad9c\ucf1b\u91f7\u3653\ue09a\u18ff\u828d\ueb1b\u0ad8\uc923\u66a1\u6234\ua683\ua6fa\u2f5e\u30e1\u0e37\u3899\ufbc5\u5259\ufe5e\u5bf3\u0e82\u6e8d\ubc44\ub457\uc6b5\u3859\u711f\uabfa\u1632\u8087\ub7e1\ubf77\u72c8\uad23\ue054\uee27\u3749\u13b7\ucc4e\uc989\ufdcb\u47f0\u2312\ue3b8\u8c5b\ubeec\udd1f\u24bc\uc2c4\u1554\uce45\u526c\u98dc\u1e76\ubce9\u7d99\u85bc\ueec2\u8ce5\u638c\u1e8f\ubc0c\u972b\u0cda\u8c27\udca4\u74af\u1c03\ud7fb\u2aa0\u27d7\ud5ac\u4409\ud2bd\u2465\ufdc7\u56c6\uca40\u1337\ufcea\ua3e5\u78a9\u4d63\u1927\u5919\u442a\u90e4\uda61\u2911\u4b9d\udfab\u8b28\u865c\u64b9\u58b7\u0b39\ue98a\u6cfc\uc013\uae55\u9566\uf3a8\u903c\u16b4\u63fa\u6f3b\u3127\ue2f5\u1db6\u727e\uec2f\u6cc8\ue57e\u3fe5\u3a17\u1ac8\u7d40\u1609\u5119\u8af8\u3e5a\ua70e\ufda6\uacf1\ud5be\u5a70\udcec\u420d\ue6b6\u60af\ua46c\ubd5c\u2d95\u69cf\u57e9\ub508\uf81d\u8b91\u020e\uebe5\u2148\uc6c0\u7b9b\u8f02\ud252\u2273\u0e22\u6f27\ue41b\ua3ea\u6593\u2009\ue7b8\uc533\u3ba0\ud9d5\ua8d9\u3ba9\ubdef\u5e3e\u3181\u0bbb\u7425\u2684\u0f89\u0848\u0bae\u75c3\uad5e\ua3c8\u04dc\u34eb\uaf17\u9180\u5edd\ub971\u9962\uf91e\u51e7\ue92f\uf386\u6192\u5b3b\u7e64\u7da8\ubfce\ud637\u5cd3\u014e\uf27e\u32d5\ud050\uaad3\u7304\uc3be\u9287\ua34b\u8d39\u7bea\u7629\uae3e\u8caf\u6bdf\u8807\u4be8\u357c\uedf2\u0684\ue90f\u5f8c\u28e1\u1e68\u4990\ucc8f\ufffc\u18b7\u2a64\uc6ce\u25df\u44fe\u4711\u667a\ua00a\u759d\u0944\u28ea\uc2e4\ue602\u4c48\u45ae\u7acc"],["fatal","\u9ad1\u40d3\u8b2e\uc72f\u4e92\ub1e6\udc78\uae2f\u5729\ud2ec\ua6f0\ud046\ud347\u2532\u33ce\u9736\u0e4e\uec88\ueb0a\ua83f\uf6bd\u3d72\uc95c\ud565\u9708\u2cea\ucda2\u103e\u5530\u26db\u750a\u968c\u69f1\u18b3\u0905\u84be\u432e\u4743\u165c\ub6d3\ucb6d\u6b9c\u5088\u2b36\uf2d5\u6bb3\udd35\u94aa\u1eae\u40aa\ud85c\u7372\ubef0\u0262\ua0ef\u8462\u89e9\ud937\u7f5d\uceed\u6fa2\ueb2b\u2490\u20eb\u5a42\ub306\u14da\uefe0\ud81f\u23e2\u1a35\u9fbe\ub1a8\u2497\u7479\ue3c4\u82e5\u844f\u37a4\u112c\u4d19\ufa61\uaedc\ufb33\ud1b3\ua8aa\uda06\u9ff3\u08cd\uc0b4\u0b7d\u83db\u35c9\u03b2\u513d\u9866\u7391\u14f1\u2a04\u94ef\u69bc\uaaed\ue7c5\ue528\u6cd6\u37c1\uef29\ue9ae\ud7fb\ucf6c\u2f31\u8f1c\u9121\uefcd\ud1ee\u69ca\u5a01\u5e0b\u9ce7\uf614\u47d5\udb97\u17d3\u14ef\ub7d4\u4f04\u80ff\ucbb0\ucbb4\u077e\ue86a\u088c\u0710\u3a79\ucebf\ueb3e\u970a\ub4b7\u6056\uc68a\uf48e\ufc1b\u87d0\u162d\uad1e\ud19f\ud4f5\uc2ac\u69c2\ud8de\u357c\udd1b\u99c0\ua3a6\u0a37\u3d69\u9cfb\u257f\u6a0e\u9b5b\u3f48\u63af\u2c0d\u34b9\u6ff8\ua3dd\u55f3\uc31a\u4441\ufcaf\u5813\u1160\uce19\u09bf\ude69\u0619\u7986\u0ae0\u7261\uad37\u1d16\uc88c\u25e1\ub664\u234a\u7b01\u5e23\uc2bd\u2663\u7ed1l\u1b94\u2006\u51f6\u5c78\u6b9a\u589b\uf1d9\u8438\ub087\u2713\uc8f1\u4def\uc468\ud9e4\u8ddb\u58be\u949a\u7380\uaff5\ucd1b\u7122\ue19b\u1ba6\u7bbc\u4e47\u6210\uf123\u28d8\u3dbc\u4fff\uae9c\ud3f0\ucdcd\ua348\u22ed\u4a8a\u7ce2\u9bf6\u12f7\u870e\u0dff\ue60d\u154f\u539d\u961b\ucf11\u851d\u2777\uaa52\u98e6\u35bb\u6f0b\u8119\u6043\u4850\u511d\ue2a5\u2453\ueac3\u3a04\u0082\ue4b4\u848a\ubbec\u4f6e\u349f\u6771\u3c81\uada7\u73df\u5a5b\ub510\u8016\u06ac\u4bb4\ucedc\u50be\u36ea\u13ba\u9349\uca8f\uca69\ub347\u85e9\u62e6\u9e88\u604b\u1a6b\uddd4\u18ba\uc783\u9e3f\u86ee\ud30c\u26ec\u2783\ub252\u247e\ubc93\u0352\ua6b1\uf2c1\ube84\ud43a\u2420\u2b2d\ub33b\ud3c8\uf1ef\ue435\u3f91\uc6ee\u688f\u34a2\ud776\u080c\u1621\u7a77\uda72\u5e2a\u0ceb\ua021\u6605\u7338\u67eb\uf0a9\u1fbe\ud7fa\u0d84\ue96a\ud316\u793b\u43ef\ucc6b\ub10c\ub979\u849c\u5230\ufaa4\ub927\u3a5c\u11ae\u2ea1\u4c3e\u3d1a\u1aba\u6f21\ue944\u9dfc\ube11\u1a59\u382d\u5f0f\uec1f\u61b2\ue49e\u4baa\u6718\u81c7\u62bd\u5393\u36c1\u7f59\ud480\u03c7\u9d12\uee1d\u8a6b\u0ea1\u9e35\ub3fe\u242b\u6f1e\u7ecb\u3c1c\uad45\ub186\ud672\u0b40\u079d\uf50c\u5e21\u0209\ua678\u56a6\u3abe\u597e\ufd41\u39c3\u54d6\u317c\u753d\udf54\u1267\u06aa\u4529\ufbe8\u1517\u4f32\ud3bb\uc323\u6a14\uf199\uf2dd\u2940\ua357\u8039\u6036\u829c\u411c\u5ee2\u499d\udc31\u8c46\uba67\u8d52\u2cf7\u8998\ua6ba\ud517\u19d0\u8cdd\ua520\u4741\u6324\ub6ee\ua3d5\u7b8a\u9985\ue893\u11b4\uedea\uff46\u06ba\ue807\uc99a\u82ec\u55e9\u8782\u3fc5\u72b4\u1a61\ub565\ued42\u4b84\u3dd9\uf8b7\ufcf5\ua75a\uf5db\u3240\ub7ea\uf59f\ua1ca\u180f\u840a\ue4dc\ua02a\ud18d\u001a\u0625\uaa5f\ueccd\u13a0\ubfdc\ua174\u129b\u1b61\u855f\u5546\u1474\u850b\uf259\u7673\u91d0\uf260\u93cd\ue687\u7ebf\ubc4c\u7747\ub685\ue6be\uc1cc\u9a4b\ub14b\uc19c\ua4e3\u905e\u88b0\u687d\u4805\ue84b\ud025\u2044\ufc2c\u7ee5\ub4a6&\u83d4\u6d9a\u2d08\u221d\u00cd\u84b8\u575a\u177a\u8694\u858a\u3a40\u0f02\ueb8a\ubce6\u98c3\uf495\uef8f\ubffe\ub6a3\u1bf5\u0f0c\u7c07\u36a9\u46b2\ua913\u7899\u572f\u9458\u62c8\u7609\u205c\u2b66\ue4ce\ud533\u0d88\u3981\uace1\u72a8\u4a0b\u7159\ua17c\ua965\u5744\u11fa\u4bde\u1081\u6fcc\u0238\u395f\u4b58\ud7c5\u237d\uec84\uf623\u56ea\u5bbe\u383d\u24bf\u7b08\u7779\u3f42\u86fe\u25d4\u7a63\ucad9\u3e2a\u11b1\u1c6c\u0d40\u8869\u9720\u403f\u57e9\u82a6\u26b9\u738c\ua5c3\u4687\uec93\ue7ec\u8c78\u04c5\ub076\u4f0f\u97d7\uca3f\u1a1d\u9924\u7b29\ub85d\u7f8e\u9289\ub4c1\ud977\ud5b7\uca06\u5922\u8def\u9a41\u883b\u0b3f\ud540\u3b43\u06f9\ud0d0\u286b\u019d\ud6c4\ub60a\u555b\u6c82\u2601\u1a0b\ub049\ub4b2\ua37d\uf1de\u4c3c\u2ae0\u70d5\u6796\u9596\u242d\u95d8\u3efd\u32a3\u62f1\uf90e\uf19d\ud3d5\u905f\ub305\u9269\u9ba3\u8e9f\u9c02\u341e\uf878\u9425\u60a1\ua4ca\u8f38\u9605\u3292\uf6bb\u3332\u7f2e\ue36c\uf5b8\u713d\ud50e\u8360\u8e65\ueba7\ub842\u940d\u027e\u7ef2\u0c60\ufeb3\uc679\u559c\u9719\u13e3\u9be8\ub2ef\u3bb1\ub11c\u1766\u3db8\u9a71\u5966\u6b1c\ufa15\u18f8\u6476\u46ad\uaa38\u8969\u4ff3\uafdb\udc73\uf7a4\u08a8\uc4bd\u8142\u0128\u787e\u9035\u955f\u50a9\ud0e3\uccb6\uebc1\u13a2\ue0c0\uc341\u5fe5\u0b67\u4eb4\u4a4c\u5b30\u6d68\u8636\u8f23\u6e38\uf00c\ub5f5\ud40b\ua462\ua257\u307e\u388d\u0585\uf745\ubd6b\uf3d2\u89c5\u8786\ue880\ue3ea\ued16\uffcb\ue08f\u4986\u11c9\u3ed8\u46ee\u07b6\uf99a\ud701\u2125\uf723\ua79a\u3a8d\ub2b8\u5955\ub620\uc43d\uce25\u3ff6\uc3f4\u089e\u8fcc\u2d98\ucbaf\u49ff\u289d\u68e9\u1e0c\u7ef1\u9907\uc59e\ud0ea\u3438\ub6eb\u994b\uc3f8\uae71\ub38c\u35ad\u47f7\u5221\ub6e0\ufe3d\ubef1\u46fd\u5160\u57bc\uab8f\ub68e\uad5d\u9101\u6742\uc136\u208e\u6cfd\u61b6\u9ae2\ud542\u851c\ue33f\u16e6\ud391\ua9d1\u80b4\u1e5a\u87e1\u6937\u20c1\ub863\uceb7\u0fe4\ue4af\uca38\ub96f\uc832\u9743\u5af8\udd7a\u6ed8\ua0d1\uc868\u1d90\u2fe2\u1c52\u2d3d\u702a\u1be1\u3a09\u2557\u20bc\ud68b\ua6cc\ubddb\u355f\u531a\ue97f\u45c6\u986c\ued18\u3c53\uaceb\uc3b4\ueb08\ub87f\uc772\u7771\uff47\u450e\u1cf6\ua62d\u8ffd\u17ae\uec3e\ub2ba\ud376\ua4f2\ubaa9\uf8b8\u83e0\ufa47\u1b98\u1dcc\u2127\u8fe8\ud54c\u3681\uc0bd\ufc3b\udbf2\u9f89\ubda1\ucfa5\udd87\u07fb\u50e5\udf2e\u4dac\u69e9\uc824\u0a0e\udacb\u0d18\u547d\u4fa7\u8d53\u12cf\uf94a\ude62\ub7a9\u3a6a\uf0ff\u23ce\uaf6f\u6d60\u5a4b\u6220\u7476\u3b47\u1c97\uee82\ua687\u5b6c\u896c\ubf9d\ua394\ueed6\u4bc1\u3fb6\ue689\uab37\u1066\u7974\u80ed\u26d1\u7257\u9959\u7091\u890d\u0e83\u57ee\u29e5\u4ffd\u6852\u050d\u948c\uf3fa\u5b3a\u896e\u45b4\u439d\u45df\u1d6aT\u609c\uca0d\u4cd9\u6950\ub2d4\ueec4\u418a\u2c5c\u0587\ueeac\u4398\uca59\uc6da\uaf0a\ua2e3\u80d7\u77b2\ufdbd\ua9b9\u2360\u39da\u95ea\u0190\ub7ef\uab8a"],["info","\uffe6\uad00\u167d\ud0ef\uf505\u294e\u6efa\ub08e\u4245\uc402\uc98a\uda36\uc27c\ub3c2\u2a44\ue7c4\u32a7\u6f8d\uce3a\uce23\ubd9b'\u24de\u1374\ubbef\u9313\u8c93\uc6dd\uea3b\u0b4e\u79d4\ubf10\u917e\u52f7\u80a3\ub47b\u7bfb\u1479\uf79a\u63b1\u94f9\u8871\u6bc5\uba0d\u6cdc\u06f9\u5de4\u0ece\u98e6\u56fa\u694f\u1b4c\u3aae\ua3c0\u2747\ue9bf\u3264\u0997\uc651\u3ae9\u343e\u98c9\uba91\u6969\u4feb\u9db5\uc627\ue8a8\ue199\uc03a\ua4c3\ufd77\u09fe\u48a7\u048a\ue790\u78f6\u7d8f\u9cbf\u6f14\uf29f\u11e5\u860d\u90e2\u068b\u224a\u2189\ua5f7\ua157\ucf2e\uae7f"],["warn","\ud420\ue097\u9890\u11d9\u1161\uddc3\ua93f\uc714\u02b9\u2e36\uc6f8\u075d\u5df5\ub660\u355b\u6e43\u43d7\uace1\u55da\u1a15\u20e1\u4bec\ubd4a\ud675\u499c\u2d4e\u5b8e\u4751\uf9be\u808c\u14af\u524d\u82d5\u8d8d\u306f\u332e\ub9bd\u1e06\u94b5\u17a8\u1db5\u26e6\u4821\u25e4\u56c3\u0e93\u0845\ue6d4\uc07a\u644a\u9fe7\u2dbf\u4b5f\ud5c8\ub57d\u6f54\u8d32\u6f76\ue2c5\ud8c3\u2b0a\u3f7b\u14aa\u834a\uf62f\u1370\ubefd\u0fcc\uf337\u5e3f\u9658\ua636\u4ed3\u5e9e\ubd59\u2777\u7e78\u0624\u2d3e\u0dab\u69ad\ue6e3\u9d02\ub91e\u1360\uc609\u9a31\ud6f6\u80ab\uf382\u7f53\ud4a1\ud9e4\ub8df\ua35f\u9512\uc05e\u44ec\ude71\ub438\uf8a8\u06e8\ua1e4\u59cd\u95e8\u272c\ua551\u22b0\u497e\u953a\u447d\uf762\u7ddd\u926b\u2eb0\uc140\ucc94\ue6e6\u27e8\u80ae\uf1c3\u312b\u06b1\u7cbf\ufdc8\ud263\uc229\ud377\u8e39\u03b4\udccd\u3e6f\u2e90\ub043\ub78a\u8576\u97fa\u1efb\ue0da\u7704\uae84\u70fb\u1385\uf6f5\u3e53\ud1e5\u502c\u5cb6\u2255\u6169\uf264\uea5f\uf8b2\u6b68\u7381\uf8e1\u8d3b\u26ce\u471e\u100c\u0c78\u489a\u600d\u634a\u0548\u6e0b\ub9ee\u8696\u4c93\uaf62\u2e15\u7e3b\u94e4\u1525\ud330\u507e\ue431\u6b89\u9e70\ud841\u4271\u620f\uf827\ucb86\u42aa\uc7ab\u32f6\u7f19"]],"metric.metric-2":[5,6,7,8],"metric.metric-1":[1,2,3,4]},"finished":true}_serial,__mv__serial,_time,__mv__time,random_bytes,__mv_random_bytes,random_dict,__mv_random_dict,random_integers,__mv_random_integers,random_unicode,__mv_random_unicode 0,,1443154422.89,,"0pP;O:xwh\4v[""[[/^7mSF#WJ(uj!:MB",,"{""a"":1.2968942978210108e+307,""b"":""\u15cc\u5b7c\ua0d6\uefb0\u2115\u2b02\ubf7a\uf065\u2b73\ua15f\ua77d\u9c67\u9ab2\ub391\ud2f6\uae91\uf460\udd3a\u03d4\ua682\uc81f\uc5ab\u6bbf\u9917\u6703\u42b0\ud71f\ud29a\ucbcd\ub90d\u6bf4\ud076\u5dbe\u3cb7\u3657\u8789\u9a1a\u6a56\u354c\u9b4d\u8492\ud713\ud6b3\u052c\u53b0\u190f\u6ae4\u2fcb\u5c4e\ue7b6\u9a4c\uf567\u0118\u5f80\ub98b\u3961\ued8d\u0d52\u0417\u3d8b\ub643\u1080\u1b02\u04a3\ucd29\uf441\u700d\u381c\u8a53\u6a58\ue042\u575e\u1411\u87e5\u0933\u0a4f\uc3bd\u8743\ud911\ud753\u13a3\uf7e4\uda99\uc089\u0e9f\u6582\u3f3b\u29d6\ue99e\uc642\u8bd8\u900c\u263e\u3adc\u8eb4\ua91e\u1ade\u6fad\uced8\u9bc8\u43d0\u42f8\u44dc\u6340\u9160\u7ded\ub139\u612a\ua962\uaca2\u1f36\u988c\u58ef\ud544\u9947\u9c68\udb93\uea4b\u9b14\u8110\ub12a\u4ebd\ua604\u711c\uf68c\u19ea\ua4bb\uae4c\u41e3\u857b\u7638\uc2a2\u0a38\ua29f\ucb38\u8e67\ufb40\u51ff\udfe8\ud86b\u496a\uef36\u68a7\u531b\ufb6e\u6376\ufd7f\u2e86\u1235\ua375\u7ac0\u6da6\u9037\uc1b6\u886d\uc8c8\u34d1\u6e98\u7afa\uab29\u4ee4\uf356\ua178\u44f5\uba04\u42a8\u8996\ue2ba\ua4c7\u841b\u9682\uc502\ua109\u286a\u1af0\u084d\u22dd\u310f\u8ac7\ub35e\ub40e\ue06f\u751c\ud0b4\ue290\u0a17\u2c92\u8a2b\u0789\u4590\ue673\uabe2\u094f\udcbc\u5eaa\u325c\u6adb\u472f\u7eb4\uab38\u8903\u7d5c\ua267\u109d\u8918\u159e#\u8499\u4fc4\u01a4\u9298\ua4d6\u7ea0\u7191\u7609\u23a7\u3d69\uc95b\u4c93\u26f4\u77ea\ub420\u3b5c\u6f10\u29b1\uc189\u089b\uc756\u549d\uf564\uf749\udaf7\u92d7\u9192\ua158\u40af\ud0bb\ue009\ua2c5\uf595\u7b5e\u03b4\u2f04\u87bd\u30c9\u9265\ue00e\u61f7\u44ee\u86a2\u9a6b\ue383\ub205\ub10a\ua355\ua04f\u8c44\u152b\ueb19\u6347\u1d73\u4bcc\u6378\uddbc\u743f\ucc7e\uc8d5\u640d\u3656\ud871\u61e9\ue33a\u0856\u62a6\u836d\u93d8\ue816\ucdf2\u7118\ue4d9\u4282\u126e\u1625\u4255\u540b\ubf41\u8a81\u18f4\ucc39\u9b30\u9360\uc62e\ua028\u734d\u332f\uceb1\u6202\u1557\u976b\u0591\u7302\u57b9\u4274\u1d19\ua75e\u7ae4\u31c4\uaa3e\u5b49\u8868n\ued31\u51ec\u142d\u9450\u3526\u1378\u86cf\uadc7\u2ac7\ub975\ubd00\u4c89\uce0c\u20a7\u2db2\uecd4\uc311\u776a\ud331\u9183\u7df5\u09e3+\u934d\u79e9\ud87d\u2e64\ud4f0\u668f\u10f2\u871c\u99d9\u7c30\uf3b9\u5ff1\u5b0f\u9dda\u639e\u1ecf\u0d61\u6a4c\uc6a1\ua28a\uc75d\u9308\u6002\u8814\ud528\ueb78\uee07\u150c\ua630\ud774\u1429\uc805\u502a\uccd5\ua070\u6d11\ue81b\u4601\uab84\uc4dd\u60cf\uefca\u3129\u8bf5\u38fd\u9b4a!\u98d9\u24c8\u564b\u141b\u8e0a\u2f8e\ueb1f\u9311\u5462\ua5b4\u7a4e\uac7a\uc57f\u316e\ube3f\u4f56\ua52e\u3de2\u6bb0\udc3f\u4501\u731d\u77f3\uf6d0\ucf21\ua10c\uded1\ucb51\ufcdd\u9c80\u092f\u7e1c\u8177\u2144\u0610\ua3a7\uc0b7\u20fb\u13ec\u5f9f\uefc6\u9deb\u7741\uebca\u853e\u5903\u37d8\u0c8b\ud7a3\u1de9\u074f\u2f21\u950a\u04fc\u3279\u73b0\uda85\u1955\u6cad\ub5bd\u445b\ucb0d\u7a89\uec0c\u74aa\u108f\uc10c\u4d51\uc945\ud3b8\u3d23\u7cd5\u311a\u44a4\u3199\uc6bd\ubf6f\uf834\u59f6\udf22\u17cc\ufcf3\u7f7e\u98d4\uaa0d\u5466\u438e\u9ff0\u517c\u84e1\u7c6a\u044d\u6071\ua143\uf64a\u58c2\ue1f1\u6988\u01c0\u7e9e\u3183\u7547\uad04\u0c0f\u7981\u6c50\u4e96\u5fbf\u39dc\uf797\u1d4a\uefb4\u33cf\u84f8\uda08\uc5d3\uc54c\uad11\u4eaf\ub34a\u49c8\ua717\u2ec8\u4111\u5315\u5574\u06ba\uc09a\ud5cd\ud4ea\ue641\u83f0\ud020\ue73e\u873a\u1da1\uc69a\u7305\u2df8\u251e\ucd5a\uac85\u38c6\ufe6a\u8bbe\u345a\u043b\u0ae9\uba46\udf56\ua97b\u3d2c\u7cc3\u125a\ua34f\u6a28\u287a"",""\u798f \u9152\u5427"":{""fu"":1.2438074480626057e+308,""bar"":4.0438309149640735e+307}}",,"4200010286095744000 -79571214356433920 -3170588095685636096 @@ -4595,8 +4595,6 @@ l 1210179905758432256 1141215342399602688 -3880726647432727552",$4254677265955351552$;$-3278967839183033344$;$1095053897811201024$;$-1461220706224117760$;$2874075141657677824$;$2198261908299204608$;$-4090972845302793216$;$-979321288355396608$;$1555253375519851520$;$-1330981345459324928$;$2390979766941747200$;$-2547949188179918848$;$-798349369508915200$;$-4584665965760536576$;$-631217269556945920$;$790994848793819136$;$-3292015071347274752$;$-1095373714185022464$;$-2658536572979284992$;$-3395385354301297664$;$1591083580236333056$;$-1216965427854953472$;$89157934633715712$;$-2040633111952643072$;$-2057014102036543488$;$-1118673239956006912$;$3715067134115388416$;$2467147072612097024$;$2009325729649772544$;$382104304900268032$;$-346889285817417728$;$-1435664121415141376$;$1641054803074410496$;$839578214834488320$;$-2588886021934640128$;$-4542877417974082560$;$2812675173916209152$;$1201906490943030272$;$2257431531439555584$;$1368106746276730880$;$4549413097371716608$;$-3335208727090267136$;$-4428655578102525952$;$1530941959374427136$;$4303325895450736640$;$4593073574498477056$;$-1323071460167786496$;$2016838339774851072$;$3394661872488026112$;$1577907303233685504$;$3498474695397552128$;$-1851725795302644736$;$-570835640034738176$;$3019588515318900736$;$-2653542310303600640$;$-2604787378286464000$;$-505494242168783872$;$603890221725215744$;$-2697447474166577152$;$-1324174827157528576$;$-3939120325196779520$;$3221842789362113536$;$3450045506650081280$;$-3085415144472945664$;$2844767850120931328$;$-480357954359296$;$-3627161930907376640$;$-2643792500309282816$;$-4203378301050242048$;$3838096347590449152$;$-998967334488296448$;$-317841742843261952$;$2920962161798350848$;$4570760113962682368$;$1312887172374955008$;$3885641510643298304$;$4233307202806694912$;$-3012362293223967744$;$3167245083470391296$;$2500942194558134272$;$-315111054027939840$;$237543331611081728$;$-3999102932559256576$;$-1141382291530525696$;$-1526394099069128704$;$2352356396177900544$;$-1168838822762099712$;$-354746841509020672$;$-2541873829172502528$;$-965727991456326656$;$-311410848497044480$;$705453332713840640$;$1492599881540529152$;$4479916310441965568$;$2716154159942166528$;$-303452988574282752$;$-594349156021116928$;$341158927843047424$;$3393126723069275136$;$290336864458511360$;$-1683639972835714048$;$393458920544302080$;$977830132378643456$;$-1741267446607932416$;$-1125989223784035328$;$-3161194173701813248$;$1383932831831526400$;$-185858563731879936$;$-619177045600068608$;$-319688796495815680$;$-148118319752223744$;$-2181889039421988864$;$-1798869353710729216$;$749360210725292032$;$-52408264759950336$;$-940604390282982400$;$1390737596831897600$;$4218792006351753216$;$-1518811638397486080$;$-535053535372843008$;$2896937319166113792$;$588850925878534144$;$-2107583507050101760$;$4014091361826212864$;$2916698469345811456$;$1951932407489913856$;$118873251955217408$;$-1139979210213329920$;$1302446376933635072$;$-4093818941627415552$;$-4014963002715051008$;$4336409833389136896$;$2410489568254102528$;$692157898271000576$;$-2171303002617470976$;$-652828819998383104$;$-2446775767529470976$;$-831596048294830080$;$-3036568121844647936$;$-4099857299705051136$;$-1748100335062065152$;$2058836702618380288$;$1657210566250067968$;$3941099743276361728$;$-4185275790028241920$;$-97232344121799680$;$-3499135005960154112$;$-1651762638239210496$;$-3997211402177012736$;$128882286945541120$;$1463295298046387200$;$317571343985294336$;$607096525261543424$;$-1754794603762570240$;$-2094529167945345024$;$-3809632162340091904$;$-474511039345931264$;$3158814853021989888$;$3114532317095864320$;$-2604749572578583552$;$2805410973604061184$;$-2662711593375478784$;$-1391279026896055296$;$3259757490990564352$;$-1581486637833614336$;$-4046553840254213120$;$-540428293428459520$;$3122138026614557696$;$-2762426856152012800$;$-3745051934640835584$;$-3557887300080657408$;$-1972046377517533184$;$2242640369282731008$;$-4221055586465870848$;$3252335673018686464$;$3863328616552477696$;$-2775978052432394240$;$-4450630360568581120$;$-811451549629941760$;$-1049522102198036480$;$-199603877556546560$;$-4079316740615470080$;$-2741818040691208192$;$-716266207917224960$;$583397754173418496$;$1544504934707960832$;$-3054732623003497472$;$-871210473440047104$;$2889612906310889472$;$233070762224941056$;$-917211689123517440$;$542509028418924544$;$-4518463588811642880$;$4313832993390697472$;$-1587336021219565568$;$3639686809387892736$;$3094674335397931008$;$-2501134013383326720$;$3134354127897529344$;$3273083408434320384$;$1415376443455564800$;$843040249959065600$;$-2808809376405354496$;$-1718023579167566848$;$-1956333184359260160$;$-3175545429030867968$;$-1764892903120506880$;$2032291074225981440$;$-712609431856651264$;$2159765118750071808$;$-2376203724425402368$;$-4325489076609137664$;$3364588376642424832$;$-2012887603766548480$;$-3759432487227607040$;$-3952464483692864512$;$1571034735280196608$;$4501352486205831168$;$314324257874365440$;$-2379090579535885312$;$-2430544123593043968$;$-1812676012190221312$;$-2572325444880340992$;$-236871385744413696$;$2000813827436053504$;$-2926943912768563200$;$2565938855190333440$;$2059790068344283136$;$-1110893231558197248$;$-3216879847890564096$;$-4488453208247255040$;$195037170542662656$;$2078491979538355200$;$-352740751523433472$;$2092021441774430208$;$-1921662900374040576$;$2206083862913969152$;$-3231439895078589440$;$730349509515421696$;$-1292834461765485568$;$-4539961203776282624$;$-361128587063154688$;$275805038942754816$;$-2536081772288787456$;$-3653690332825760768$;$4041131065922513920$;$-3724551345725943808$;$1328036417321675776$;$-2257950520749260800$;$1280090100955892736$;$2205207787759245312$;$-3976771743523582976$;$-2057131779381775360$;$-1164109764739914752$;$-2492752697104896000$;$-1594392650577743872$;$-4437284793297515520$;$-2519540760248463360$;$-1321080590665975808$;$-1718974135774153728$;$-703409600625948672$;$1200887553244944384$;$-150187502638683136$;$4408565657682225152$;$3999156566742699008$;$3496653132743328768$;$-3497105380376271872$;$1962204030365357056$;$363459673379707904$;$2765577856684478464$;$1152057807306536960$;$2251862684723419136$;$2203274220244849664$;$-4001254493906380800$;$1208970698929547264$;$2982216187500237824$;$3838450901202033664$;$-4096436524515470336$;$3692972105743032320$;$-3029979320170488832$;$2256934774147117056$;$2731747057631066112$;$2817003598553373696$;$1876349954500562944$;$-2740272965912396800$;$-2939244164367629312$;$-2519370982178209792$;$-4120877272875228160$;$-1368321567717026816$;$-1396248014465326080$;$-1458994917253981184$;$2746561544524414976$;$3256684114288878592$;$-4257780547826494464$;$-1669838029725976576$;$1370017071208621056$;$2186189725366865920$;$-3556258013301755904$;$3117840452678910976$;$3056715991008479232$;$-2261706735199284224$;$-3514095230124380160$;$-3071466748435736576$;$2444027752904851456$;$1881200211903237120$;$-1362067747215352832$;$-433309072010566656$;$-1266719328749578240$;$3546959235875405824$;$857530682442600448$;$925992010608994304$;$-4605440320697524224$;$92906054188065792$;$3384287343174632448$;$1212845466998929408$;$-4352084481918223360$;$2617031792241653760$;$249664507896994816$;$678509485963235328$;$3772873710788828160$;$-4227509232197906432$;$-2531950203656817664$;$4399896361808061440$;$4332821500175590400$;$-3888221197882389504$;$3308245539468065792$;$3595198478569183232$;$1154131560998507520$;$3970599042616344576$;$-3503126964455568384$;$-1457595241164083200$;$-3241986442731803648$;$3550870884293351424$;$-644550027108666368$;$-4377883813498544128$;$1440616168361109504$;$3491195772841542656$;$-1190327388033965056$;$-2727683184130538496$;$-4027957169474352128$;$-4138796140514881536$;$-907731078572628992$;$70140658007075840$;$2242753100914432000$;$-4132224789551182848$;$1720383049510241280$;$4128918805961032704$;$-4395388852002869248$;$938510008742896640$;$2632643744880781312$;$2784044483654225920$;$-2856249527921222656$;$3489451028534928384$;$-4560101855260802048$;$-2376542901474267136$;$-2873599099461267456$;$-3764416140081913856$;$-1009431945345722368$;$-2834024317984728064$;$-4155565964097536$;$2283954502976757760$;$1968503551151424512$;$791635529421872128$;$1210179905758432256$;$1141215342399602688$;$-3880726647432727552$,髢㟙₏큌Ⰲ턢㼘薔ᶷÂ㒔睍⭈⢩⁧橎綻ុ懤ﶨ鵇ⲃ蟩ᩲ衶ɒ߼⻢궇螕鉁䝞뫅刹푡〛╷픐榓宵淞⼠ﲒ틲琋㢺╅鄈郑趎胏බဤ⇢腧쀂쵡䅝跓猉䝪셜舧톧ͳ塤鸔槵疛㚔軦궕㗉ꆑ놁ᝯ⒭떦ֈ烢ឲኯၨ珙囩ꮪ菺⛜럂 ೟呑녫䦰㣑㨪㒠䚩핋∌쑹苖䳬嬭ꎆ秸澞적⻗☊䍿튮넢䎕孑﫟轀揂逃œ쀿诲支橴ᛐ縚爃≙⒒뽠ꌩ㸧씱﵂쎦ﶞ즛䶿훑藍丌諍匸҅휻芋詈꽱-⛿陋﵆펑㵰㹛圛责ᜥ䞾ए䭽裉뚂猧쿧⎞餻ㄠ㈻fl䮘誛㧩鼢گೌ蜺䬓ࣲ윜惋曩늜䑪᪰筌테뻘朹痑봱劂ᜮჃ⟸t쯕違툊὚♞벓癩龘⢺ڦ럤洸齬∰ᨛ뼹꿫甃㠘幍긖ꌵ륲ᄆ⿮侶斧Ꝝ렦ﲼἫ﷭댪ﶻ뼧僰챜䃿樛橜殴緼뱻䙸誈쐅ꡠⲛ栏⥑脌箟큟䌩㊧⸙ᮀᖑᮧ电嵻Å䒢俬예५㋎䖿|ᐱ棩刯뉃ꠗ賓콅⨨䶉缴鮄툃拞臣⟇뾝꫊绌y涌꜒쀻द䝽槃걀䜓뗧㿧遅Ṛ슑⺐ꪉﴖ䦢뺗㜝娭㝣, -chunked 1.0,18,262514 -{"finished":false}_serial,__mv__serial,_time,__mv__time,random_bytes,__mv_random_bytes,random_dict,__mv_random_dict,random_integers,__mv_random_integers,random_unicode,__mv_random_unicode 10,,1443154422.98,,"/n-0 ( &iJ$l*L-g/l1yK程3NĮZ|f>M:W~I+lM,YeYĠQ:x+ܴxo+(i=|b(/ ɇG ߽\sP0X[[8`bjNH6f3fzBCn",,"{""a"":4.544125131002947e+307,""b"":""\uda9c\ude59\uac67\u17f8\u13ba\u4eba\u8e32\u06c9\uf879\ud82c\u900c\u7252\uddca\u63c3\uab4a\u878e\u2194\u5d77\u6c4b\u67dc\ufa9b\u3079\u3967\ub665\uf821\u465e\u8fec\u55c8\u60ce\u2e20\u5e78\u8341\u9e92\ud18e\u4252\ue637\u203a\u3eb3\u97d9\u099d\ua4dd\u655c\uebd6\u6e6d\u37ff\uf926\u2690\u16d0\u9d78\u8282\ufe59\ucc85\udc06\u5437\u8527\ud15b\ue22e\u1ff4\u2397\uc025\u6ff7\u20d8\u785d\u9a38\u9446\ua1c0\uaf32\ub973\u110d\u3aa2\uf163\u1f15\ub622\u1e08\u307e\u9bea\u345a\u69f2\u22b8\u8b1f\u2f00\u06da\u565e\u3b8a\u309d\ubae0\u1a95\u5c52\ua6b0\uebef\uffae\u0931\u0fc4\u1377\u45a9\u4d13\ubb93\u5126\ufcea\u21b6\u5b23\u9637\ucb55\u0afd\uf601\u82a9\u5e65\u0c50\ube81\u176b\u1bbc\u9725\ueda4\u9dd3\ud05a\u44bc\u6a35\ud3a3\u55c7\u0a47\u0d55\u2eec\u8122\u57d8\u7e98\ucb74\u080a\u2d75\u04ac\u940d\ud969\u0529\ub436\u0de3\u79c7\u30a9\u8a43\u0b51\u6948\ud70c\u080f\u8cdd\ua697\uc83e\ue4a2\u510d\u647b\u0efc\ud90f\ueb11\u4c68\u89a4\u0b41\u8e62\u4209\udf4e\u2eeb\ubc5c\ud8f6\u366e\u3174\ua254\u9d71\ue161\u2cdd\ue8cc\uce7e\u36b7\uae64\uec4a\ued7d\u0d05\u245f\ueab8\u25e6\u6298\ub724\u989d\u8eb2\u2dc2\u97cf\u459e\ufd82\u717a\u3510\u1e43\u3077\u0756\u657b\u5f1a\ud217\u3eb1\uce22\u7f2c\u385c\uab1b\u5b50\u5553\u0ec2\ueeca\u8400\u2069\ufff0\u1be7\ud25e\u3ac9\u7ee3\uf679\u8f92\u51ee\u9af6\uc8b7\ude4b\ucc45\u8f01\u841a\u84ae\u9a0d\ua65e\u1897\u94a0\ub55d\u254f\u88aa\u660b\u7221\ub59b\u3395\ubc48\ueb7c\ubbff\u2a82\ubf8c\ubd46\u2bc2\u2502\ub82e\uf5b0\u6507\u191b\ud3e0\u228b\uc29a\ue05e\ub632\u97b7\uc8c8\u4e2d\u6497\uc3c7\u2fba\u2060\uc87a\ua796\u7204\u6429\u8053\u9ae7\u40da\u3223\u95bf\u6126\u4396\u6286\ua1d3\u8608\u79e3\ucb51\u6808\uc495\u7d07\u50b2\u2111\u3ba2\u576c\uca01\u5a1c\u0451\u0157\u5e34\u78c7\u7cd7\u3f87\u0921\uee09\u0543\u7ae2\ue843\u834b\u2808\uaa0f\ua177\u02f4\u38e9\u15a8\u86f7\u3086\ue4c6\u8421\u1571\u8c61\u8e83\u1d80\u6e10\ue7b4\u603a\u1ec9\u5524\u4b29\ud4a2\u65d5\u6964\ua89d\u957c\u8ef7\u7cb2\uf555\u61e7\u0121\uf421\u6cd8\u3ee4\u8fb5\ud1b1\u75f5\u774c\uce8b\ufb8c\u49c4\u51a7\u13cd\ud3ac\u6b4e\u8a6c\u8685\u9d7f\ufa71\ue38e\u8a45\u6535\u8727\u2b8e\u4a48\uffba\u61a5\u4eb1\u1b61\u6cca\u0200\u6e23\ub3c7\u3682\udae9\u01a6\uf270\u8dcd\u1543\u4f88\ufc46\u17e5\u60f5\u55ca\u6e13\u80d0\u9165\u4446\ufbc5\uf150\u26b6\u6251\ud4d9\u07f7\ue0be\ua554\u1eba\u167c\ubfdd\uc8bb\u8462\u9f69\u3661\u415d\ucb9d\u1f4f\u646c\u85c1\uc277\u9d1b\ud179\ua659\ub7a4\u4c78\u1059\u69c4\ud4af\u9fb0\u83cd\uc079\uc187\ua704\uf786\u8701\uf8df\u5169\ub449\u2f6b\u1ead\uf6d9\u1bf5\u22e0\u6822\u6f12\u5a74\ub6cb\ud93d\udd87\ub31c\ucfe1\ud18c\uf19b\u9dab\ubbdf\uc7ac\u3e0f\ucca0\u4866\ub12e\u9df1\ub6ac\u480d\ub829\u20c3\u7c42\u9a1e\u6a3b\uab56\u76ee\u7744\u9d90\u429b\u08f9\ub6cc\u0bb4\ua083\u72d3\uea6c\uf5bb\ua0db\u340b\u9690\u88b1\u1a73\u60b1\u28cb\u254b\ueac9\u739c\u32cd\ud9fc\u153e\u4762\u5947\uedd7\u3a5c\u8ace\u3910\ua6cb\u505d\ucb83\ueace\u7b80\u6fec\u7c5f\u6117\u17c6\u46b4\u0377\u3515\u5056\ub8f3\ub905\ud5b9\ub662\uf6c3\u194c\u8bb1\u2809\uf519\u8db5\u8b86\u3c2c\uc526\u798a\u1828\u98ee\uca8b\uc714\u6b1d\uea1e\u9ecc\u2418\u541a\u3bab\u60ea\u65d6\u58f4\uf44c\u091e\ucfcb\u48fa\ua3be\uaa72\u0895\u930c\ud49f\u0a6f\uc306\uf9f6\ue07c\ue4d2\u5752\ue88d\u15d9\ub5dd\u76c9\u5a21\u0979\u5605\u3da0\u8e79\u7941\u6448\u7f38\ua6d9\u91f5\ubb3e\uc320\u68ed\u2665\u05c0\ub82c\u0c35\u713a\u765d\u0a4f\u3723\u96f3\u3274\ue893\u16a7\ufdbf\u143e\ucf77\ueae5\u6a55\uf211\u5393\u64d7\u5604\ua4aa\u2a90\u6c4e\u0691\u918f\u042f\u8e49\ub4bf\ucb29\u01a1\ud806\u21dd\ucd6a\ued81\u96ff\u345f\u81bd\u4e13\u873a\ubc53\ubae1\u8028\u08f4\u5072\u4bcc\u8ac6\u6bd0\u62bd\u7ca4\u488a\u87ff\u6bfb\uc5e7\u3edf\u370c\u3564\uac11\ud41c\ub1fd\ud664\ud68c\u7dee\ud934\u22d1\u598f\uc79b\ud163\u603b\ud2b9\u87b4\ub497\u960a\u1d3f\u88ab\u4048\u7c4b\u20b9\ue9df\uc97e\u09e9\ud878\u066a\uccb6\uae77\u0e93\u206f\ubf15\ufe5c\u7e4c\u6c62\ua8db\u3dad\u6765\u10fd\u2aa6\uc888\u7ba1\ue92e\ue54a\uec0b\ud13b\u05ce\u6ffa\u6d50\uc58f\u056e\u9ba2\u1361\u7c05\u2d56\ud5da\u0d36,\ub302\u4179\uc0a0\ub53c\u29bd\ud8d3\udeaf\u8aeb\u229d\u38ee\u9036\u5529\u669b\uc929\u2914\ua761\u2e4e\u9df7\ue413\ufd68\udb17\u54de\u9662\uaf4e\u5c06\u144a\u11c7\ue8bb\uafb7\u8e4b\u4dd0\ufdeb\ub824\u9e39\u54fb\u7a94\u1dd4\ucc2b\u34a2\u0b73\u013b\uf974\u377e\ue244\u2a71\u2c32\u10d9\u01b0\uaa00\ucae1\uf93e\uf629\u7ea2\u4a26\ue963\u87b5\ufd7c\u964e\u9054\ud57c\u45c6\u2ca1\u160e\u4834\ua641\u3f54\ub1d0\ufcce\ub49e\u238f\u657e\u5828\u4987\u02d2\ue4eb\ua562\u9ca3\u1a75\ua8cf\u06a9\ud458\u3382\uf2a8\u64e4\ucfbc\uc120\u9e56\ua839\u6add\u08db\u0227\u541f\u15d8\u47a6\u9e84\u231c\u381b\u2cce\u4b4e\u3e13\ufdd6\uc9c4\u645e\ud7ca\ua7fe\ucd8a\u3d01\ub56a\ua51e\ub96b\u1099\uc056\u0ca9\ubb64\ue4cc\u0a5c\uaf40\u709e\u0c9e\ud6b5\udea6\u60eb\ufbae\ubcfb\u8b42\u0d81\u4cbd\udcc5\uf333\u1814\ub506\u17d7\ud4ae\u70dc\u1e17\u3104\u5a33\uab34\u53c7\u1a41\u8d38\u4984\u454e\ud6b0\u0980\u91e0\u60fe\u7405\ue831\uc23e\u72ef\ufbd7\uf281\u5cb3\u6213\ue61b\u81d4\u6995\u158a\u8b1c\ub856\uf991\u498d\ue7a4\ucdd3\u8062\u0ab9\ua8ce\ue5b9\u7e64\uaa3f\u8845\u3873\udd52\uafe6\ua75d\u88a5\u8542\u2571\u1dad\u11b7\u9574\u1d57\ud4bd\uc5b4\u81a1\u52e4\u7fb6\u3458\u3d8c\uc609\uacaa\u8b20\uaca4\u3fcb\ubda6\ua9e4\u25d1\u0116\u3ff5\uc4ce\u6632\u9341\uca0a\u1b86\u4adf\ue79a\uce55\u33b0\uc8a3\uc3d2\ua342\u431c\u0bff\u1b13\u85d6\ud36f\u0c70\u55bd\u278b\u6dd3\u6491\ucc7b\udc67\ua832\uf7c6\ue106\u3cd2\ue920\u0ff3\ub98e\u6630\uda3c\ueccb\u6953\ua708\u064f\u2cbd\ua56e\u2b31\u1396\ufef1\ucd01\u449d\u031c\u54a1\u017f\ubca3\u1c16\uc916\uc6bb\ua498\u8444\u6167\u4790\u7706\ufe24\u1137\u4775\u6782\u78cd\ufab4\u4ff5\ub220\ue219\u6816\ubb6d\u277f\u96f8\u7b25\u80d3"",""\u798f \u9152\u5427"":{""fu"":1.4388712362567243e+308,""bar"":1.7043160172242623e+308}}",,"-2035729262749710336 1373395015849669632 @@ -9712,8 +9710,6 @@ V -4134033655142636544 -294632905142094848 2216732253638341632",$1421327138948474880$;$-1140887654075042816$;$-879351159762683904$;$3193855156771011584$;$-4034374747235260416$;$-3370031271489326080$;$778216745979750400$;$4396462882544762880$;$368405136507768832$;$-1238543346163264512$;$-122612262709370880$;$2976091231830341632$;$441325038389084160$;$1485817394935018496$;$4323199162590489600$;$-4037769014778303488$;$-3914849187108599808$;$-2588155685234208768$;$3353095591173037056$;$4347620977843014656$;$-1926493201059141632$;$816862873936190464$;$-4272335098658646016$;$-4566745798712800256$;$-1950670483214026752$;$1940244860416751616$;$-1941240748985590784$;$-2210678345176736768$;$-2689814191543884800$;$3163170294030431232$;$1108563013877786624$;$2964028533159285760$;$3918605051478447104$;$3127073606859886592$;$3795113429848902656$;$-2962687069926568960$;$1362150599293948928$;$-1298719621402241024$;$-2015954421255373824$;$-2031907732442721280$;$-3091200013702226944$;$2380859603876680704$;$3028523440118868992$;$2346108302045075456$;$-1797298120757806080$;$1733685186450448384$;$3247166417687272448$;$-2540134332367431680$;$-2079503953364651008$;$-2805056109328431104$;$3902302490001065984$;$-3014524505563925504$;$-4246641823707667456$;$487251678327146496$;$-1131499611685721088$;$-2119060853536012288$;$1325763975252065280$;$-1957223258003200000$;$-1985630162658400256$;$2170149397894377472$;$2983535442665971712$;$-2818688015757940736$;$3129412551164221440$;$-4212988447005250560$;$2648614947998005248$;$781402860015277056$;$600732801433416704$;$3419343911737160704$;$-3055027374292338688$;$3182354688390222848$;$2305836625286507520$;$-3218269144744392704$;$790393491960784896$;$2311052728986507264$;$1970682899362828288$;$60453400640025600$;$2852671516982125568$;$2835119887761965056$;$-3962350930525758464$;$1569799678327513088$;$-1670577189115057152$;$-334916179545630720$;$-4181612486599929856$;$-3471423927856160768$;$-2629460054978117632$;$-3260003920459275264$;$2555009503173516288$;$2465457180119688192$;$2758402079737627648$;$4348657304286088192$;$3324171041105410048$;$10163581216776192$;$-954855537052424192$;$3253747304951853056$;$-126237916014178304$;$-2868701407192455168$;$-4586272960638999552$;$-1569626108632080384$;$3737562052979457024$;$-1681417622656224256$;$-3950609883856059392$;$3348223658985412608$;$4192449222882156544$;$-3802419744510102528$;$-2313186716870800384$;$-4076916203635915776$;$-1260902544695405568$;$-352821647668030464$;$871794162179848192$;$3739940502508009472$;$-420025051059920896$;$-1449107049150940160$;$672651163514433536$;$-1576502958299645952$;$3576575301708905472$;$-909053253378396160$;$-4055587652357478400$;$1407462977636082688$;$762244139767168000$;$3365002281103932416$;$4561778168930439168$;$-1518144487706923008$;$4408462720715332608$;$2614246849122762752$;$-2781994558365573120$;$2150988415001846784$;$1260229189627711488$;$2550371043159028736$;$-661086159298860032$;$4050363194991040512$;$3188123172351708160$;$1447217551965451264$;$2841257679397824512$;$-3660835067723984896$;$-4213008354448362496$;$3577834754346183680$;$1858314116575867904$;$-1937118476519671808$;$454557864041399296$;$537501831119399936$;$-674374032224053248$;$1941506250033343488$;$-451413236350240768$;$46474582312626176$;$-894549610791018496$;$-1565034380050248704$;$-2661521388599889920$;$-869429060882565120$;$-4569994239678629888$;$204394772292202496$;$3682799970170963968$;$4251631450445535232$;$-2079415054926733312$;$3758060853922566144$;$-4110416695621628928$;$3355896336313488384$;$1280732522464008192$;$-1980511777661161472$;$-3836569749475946496$;$2637137034194966528$;$-3864349345875245056$;$3845621577446452224$;$1782759126086070272$;$-1449577998962806784$;$2202795918227727360$;$-4512235976153096192$;$-3916274613522401280$;$1132636606751075328$;$-3834222991212920832$;$-1538598995589602304$;$-574747871663290368$;$3007781179383220224$;$-2967065265653231616$;$-2560663660162910208$;$-2728497612510011392$;$-4423258469802146816$;$-4258120965355765760$;$637721233053483008$;$-684953053069402112$;$4316981690601036800$;$4138146034399861760$;$-4201643567875196928$;$2211190128782983168$;$1433060056861194240$;$-1897867291392364544$;$1230636252729124864$;$2871406293472585728$;$-1730718930363536384$;$2746193363527737344$;$-4207456003804835840$;$2765658396876372992$;$-23003745043602432$;$2196612403831812096$;$-2931073951468066816$;$-1473043457490569216$;$-4490813741534342144$;$2914959353416125440$;$-82307467140918272$;$-1929721313745159168$;$3679020938620531712$;$-202017710730084352$;$1383144923308638208$;$-462535381233948672$;$2925601457335481344$;$-3341977294715367424$;$-4100199112296276992$;$-4074232771113539584$;$-1930152446275529728$;$2475694552060019712$;$4318169662416806912$;$-290919221440296960$;$-3369990006053024768$;$109577639609733120$;$1333263140390993920$;$128708951444318208$;$-4363507284957668352$;$256628373090242560$;$-3375099615675837440$;$-3305713604460206080$;$2065633348257780736$;$-4379244189912055808$;$616749784129158144$;$3955345369549465600$;$-2220533978543428608$;$3468620904416830464$;$1887730014038705152$;$-4593475848197218304$;$-919732770080775168$;$-4275419700582497280$;$-3752647425978555392$;$1763569639829359616$;$4508538590076242944$;$3564599328662211584$;$-4147104335698712576$;$-1878488308973492224$;$-2431318249537144832$;$1341739016734131200$;$1209065538966347776$;$-2248566414779759616$;$2245527445111983104$;$1471482675078028288$;$1291690962506341376$;$3089956361522403328$;$3168756233741703168$;$1204257705479642112$;$-2281939595761001472$;$-2581679898276558848$;$-2372339446566946816$;$-3306231595642304512$;$-3091229306133668864$;$-197443248729368576$;$-1552694712181621760$;$-1885341555970078720$;$-707110752983435264$;$3848939632838318080$;$2000120061018009600$;$-2264914062553436160$;$-3373296000062900224$;$-4061873653057952768$;$-841664938185342976$;$-685955673892972544$;$-3570672522591418368$;$843196382853996544$;$3377985259981668352$;$3110921824696224768$;$3350293562353055744$;$-2555558102910000128$;$1194319125129198592$;$158541206325933056$;$1582332699009885184$;$4399614800377925632$;$4192636476372562944$;$-699632983128209408$;$-3877771363514089472$;$4499409232295605248$;$2485897804617715712$;$-2017701201259850752$;$-257135482849515520$;$-896046925900966912$;$343164906474738688$;$-614794978118107136$;$3908688313063240704$;$-237214626255608832$;$-928949525035893760$;$-3715046161052643328$;$-1782106905539417088$;$-2009042805500736512$;$2468060185007861760$;$2168559629957177344$;$-2691042172316985344$;$2736437503320452096$;$2995423630476531712$;$1572995909961073664$;$-2028330078741519360$;$-560478359821838336$;$-1052914235459102720$;$2782635631974116352$;$3576534363343571968$;$-1425221649190370304$;$930632044288787456$;$1944808270296164352$;$1256714149850966016$;$-1612823103383880704$;$-1791257625237268480$;$-3107550042116297728$;$1543579582012900352$;$-3699393399778746368$;$689264574095232000$;$3023932375660312576$;$-2099213574050596864$;$2845389832637258752$;$-1479702042037359616$;$2776400387666974720$;$3517681952311703552$;$283676773022082048$;$-3857332764628853760$;$302921483994977280$;$-3519669507981835264$;$-3555123225430367232$;$2916407092052709376$;$127927822337437696$;$2997009042424299520$;$-4556825890883127296$;$2337356060966042624$;$-4032995704386905088$;$3653537983642340352$;$-3594031781430410240$;$1886703304138835968$;$518351675170991104$;$-1530947627047426048$;$-1931137121108029440$;$3117093484851971072$;$-3276517857202387968$;$-139101182003755008$;$-2359167418749020160$;$1632837577417438208$;$2842722794220513280$;$-2372045560917184512$;$3688652242435789824$;$1862567275945658368$;$-685301029488529408$;$-675878339694097408$;$4530984959522222080$;$-362795437239309312$;$-3802638667788848128$;$1032833241611250688$;$-589177688335830016$;$-1325606467005421568$;$3091531941212205056$;$-1273103236643456000$;$3783818836074162176$;$-949996649579875328$;$-1396042717650095104$;$2290904114156603392$;$-3792174649462446080$;$-3964302426929087488$;$-4066224181944120320$;$-320617193712489472$;$3684993292560754688$;$516227065551635456$;$-4558810502140891136$;$1469435051976060928$;$-2205973597892979712$;$2107610670558862336$;$2252525900458089472$;$3350654384004550656$;$-1941045258873261056$;$3191124566899351552$;$-3784989928604745728$;$-1193267036290086912$;$655408616291884032$;$-212876640038174720$;$-3590368850651868160$;$558029138347430912$;$-2278238605727648768$;$371615337409138688$;$891241340930406400$;$-1486348553840954368$;$1539735059487923200$;$2450719784820074496$;$-1570748867458525184$;$4006517040286190592$;$-336437195552436224$;$-1925998770684503040$;$-1909602378549813248$;$917021481307069440$;$2798907854787021824$;$-2578085515485650944$;$-1349253997231279104$;$-191593662709078016$;$-3445140850217142272$;$2925159438016362496$;$843777510643272704$;$4248283505199228928$;$230153017421550592$;$258188034259491840$;$1440706914889815040$;$2752267825916541952$;$-3029096992925901824$;$-3068781995351505920$;$1438275594083582976$;$-2710195616675604480$;$3746136483441552384$;$-2717548758210630656$;$-1966534745097241600$;$1474420110487933952$;$-3212797005695248384$;$-3717383871246760960$;$-4525460915061594112$;$-798841519379621888$;$1531624088992194560$;$1121906400468473856$;$4008530319146691584$;$-3701182402606636032$;$2902131814086661120$;$-2126475121644454912$;$-1298624124069819392$;$1812775219402578944$;$-90214514685489152$;$-3676901914700523520$;$3366564131393158144$;$542843133575849984$;$87930070552526848$;$-2273951061067256832$;$-3311737609362038784$;$-2268879633220722688$;$-3098426986307830784$;$-4557514513892616192$;$130031424963973120$;$2996722077623528448$;$2773444809013233664$;$-1550429025666035712$;$-544866906467558400$;$2965288418047634432$;$1520912791422995456$;$-4229118232153431040$;$-2342814871508529152$;$3663871250526593024$;$4102083558401143808$;$4015586829375537152$;$-942754641026393088$;$4573340417706939392$;$-2299732482851989504$;$3053912539662667776$;$-2374406830850950144$;$1017343552304838656$;$3424431215097138176$;$447869361883526144$;$968756125215066112$;$3615893535011506176$;$-4388221440358933504$;$3109536984796565504$;$-3967581594239223808$;$4526140997119117312$;$1068502972539489280$;$3962795406857077760$;$3902004671039065088$;$-1449100453919584256$;$4055164123875773440$;$1921867644643304448$;$378472117419661312$;$4147213786840597504$;$-4226155132381154304$;$-2852523714242061312$;$997035228997761024$;$1624357738100642816$;$2119118433447941120$;$1831716314029213696$;$2991591901609444352$;$3054934104407422976$;$-3343897281768451072$;$-3395459312094066688$;$3245072218318213120$;$137174513796724736$;$2042162956358816768$;$-2601058076350137344$;$3051404911138801664$;$-1260242758522597376$;$2760545020668887040$;$1552780880678498304$;$3508096861298868224$;$4214501387878901760$;$3404353552937917440$;$-514583599258691584$;$-1646691737545501696$;$3525126354960342016$;$-747730113735115776$;$-3382296362597469184$;$-822995150196388864$;$-1044516317928018944$;$3142151992369041408$;$-2297556415589031936$;$-1848801017223008256$;$-3777531726512013312$;$-1885921481758176256$;$304725988032741376$;$1621744416842365952$;$4029516872007368704$;$358343104831604736$;$-137234824836852736$;$2316161536902937600$;$-2914883279447721984$;$-2118595742364345344$;$644789440117789696$;$4027897820763621376$;$436971753681274880$;$-475362393075010560$;$-3453372059203431424$;$1701876261618296832$;$-349284361931998208$;$909781671112290304$;$-1686850959269772288$;$-3885101968057947136$;$-4373078798969944064$;$2409882212181657600$;$2633101088415069184$;$-1120151624156443648$;$4335867823351587840$;$1708678949026498560$;$-2746109247530617856$;$286134243569024000$;$-1544932612665921536$;$307462986593564672$;$-2540913738243120128$;$2276708441973932032$;$-999614501710082048$;$1358564242260022272$;$-1277277457805650944$;$-3536112339845597184$;$1171087769553606656$;$2984911721788240896$;$-2927679248041887744$;$-626472060187216896$;$2213375272662825984$;$-3052515967640755200$;$2971923474856859648$;$-434175944816289792$;$-3550463096646287360$;$2862428288388800512$;$3361737266740289536$;$-2736878972977084416$;$-2904997737947332608$;$1314737922713006080$;$1251785966405124096$;$3792205347555146752$;$-3722093918642514944$;$-3036941245353576448$;$-2904285320500026368$;$2005888690262791168$;$-2017171042052127744$;$2518139349621245952$;$-4401745950223409152$;$3914164346255086592$;$1119575953666591744$;$-202131015380463616$;$-1386928045237197824$;$-1539059054311810048$;$1235558838646957056$;$-1485532414465147904$;$-2352697101644514304$;$1846666354624721920$;$-1473041062551276544$;$-2131249202585996288$;$2105954140836879360$;$353913810596764672$;$-2276698050510863360$;$-3234634756110015488$;$1858495368645491712$;$-418544880420202496$;$3974011938204368896$;$2987042575326274560$;$938584815694304256$;$-3415678591360944128$;$1627011615271951360$;$-2684187330835019776$;$-4336534481722003456$;$651078353045586944$;$-424820084697612288$;$3980923276923281408$;$2717345449527648256$;$1363137710063710208$;$1839096451667539968$;$-3596348644862041088$;$-1695242935644848128$;$3797676196200559616$;$2519441138111534080$;$-1557739829736953856$;$2356774760316591104$;$63753972862040064$;$1840580450521241600$;$-390473695573614592$;$2881623615982795776$;$4333495775319429120$;$882599423592105984$;$-2276063251113668608$;$2227489213059807232$;$-398683362821463040$;$343354160531205120$;$-967192654776130560$;$-3138021456857597952$;$2202562514416877568$;$4050567760639768576$;$-2348352547098298368$;$2430830104316959744$;$-1554156466801289216$;$3319099520812196864$;$585603579597078528$;$-2343762195782848512$;$4173543164005291008$;$2735699415896840192$;$-3797048613061013504$;$2522870877518489600$;$1672440538755759104$;$1228833076917837824$;$1519538800943480832$;$1600769000281787392$;$973649395966322688$;$-3617506133895520256$;$-2562097648292233216$;$-3518714229252794368$;$1441206066015762432$;$1950770566456248320$;$-194877032500448256$;$1865127034369600512$;$-1116888012984435712$;$-1696297804165843968$;$-1583859602329554944$;$-3934775712274207744$;$1504243978154254336$;$1790993121375520768$;$3594774555097825280$;$-3455625816509197312$;$-995339052623924224$;$-3005934626396225536$;$1856856735297362944$;$6578506877034496$;$-1136947921190581248$;$-4402426521689379840$;$-2353164939587899392$;$-3305893722679538688$;$-4278447423575079936$;$2125581039433187328$;$-4453657841968585728$;$-1114756315672014848$;$-3747702354081955840$;$-731136668779498496$;$-3739284553266119680$;$3881159593066871808$;$-2252633245801388032$;$-316933651519220736$;$1743865486997327872$;$-3703102467188333568$;$4030646912917779456$;$246446044232870912$;$4456942024548008960$;$3416503386924661760$;$-3286705811921145856$;$282130634957455360$;$-2343949679330093056$;$2418277575705261056$;$2281936736584532992$;$3135492683455964160$;$-2329547655709667328$;$1967206730773682176$;$-3488572226792144896$;$-4404730579397905408$;$-3599207132408605696$;$4022344014660184064$;$-3122854170698285056$;$-3522900964033748992$;$4499309093012265984$;$3393587339215512576$;$2289247790581872640$;$1007608330075593728$;$-1661356609185826816$;$-3713887014358628352$;$1092121731285188608$;$4292524051161618432$;$-2134154350308144128$;$1036894656649724928$;$2046840327204055040$;$-3820556999865905152$;$-2966944866135697408$;$138997248175036416$;$-3718022785192645632$;$-3911738504112147456$;$-48946051419732992$;$3846473554517325824$;$4318171287081482240$;$-4158670821724472320$;$-4129735542588765184$;$-439376251132429312$;$-2845348984372275200$;$-268955267176422400$;$-3045395509300596736$;$-300652852783345664$;$-3281445300160799744$;$-145470662953901056$;$-4429758387490508800$;$1343133141013554176$;$149160295672200192$;$910651266217248768$;$-2703106483142950912$;$2425493940815401984$;$2102138930621830144$;$1102168132349216768$;$2629737248803051520$;$-3404327913564760064$;$-2772192987043474432$;$-3390819687592245248$;$-1078156828409171968$;$3049083926641386496$;$-2858346074549172224$;$-2991144513346014208$;$1160789605712656384$;$708148976592171008$;$-4312122238004554752$;$-4579393473859845120$;$-4390262819262972928$;$-424237356498490368$;$1851913583311638528$;$-396278588106765312$;$-502504830296080384$;$3977797572897230848$;$3827783870761302016$;$2565886680302562304$;$3681634309847110656$;$-2556664800615981056$;$-3935386612038067200$;$646926553935056896$;$4369622639637874688$;$1733600221203685376$;$2146906999001316352$;$1450163817859807232$;$833933019065587712$;$2560086671124672512$;$-811894012322818048$;$698935777841894400$;$3467553644176711680$;$-3750972262514899968$;$4596376813711197184$;$-1449091048578607104$;$-2573348559121988608$;$3990398007901661184$;$2402284784585308160$;$2338796622481162240$;$1365508090321681408$;$2250002751034692608$;$-3304134376801231872$;$-524703570459882496$;$3071672102814994432$;$4604271922296643584$;$255446096534375424$;$3946185240212135936$;$1292610665237955584$;$-2945893356391368704$;$-2347550777380514816$;$-2698247505401273344$;$4228384277183647744$;$34170012075659264$;$-3969231995835067392$;$3375253798999260160$;$-648103647147614208$;$-2405219598871832576$;$-4110667354840967168$;$2483893662937300992$;$-2384913670529291264$;$-4342048336358811648$;$2241310467526260736$;$3148494103759908864$;$2106367288805427200$;$3275726616662466560$;$-966698035795315712$;$3379372380644786176$;$-1634601095857113088$;$-3582579356486440960$;$3178650845265894400$;$1428344907456835584$;$-1173868045188383744$;$-520952725257392128$;$-3555128606069414912$;$2916293299645880320$;$2526107251121425408$;$3724647019950873600$;$-3401590163261356032$;$1441264653912867840$;$4511796015137941504$;$3683659769326467072$;$-4564384856930519040$;$250601327375006720$;$-2143155177834796032$;$3308064487253456896$;$-1543129014355087360$;$-3595381341667803136$;$-4241309371675504640$;$3115300058715627520$;$2308062135833574400$;$-4224210041679892480$;$-978265278174639104$;$2659133943987474432$;$4446962879076681728$;$-3178243817305756672$;$-2931809259685330944$;$976982892278539264$;$-518890974334405632$;$-3887051496451615744$;$-3332142193913620480$;$-3677724287577803776$;$-4134033655142636544$;$-294632905142094848$;$2216732253638341632$,㋍᭿鱮峧䠲㙄퐑옑ǚ崤ꋉꃖ쿪崚歸ꁽ褭烕䍘鱋殸㰅ާ쪭檿趲錒㞩嫳矀潘䭫쾟攫扄펔ꛋꪌ, -chunked 1.0,18,248062 -{"finished":false}_serial,__mv__serial,_time,__mv__time,random_bytes,__mv_random_bytes,random_dict,__mv_random_dict,random_integers,__mv_random_integers,random_unicode,__mv_random_unicode 20,,1443154423.08,,"-EFF_3SU.aaD VٔbO=\""S!",,"{""a"":2.2438386791921184e+307,""b"":""\u6606\u8fa5\u2f98\u3b8c\ua1f0\ucc27\ubcc5\u500c\uc773\u045a\udb70\u5868\u5298\u5baf\u9da1\u6c72\u5d84\u1de2\uc0e2\u8d75\uaad3\u1e24\ua63e\u95b1\u610a\u73f0\u7ff7\uab13\ud010\u8762\u80ba\ufe36\u5ae5\u59b4\ucfe5\u191d\u57a4\ubd0f\u9fc9\u04b3\u7519\u2533\u15e0\u2b87\u463c\u9725\u5863\ub0b0\u9233\u375b\u67e0\ue1f4\u8298\udfe6\ua7a6\u8cef\ud22b\u34fa\u73ee\uaeb4\u1eb8\ufc57\u0a25\u5ea7\u59f0\u0d59\u06f6\ue35f\u6b2b\u9710\u6d31\u1b55\u6ada\u738b\ub328\u82b0\u7bec\ud6c0\u974d\u8008\uae68\udb51\u3180\u4168\ue046\ub65c\u9ed3\ued47\u6956\ufd72\ue72b\u431d\u8a59\u1b80\uac8b\u9507\u0bd5\u5f16\ud4cb\u2eda\u31dc\uaa43\uc036\ueb4c#\u54d4\uf507\ua8b9\u5e09\ue410\u09dc\u842d\u8ae9\u2d25\u45a8\u815c\u8f9e\u09af\u7c44\u538b\u77fb\uf951\ue109\u6a8c\u26e6\u642f\u473a\u65bd\ubaf9\u841d\u2f44\u169b\ud1c7\u02c8\u6ddc\u2c7c\u1b2a\uac3b\uee8b\u9aef\u7203\u148e\u0359\u91e3\u981c\u4543\ue829\u77fe\u357d\u8e48\u35e8\u38a9\u1f2b\ud57d\uf08d\ud769\u864a\u8397\u920c\uccdd\u1b34\u0271\ud767\uc684\u4a7b\ucf88\ud8ce\u55ac\u02aa\u48ea\u66e7\u8719\u101d\u866e\ud653\ufd8c\uaeac\u39b8\u567c\u3b51\u00fa\u8e12\ubcd6\u46ce\u98a0\uac18\u57b3\ubd99\uccae\uea55\u6b2a\uf07b\ud7c4\u4fab\u2bd2\uaafb\u065d\u8a7a\udf93\u699e\u53a2\ua88e\u1169\u9bb7\u657a\u607c\u86cc\u29d0\ub5bb\u2e70C\u1263\u2da1\uc71d\uf078\u7c2d\u0ec2\u4b0c\u2e99\u771b\ue73c\u3592\u3cda\udf42\u5d60\u5372\u345f\u796a\u55f7\u01f6\u5427\u3608\u3b53\u5151\uecd3\udfa1\uebe1\uace4\u7b7d\uff3b\ufa26\u8fde\u4d41\ue39d\ubc1a\u096a\u7c36\u33ce\ubdd0\uf71b\ub719\u376e\u2e93\uaacc\u714c\u2676\ub94c\u61ff\ubedd\u7c72\uea1a\u12f9\u8c9e\u429e\u856d\u3be4\udbdb\u9034\u989c\ue4a6\u2974\u2ac1\ua7dc\udcc5\u9655\u5e5a\u94e6\u114c\u42e7\u8b2b\u8548\u2782\u705e\uce4b\u27b3\u18ca\u3094\uc41b\u1d09\u207d\ua74b\uadf4\ua4b9\u0c95\u0a12\u1f7b\ub6fe\u59bc\u4fd2\u4df3\uc023\u8f5c\u0a87\u9551\u43bb\u2656\u14f3\udc4d\u6b63\uc22e\uc3be\u28b6\ue97d\ua249\ueb6c\u77ae\u0da4\u82fd\ubecc\ua022\u0ee6\ua762\u118d\u4961\uc89d\u9d81\u8f3a\u67c4\u20c0\u4cea\u077c\u4265\u3458\ue7a3\u3f3f\ub892\u7870\u5760\ud004\u4e56\uc2cf\ud3f0\u59c9\u6daa\u577d\u6d08\ud303\ub34c\u716d\ub29f\u5be9\u06ac\u83ab\ufe45\u4ab0\ueb57\ub5e5\u7795\u4594\u7031\ub5b0\u813b\ua080\ube97\uc828\u3d8b\ue2c9\ue68f\uce98\ub363\uc02e\ue3ec\uaad2\u8a5c\ucb7a\u85c3\uc34c\u323a\ueeda\u407c\u9696\u6b87\u0bc8\u4fdc\u9c87\udbfe\u7a19\uf570\ub9ee\uefe6\u555b\u15c8\u8261\u05dc\u3598\u62f9\u0dee\uf33c\u7e73\ud820\u3332\ub03f\u3b49\ue0f6\u103e\ub1db\u7f0e\uefe4\u2403\u349a\u9e11\u20c7\u4b3c\u5607\ub209\ubf32\u5308\u555e\u5b21\u31f7\u3ea4\u1bbb\u458f\uf828\u3bf8\u43bf\u424b\ucb31\u6e28\u5813\u65cd\u3619\u8ea3\u6e52\u9beb\ue706\u19e0\u27b5\ud856\u2d2c\uf6cd\uee84\uc5d4\u7d89\u6143\ua325\u116d\ub246\u742d\ua96e\uda1d\u346c\u5ea2\u291d\u695b\ua994\ue2f3\ub2cd\u2d8d\u9c08\u83ae\u3a51\ue190\u6b75\ua978\ub6e6\u0b17\u75f7\u84ea\u3123\u666f\uc32d\u74f3\u6b8e\u5f98\u9e4d\u3658\ucbfd\u5c04\u26a7\u9318\ue721\u05a7\u7372\u4c56\ud0da\u7754\u9716\uce7d\ua467\u3fa6\ueb37\ub499\u59c6\u57a7\u1eed\u41a6\uba56\ufd49\u5a1d\u9ecd\ua7d3\u537a\u118b\u312b\u6cec\u8b85\u56a8\u78ce\u4483\u1ae3\u40df\u2288\ud976\u8788\u761e\uce88\u7847\uf249\u1e99\u5231\u0fb5\uc1a1\u95ac\u45ba\uc3a5\u86b9\u25f0\uf127\ua4cf\ud9d5\ud271\u9697\ud531\u5d38\u632b\uaeb5\u1270\uad33\u79e4\u58bc\uaef3\u3bfc\uae38\u3906\ufd18\u6918\u093b\u1da2\ud227\uf0f5\ud0ea\ue1c2\u70a2\u2471\u07bb\ua8a0\u9e63\uf76f\u4d6a\u403e\ub81e\u55fe\u60e5\uc3b1\u03ee\u8f68\u75a6\ue899\u52f6\uc7e9\ubf9a\u4388\u1223\u88dd\udcda\u5314\u9a14\ud827\ua576\u3ff3\u6eb3\u17af\u862c\uc4f5\u75a2\ue98b\ue807\ue840\u12da\u6c76\ufce4\u9338\u6f5c\ue9ae\u9732\ub765\ue838\u40b9\u2c10\u955d\u6c53\u8b9a\u93ca\u48ef\u2ed5\u7f4a\uc3e0\u5bf0\ucb76\ub838\u9386\u2760\u8643\ucdd6\u1bb5\ue818\ude60\ucc5e\u1598\uf930\ud9fe\uf27c\ubf6d\ue6ff\uf567\u34db\u3311\u34d5\ua1fb\u0d20\u309c\uc87c\u0917\u32cf\u3645\u9f55\u5c9c\u8415\u0f32\ufae0\u52fa\u1047\u9f1b\ud8b0\u4717\u4d93\u06b9\u2d3b\ua73d\uf00b\ub7aa\ueb6a\u73c9\u5240\u10c4\u03b1\u4401\u340a\u82b3\ua4d0\ufdd9\u8f1b\u0d40\u3994\u2c97\u7932\u3d79\uaf70\u00f6\ue6a6\u6fd6\uc455\u934f\u5c23\u30d7\uf03a\u2938\u76a0\ua8df\uce96\u2054\ud7a7x\uc771\u711e\u27da\udbe5\ub19c\uc38c\uf7dd\uad4d\u9627\u6698\uadb5\u5a5b\uf437\u83cc\uf36a\ud129\ub01b\u788d\uc2ec\ub24d\u726e\ud2bc\u22b9\uc57f\ue21f\u1f21\u92d9\u59bb\uddb0\u7972\uc391\u0a5f\ub94f\u4a7c\u80d3\u2b01\u521b\u7f9c\u45d3\u6050\ub243\uc07b\ue46e\uff2f\ua22c\ue4c2\uf110\u7ad4\u94b4\u04a6\ufd94\u9446\ucd49\ud770\u5205\u17e6\u4748\u93c0\u733c\uf484\u6b3f\ua8e7\u1760\ucbbf\ueb28\ubffd\u957c\uc12a\u8946\u4378\u2f6a\u0f19\u2a43\u7b75\u5f78\u2c1e\u893b\u4aec\ue2e0\uc040\u109b\ud29b\ufaaf\u14b2\u5fb3\u7184\u788f\u3b83\u1b8a\u62e6\uefe8\ub58c\ua56d\u8872\ud34f\udba2\u10fb\u4536\u60d9\ua739\u8495\u6686\u26fd\ub711\u2b89\u6e13\u7138\uff32\ube0b\u200c\u67b5\u4206\u6f47\u432d\u7ab4\u9230\uc5d2\u3d39\u9d7e\u9e47\u99e6\ubf38\ue553\u66bc\ud268\u2c7f\uc800@\u3edc\ubfc0\u51ed\ub75a\u49fd\u5561\u9a31\u53bb\uc9b8\u3474\u7f96\u820c"",""\u798f \u9152\u5427"":{""fu"":8.846967456910945e+307,""bar"":9.736757336479673e+307}}",,"-4211614565474438144 -843086565617481728 2999869307446430720 @@ -14247,8 +14243,6 @@ chunked 1.0,18,248062 457895013594889216 1049261825418380288 1586742110418430976",$8438292955909120$;$3191462112282466304$;$-940985485151939584$;$1581386805363154944$;$2419638903672910848$;$2436976733314998272$;$2635587719746094080$;$3049455788169887744$;$2734446169738254336$;$3802370240159539200$;$-3197793889711984640$;$-2034079121219833856$;$-3517638042499688448$;$2756999241045108736$;$-1412265644228725760$;$498571406695812096$;$1945268558396673024$;$1067709049175296000$;$-1755186001096647680$;$1209827512450835456$;$1136039929766154240$;$4312034546036769792$;$-1399867091509181440$;$4290417301117100032$;$-2921394816520898560$;$2496880800803959808$;$965473784240115712$;$1182774026808799232$;$-204187429932446720$;$-1962763105531218944$;$-4187805140317569024$;$-1090674096672538624$;$388428273977304064$;$-2964416501088735232$;$1247864933181831168$;$3018320011868167168$;$-2922434649079937024$;$-2827244412656866304$;$-3941730724942339072$;$413922725061238784$;$-1618565128455656448$;$1670593075480481792$;$-113529630987033600$;$3579116315990105088$;$1316506630711250944$;$-3278024262913878016$;$-1791772379654441984$;$148357060326915072$;$-1254464141464833024$;$-1219358170260856832$;$-2487186464879950848$;$-985666436233937920$;$-4492790386172960768$;$859578435120121856$;$1069511686914102272$;$-2546881994435684352$;$1383763304766642176$;$-1976291571616159744$;$-219007750171569152$;$-689365801733415936$;$-3032017309191276544$;$1305037600192734208$;$-822730724151449600$;$3896004358894362624$;$-185389333132044288$;$2828439957331303424$;$3265540318841452544$;$1196403371857777664$;$-865747885723894784$;$991927485922191360$;$1829173012796702720$;$3003777791880087552$;$875864942004777984$;$-3906930367163794432$;$-3556992320143121408$;$360875131684518912$;$1097192526183027712$;$-4329698010673551360$;$1583869490970557440$;$-3605038796927935488$;$3551902197500027904$;$-3756081063055204352$;$-2031738830261118976$;$-3213796178926836736$;$1941016281421272064$;$1947884591993230336$;$-1753168290509890560$;$-2786095117063500800$;$-1175249783729773568$;$-4560451260953735168$;$3635989984301326336$;$2077423486181774336$;$-3219702903282367488$;$-1133662662501934080$;$3805300068743445504$;$2885471987442015232$;$943411261838943232$;$-758896149326300160$;$2243762487234868224$;$-4396042532596916224$;$4135675584231220224$;$-3520719017587573760$;$-2489596685452412928$;$3087919608796354560$;$5528103612744704$;$3984978153643215872$;$752292869852181504$;$-156753170762930176$;$-2893513703776205824$;$-3042015697772354560$;$-4472526803908539392$;$-3363167393493800960$;$-1211209248059123712$;$-3599354006913178624$;$-381658921576709120$;$-3283553007060512768$;$-1794909374936779776$;$1434993633169009664$;$-4135047841340421120$;$2155453210560419840$;$2207629829822789632$;$-547915819442563072$;$874473219361768448$;$-2865784086497923072$;$866183627139550208$;$1605554808600632320$;$3924157859730817024$;$-1483456978135007232$;$-1787387014346009600$;$-3761499118655625216$;$2607848997433774080$;$-4305731084018494464$;$-556519101405495296$;$-1550344309458666496$;$-2599009180434294784$;$-3742143353491180544$;$3295753798649701376$;$-1865235429104310272$;$-916816830343925760$;$2347816567161783296$;$1292253523911275520$;$-2501458772983001088$;$-2126610914109842432$;$3715132599812982784$;$4030667509350548480$;$552883453941745664$;$-3760474043195269120$;$2138958318865470464$;$-1623589068932134912$;$-1538092436835293184$;$3061440769178159104$;$3783395860755009536$;$-259052143205985280$;$-1465068668876350464$;$-824879572047962112$;$313612749329996800$;$1976544364672239616$;$-630043356984383488$;$-3808783791078208512$;$-4447784430417692672$;$-707871505956334592$;$-4502487026027439104$;$3733155208764919808$;$1384002906617015296$;$2705327876392069120$;$2082824782198162432$;$-1707795592846550016$;$-1480446091780483072$;$-3772047796341188608$;$2860292405842053120$;$1150965604032849920$;$-921874374067450880$;$-1756405622534000640$;$-606918868952970240$;$1968172921011727360$;$-2410710703205997568$;$-2631668596273142784$;$116432236419461120$;$499292297914398720$;$3950518634245045248$;$-730011106101321728$;$772359699756941312$;$-565138831814352896$;$-637129089809658880$;$472755215864609792$;$-4346366009139140608$;$1424062774258440192$;$1074622078487896064$;$-301682219353498624$;$3381982494888665088$;$1005544803525699584$;$-1102422604603555840$;$-1611207800009017344$;$-308414549748593664$;$-2370778767141907456$;$678791810155948032$;$2296073191090452480$;$-894393969579761664$;$-2483338217858549760$;$2245765618347062272$;$4547045043054349312$;$2500170985445691392$;$4060446647411333120$;$-2056134768871380992$;$4141998942567520256$;$4436169906467319808$;$-2314947722957155328$;$1449777880288125952$;$4348005321560975360$;$2605198588451698688$;$-1216866616054532096$;$81455232026447872$;$1228172063514024960$;$354113203630968832$;$2876740218269125632$;$-286999824291438592$;$3267106243849363456$;$-2204819152603501568$;$467047740494441472$;$1229027142895760384$;$-2849004281069290496$;$3956323621370105856$;$728539998524811264$;$3377542670090201088$;$-2460588499543487488$;$-3506294664695409664$;$1793426603864946688$;$2554928238940706816$;$-1994477299259719680$;$-2069857744266329088$;$-969447160880882688$;$2482166488429510656$;$3648402956157810688$;$-2792968961201695744$;$244328426770544640$;$-933494323840156672$;$-1903052486083652608$;$2205046747831684096$;$1738259820910504960$;$-3158763901808333824$;$-2940416433848264704$;$251487108741044224$;$-2981101983161366528$;$4008501577064066048$;$112870864937577472$;$-1538412971057686528$;$4030653247548403712$;$-448116067237608448$;$1685964095330436096$;$-2548064594973215744$;$1216158681481757696$;$3073480853728247808$;$-2720897625309955072$;$3282034257887199232$;$4291841462539063296$;$1913420139835613184$;$106136359300726784$;$1382348118514027520$;$-877983796506977280$;$2620010890922416128$;$-796947237052668928$;$1701070514574127104$;$829880012948048896$;$-886260485053447168$;$-3157653090634101760$;$-4600217661691915264$;$-2115119742694455296$;$-1275699731274881024$;$-780081019538821120$;$-1412899943801031680$;$299359790449330176$;$2483683071268614144$;$-2007975101880255488$;$1616910116833945600$;$3400569152697065472$;$2608223252443358208$;$-4387355909692024832$;$-4289487028500612096$;$-330279687743645696$;$-893706817042361344$;$4438731359991838720$;$-1063594024376604672$;$-2331604979180184576$;$-558154999088692224$;$4330395195567512576$;$-4280267229501865984$;$-3727655072124467200$;$-2134028589617930240$;$415990283598601216$;$1837715407542832128$;$-4053111305696914432$;$-2925676139263220736$;$534951725802401792$;$-2597868371335531520$;$1906408088867907584$;$-1940865470368508928$;$-3741371620885942272$;$-2048031598012971008$;$3496728585046983680$;$3014493782880439296$;$1973838757835657216$;$1010617298263571456$;$3013679739434469376$;$1078426402619181056$;$3308920603089494016$;$3627128748274140160$;$-3643014633046628352$;$-3547730406796413952$;$4240522538770545664$;$3110188381391722496$;$-3744375577830531072$;$2652571163788207104$;$-1185739344454897664$;$-451154272455317504$;$4104545681359179776$;$-4099320474509290496$;$-2770409142939696128$;$-1753463052835097600$;$-1072038882919142400$;$2620730489284322304$;$-2648454310891182080$;$2211673919167782912$;$-3943198975976566784$;$-1676860892380646400$;$-3914398716814397440$;$-377879514176622592$;$1525549072139565056$;$634861115508934656$;$-1453982598290299904$;$2640711167371713536$;$731982956370466816$;$-2390151252035962880$;$2204305317296646144$;$457895013594889216$;$1049261825418380288$;$1586742110418430976$,嶗஁缠ᗖ鰱阙梁䷺ࣕᆚ种뷻슘锪Ӣ腦毘ꬅ쮥옔熇䴑廒迂ᥱ曎梾蹕ꒂ鲳蟲뺭釴㚶쯩ьꓱ罉䭪ㄅ縡듉쳾쥁鐵㤞죮꼁റ쉑鍛⛯튣᥸駧郌䗦匲嘥ᇭ匛⇭ꤎ둯䠵㪎⓮ἡﮛꗉh蠧䩏ꦛ⏍Ꞟ㘌瀲颢紑훌抹ᖻꎢ᯻䮝ᅠ퍻ߥ⬛詙滃辛쁱⴬̷ᚥ癱ꕗ틅ꠟﱲ斈遍跿昍ω蔮⯬ꝊȣḮཱྀ摫ࠋ诇뻜ಜ㼥ﴱ뵶羛倓슣佔죋鰣ꍁᰅ뗸赠鱪팰귃✫ﺓ싘焜䜽쌟葬遛봻匁舗叠䖧ꄿ졼ꕘᇏ砶኿ү畏蕥註췑箳ⴺ붋쫢㓳ਘ涥릨呟ೝ۾㊂흁ი宓㤟恩馶ၕӪⳍ⭼鞤⠃⒖౧ᰫ勋픨ꦴꠉ鿸ᄯꬎ膰눭ꁸ鮅ᄂ♼爃災賩씡갰愽荻࿐㼖휕͞ध鑶씀獦뉲╛㯦㱐࣪᤯踠稅鑼籊㓿塕犬鋾ꢠ碔Ꝃ뤢묰壜扼ﯺㄜ㡼㛐쫲ꏉ擑轶ᬙ赇㓲䟪跧왈椯岤璱諽爋탵끌◆䪍﹮뺋뗰䴲֐㛒콙㶔唰ᛮٖ։蝺鹍䏛蚢】④処춢ꬂ䆖覕ᄝ蚡뵭泿眼쮘뽓ጌ⩤∱᠃খ琘绹낍俪԰嘵튻貌Ƃᬋѽꤊ野磩阑킟触᪖幽㇏석㙚龰蘧᠝Ḷɯ䲀⬷궥䢮ᘜ쯛웒ꙻ啯९鿢섌繆潓渻ꟾㅳﱽtᕧꤞ䫗奅족䱲鴕ﯫ泹湝퐦沜䡖媯햳骪㜙㺦㿹䤍蕐庣๡ㇶ跷㡂溫蔔䏣츣횿쁐뼀֢软ⶫ䬡릤뛕ႋꒌⴛﬕ䘧獵䠗툴銖沃൲晴㭥클ա쐡ဧ㢔鱆絀讏펢뮇㛇ꍒ酁퐇嶦뤫ᇢ﭂㰥멀랄ּ࡛⩳쪟⽘꜐䢗缈ৡ茢ᶓ럼믿䨕ꗹ胪塖雙欘쉧ŷユ正闄㿮쮆囋䏑➁솔아⏳개㱘弽羕흿禟籙뭙儸讳꺄㊯䔸Ვ螣뾋亳㑁뷁罕岔씼ﭾッ䱑⪶൑鋔⽖リ䠩危Ჿ㢲㣎冽᠇鍎뭉ᤅ엧쭺矲⊘䨏枫짴乖賓醱ⷹᴈ퉵֡뎆ᢨ溿졺㼑汽썝맵썄鮿ⷥ㬜箷순蛧射它葧⟝潬⏫ꦨᓗ᠁쁳럂痾者ꐨ봠銇黟鵠䀎쳀쮮鹀˥吇壳聒⻺嬧ᨛ믍ﵥ⺐좞ἲ䌙破쿧ﭚ靥ش飢ꉲꢦ錗뺅账뉩ᢑ帖荜噅穳⣳쎘ƁЕコ䣸ិ䋺뀦옕쨄훨⥍㢒ዠ宼麭⵰舘ﱘ쬵뜕䮵퀊댋ꍔ쀌ꆃ懸᭻⯨ꅔ賳锫ॻꝪ緼촘᲻ὐㅠ咕愿䎿ꭧ㉰끻뺐൙Ä쥒Ħ鉦ꢳ鱘ﮟ㌚甃뛑恛뙛橚 攞䒹퐲鷬晒沒梽ㆦ齲絥ꆠữ뮮ࡕᛐ瘝箓傴뵩ᖋጕ睄픴亇☯ܖ漤⋴㵠㘇숄⪝綀惈硝略漑䢩杉瓲擯몀Ɫ缩৴헣ࡴ횣쌜ᗕ栴죿ቔ䤖媕㠝劅挒긑譽첾愒規ര䮈ᖂ獁鎢憩䞦έﳺ颃ꣳ靟鎏쩳촩骮淕੩뢅魄韰䣢柟襻욫祉佒丷젉갻鄜䥾늵ﮅ⊄쎷뗲꼣ㅫ◑걇傖籝굈ဝ珱큐ꧡꄝ关籜祷ᖃ㉚ᒳ겡ᵢ坂숰గ魰컏얅׬砐즵盓䎱萺Ϸ᫑즸୾顝渙칍炥드轤㴱最ꭎᇖ럘兌㮪뽺䄁똘敊嶷웦⃀᫲礠䀻⾺푖닡锒찼ꃡ恔樥麤ꕅꨶ摹賦ꓚ쏅䀔孼፠ꨈﶸ薷㳯㆘諷꣱鯀ኑ唿敓氻ӐŠ鶈䒭벒靭⃚ꩇT痻묻鋑릇漟䁨뾦ⷠ㒊ێ, -chunked 1.0,14904,14936 -{"inspector":{"messages":[["debug","\u2b71\ud7de\uc73d\ud2d8\uc3b8\uafe5\u6650\ucc7f\u7666\ud8ff\uc51a\uc679\u4512\ubdbc\ud6bc\u934e\u2932\ue944\u3161\u655c\ua84d\u51b6\uf218\u27dc\ub55c\ubd45\u661e\u5407\u358c\u1a0e\u81f3\uec99\ubdd7\u6ff9\ue56b\u7ae1\u1afb\u0a0f\ud751\u35b9\ueda7\u3680\ua3c9\u8008\ucd29\ud793\udd36\u905b\ua9d2\u0a3b\u8c7c\ua1b1\u113f\u0efc\u0c10\u3cbd\uddea\u7e67\ub9e5\u0dbb\u3c24\uda5e\u3331\ufd25\u8519\ua20d\uada0\ue10a\u8b00\u481d\ua0f2\ud391\u2e9f\ucc11\u450c\uf1e5\u37b6\ud12a\u98f3\uc258\u2138\u83a9\uf4f2\ua2ba\u022d\ue419\u97d2\u72f7\u1990\uf453\u4d24\u2877\u80d0\u0b86\u4bd1\u04a4\uf6f8\u0c89\uf941\u7981\u6705\uec0d\u89bb\u1182\ua225\ua8c4\uf84f\u989f\u4e5f\ue1ff\ua409\uae3b\ucb29\u48c4\ubec6\ued2c\ubfd4\u7a81\ub7e8\u8c58\u958b\ue6aa\u9683\u8abe\u5c15\ud9cf\u115a\u9527\ubef8\ue4d0\u010a\u9d2c\u8045\uddd8\u2aae\uafae\ub6d9\u7fe4\u130f\uee23\u406f\ud18e\ufd10\ua0dc\u6b15\u8cb4\ue0b1\u2d21\ud781\u1824\ucceb\u3ca2\ua7d2\u114e\uc6eb\u2eef\u3301\ub367\ubc72\uc9ef\u3c71\u52a7\ud7aa\ub1d1\u1266\ua4f6\u65d0\u1592\ufda8\u83a7\u465d\u6e0c\u2571\ua67b\u932e\u53b8\u505f\uac0b\u2fc6\u59b1\u1858\u3180\uf2c6\u870a\uec86\ude63\ub306\u9896\u5c17\u0aff\ue179\u40f0\ua347\u5d83\u7008\u8d05\u8b96\u8b99\u615b\u712f\u5277\u41ae\u7d44\ud32f\u5e8e\uafa0\u7b6e\u387e\uc261\u1aa6\ua1dd\uaa68\ua440\u2c87\u0968\ucdf1\ud643\u317a\u3951\u1512\u1358\u8a2b\u923b\u69a1\u6cd1\u5443\u5938\u6ea7\u8726\u64d1\u4890\ud884\uf045\u3fab\u3592\u1389\ue3a7\ua3ce\ub33c\ud365\u90e5\u2ef6\uf32f\u2667\u6576\ufc52\u6fac\uf229\u70c3\u8e69\u5970\ufee5\u6381\u12c9\u3734\ua6e7\ud9ec\ue53b\u009a\u4508\u3170\u3011\u955c\ud034\u3ab7\u8248\uf430\u6b56\u0434\u5bc6\u71c0\u73d4\ued94\u219e\u48a9\u255f\u509b\u6116\uc448\u0e34\u2a00\uabb1\u1d8f\u4f55\uc2b4\ud012\ub948\u37f2\u71c9\u2654\ua560\u596e\u6d3a\u1042\uad3c\ua096\u7043\u045b\ud667\u37b7\ucf9f\u7c04\u67f6\u21f7\ud845\u10ad\u3b3b\u7514\u7571\u56c5\uf859\u7838\u43cc\u9d1d\ufd92\uc008\u0909\uc61f\u0747\uebb5\u93b6\ud260\u32fc\u1287\ucfaf\u07db\udf3a\u8051\u3ed1\uf371\u067e\u5d12\u7846\u1667\u65fe\uf748\u060c\u1d42\u4a80\u9ccf\uc4c9\udfff\u95ca\u2ece\u796f\u1a61\uce85\ucf3f\u21d5\ud753\u0d36\uce43\u257a\u4e94\u9daa\ud94c\ud64e\uf9a3\u614c\ucfb8\u1b9b\u61bb\uc92e\ue359\u0651\u050a\u48ed\u393b\ud7bb\u13d9\ua1fa\u0a45\uf930\u529b\u6510\u54de\uaf5e\uc0db\u5eeb\u3f15\ueb8a\u74d6\u61cc\u0c12\u54c8\u4422\ua31e\u42d9\ue603\u6026\u15d3\u7236\uab0c\ue70f\u4537\u87dd\ud006\ud1ee\ue3f5\u3cef\u5b0d\u1e2a\u2562\u2e5a\ud2a0\u7ca0\u77ef\u7bf2\uccaf\ub20e\ue76b\u41fe\udd62\u0e7e\u8846\uf6ed\u0d01\u4295\udcf2\u382f\u81ff\u3114\uc76a\u8e5a\u9256\u2974\u5365\u74b5\u8291\u6ab2\u720f\u5464\ub512\u00cb\u7c62\u5ca4\u0b9d\u48fb\u8922\uc319\u3f9b\uc6ed\ude05\u9f06\u4f22\u3454\u3e61\u822b\u61f4\uf3c1\u2ab4\ua048\u8915\ud624\u74f1\u3fee\uc189\ueb5a\u0955\u4be2\u7c9a\u2a71\ufed8\ud31e\u5071\u05db\u031a\udf81\uec49\u01fb\ud88b\u1c88\u7731\u9103\ua683\u321f\u2744\udb82\u64f0\u5afe\u4553\u129b\u97eb\u640e\u2e4f\u4bcd\u2629\u7035\ube78\u1e1f\ue030\ud91b\u4e58\u804c\ub939\u4dd8\ue049\u1796\u1b87\u28c3\udea9\u1578\u1fea\u5cc7\u0379\ud877\u1137\u2b1a\u45e3\uc00f\u2ad4\uf286\u883e\ub7d4\u1346\ub53a\uce79\uc43a\u8697\uc100\ua8f5\u8f99\ue8cf\u42af\u1cab\uac78\ua481\u436c\u2832\u20cc\u18cb\u93d4\u1ce6\uf30d\uad7e\ucb81\ucd3f\u9bff\ua36d\u1c46\ucdb7\uf38c\u3be1\u0a3d\u30e3\u2dcf\u2e40\u2a77~\u26ed\u6580\u6f0b\uaa7f\ud05a\uca78\ue4ee\u92c8\u57a3\uc756\u3e0c\u4a13\u60dc\u2bb8\u36f8\uf6f0\u9622\ud65e\u3d35\uea3c\u3aee\u182a\u44b5\uf0e5\u9229\u4dee\u0375\ub87e\udc0d\uebdd\u22a2\uad89\u106b\u789e\u760b"],["error","\u1253\u427b\u42a5\u5c6f\u531d\uc76c\u1a20\uf3a4\u0801\u0e4a\ub0e0\uc6d7\u1582\u2f42\u4c33\u58e7\uf830\u93e7\ue509\ua9b9\u60e1\u6d71\ub872\u0bd1\ue6df\u7fec\u1f46\u1211\u9349\u1cb1\u1abe\u1848\u53d8\uf9cb\u05b3\uf616\ud9db\ud7d4\uc567\ua65f\ucd41\u966a\u5a32\u9f05\u31fc\u1442\u3760\u47f4\u9c31\ue4fa\u39bb\ub837\uc9ac\u2108\u1265\u1393\u91a2\uc182\ub300\u4add\uebed\uf4a5\u6a48\u93bc\ue800\u8742\ufe41\ue2d4\u3432\u89f7\u229f\u0376\u9d8a\u05e7\u7d44\u586a\u99ba\ua043\u97dd\ud85c\u6754\u3c0e\uac78\u78b4\u9b12\uf1bc\u7318\u2c17\u101c\u174c\ub29d\ue9c7\uf6a4\u0fa9\ua53c\ud160\u2504\u11f0\u9f6a\uf372\uf208\u3e15\u3076\u2c89\u37c4\u9a7f\ud782\u3372\u93ff\udaec\u44f3\ud4c4\u5404\u0f4f\u2d63\ua977\u2884\u520b\ufd8c\u2b56\ub7d9\ued24\u4e4c\u920a\ucbda\u23f8\udf02\u5d7e\ud124\u3ea6\u1933\ua440\u7b39\uef3c\u023e\u1fab\ua132\ud4f0\u85e5\ubc21\uf321\u7b95\u0383\u7393\u092e\u112a\u57ae\ub9cd\uffab\u4979\u48e9\u04ed\uc55c\u6656\uf531\u286c\ufc11\uc7cc\u9362\u6516\u0259\u6f35\u0d9d\uea31\u1be8\u000f\u2927\u06ea\ubfbc\ucd92\ubd04\ub964\u0c3d\u0e92\u2f08\u243e\ua4e4\udd00\u55fe\u77b4\ub4af\uf336\u1191\u9e43\u431c\u8a52\u6bd7\u0a1a\u8728\uea55\ufe8b\u6a28\ub73b\ua875\u543e\u7e2e\u2f21\ufa8f\ud911\udc09\ufaea\u35a6\u9968\u4a65\u9a48\ue949\udc87\u33bb\u0f93\ufde1\u5021\uc841\u7736\uadfc\u315f\u642d\ua9a8\u6ab8\u1478\uddc7\ua155\u8cb7\u46ca\ud1ff\uf726\u9cb3\u2c5f\u4d29\uf3c4\ua934\u75a7\ufaa9\u183b\uf2b6\ub654\u9320\u6d4a\ue70c\uac3d\u4dda\u1808\u40f4\u2447\ub741\u4928\u8bdf\uf468\u1baa\u8371\u370f\u2c43\u0af4\uf438\u3dce\u0d5f\u7610\u01c8\ufff9\u04b1\udcaa\u6854\u0cf9\u44f1\udfbe\u79db\u83c7\u5947\u4e20\ua60e\ubb8d\ua0cb\u8e3f\u2b19\u91dd\u922e\u68cf\udec5\u781c\u255c\ud7aa\ub2f4\u8d0e\u91e5\uc5af\uc575\u7dea\u0c5d\u9f2b\ue6bd\u5048\u8256\u3bf3\u0d8e\ud3da\u3405\u37fb\u59d4\u6c47\u308f\u36fc\u7d92\u47a8\u5c86\u3316\u9d00\u1844\u5b70\u758c\ub5a9\u26d9\u49e9\u2283\u1587\uefa5\u5f25\uf45e\ubed6\u8685\uc7ee\u6b7b\u8e27\ua051\uff38\u1dcc\ud620\ub583\ua126\u447d\ucadb\u9adc\udb27\uaa8e\u3e3c\u6dac\u4656\u454b\ubc75\ud0b1\uc2d1\u698e\ufa11\uc90d\u0811\u5065\u4d6f\u7b9a\u7442\ubd1a\u05a5\u349c\u5cfb\u311c\u5094\u52db\u9d33\ua1ed\u7362\u56df\ub1a6\u8aa2\u7e70\ud3b6\u78fb\u66b3\ua882\u60c2\u674a\u5927\u5cf1\u693a\u49b4\ud14f\uf6dd\uf90d\u0b0c\u6e2b\u3027\u3cc6\u43cd\ua999\u2c86\u1024\u85c1\ud243\u69b6\ueb93\ub604\ua887\u6974\u5f7a\ub37b\u8236\u424f\ud692\u87ee\u0632\u43dc\u5863\ueae7\ua770\uf34c\ud24c\u2197\u0a98\u1845\u8d3a\u745d\ue316\u52c6\u455d\u94ca\u2bc6\u9a28\u0ef1\u09ad\ufa71\u2f30\u1bb9\uf990\u9b7c\u26f1\uc1b8\u657e\ub47e\uefcb\ua120\u5061\ub91f\u29b4\u0b72\u68fc\uf025\u0c6e\u46df\u77fd\uad9c\ucf1b\u91f7\u3653\ue09a\u18ff\u828d\ueb1b\u0ad8\uc923\u66a1\u6234\ua683\ua6fa\u2f5e\u30e1\u0e37\u3899\ufbc5\u5259\ufe5e\u5bf3\u0e82\u6e8d\ubc44\ub457\uc6b5\u3859\u711f\uabfa\u1632\u8087\ub7e1\ubf77\u72c8\uad23\ue054\uee27\u3749\u13b7\ucc4e\uc989\ufdcb\u47f0\u2312\ue3b8\u8c5b\ubeec\udd1f\u24bc\uc2c4\u1554\uce45\u526c\u98dc\u1e76\ubce9\u7d99\u85bc\ueec2\u8ce5\u638c\u1e8f\ubc0c\u972b\u0cda\u8c27\udca4\u74af\u1c03\ud7fb\u2aa0\u27d7\ud5ac\u4409\ud2bd\u2465\ufdc7\u56c6\uca40\u1337\ufcea\ua3e5\u78a9\u4d63\u1927\u5919\u442a\u90e4\uda61\u2911\u4b9d\udfab\u8b28\u865c\u64b9\u58b7\u0b39\ue98a\u6cfc\uc013\uae55\u9566\uf3a8\u903c\u16b4\u63fa\u6f3b\u3127\ue2f5\u1db6\u727e\uec2f\u6cc8\ue57e\u3fe5\u3a17\u1ac8\u7d40\u1609\u5119\u8af8\u3e5a\ua70e\ufda6\uacf1\ud5be\u5a70\udcec\u420d\ue6b6\u60af\ua46c\ubd5c\u2d95\u69cf\u57e9\ub508\uf81d\u8b91\u020e\uebe5\u2148\uc6c0\u7b9b\u8f02\ud252\u2273\u0e22\u6f27\ue41b\ua3ea\u6593\u2009\ue7b8\uc533\u3ba0\ud9d5\ua8d9\u3ba9\ubdef\u5e3e\u3181\u0bbb\u7425\u2684\u0f89\u0848\u0bae\u75c3\uad5e\ua3c8\u04dc\u34eb\uaf17\u9180\u5edd\ub971\u9962\uf91e\u51e7\ue92f\uf386\u6192\u5b3b\u7e64\u7da8\ubfce\ud637\u5cd3\u014e\uf27e\u32d5\ud050\uaad3\u7304\uc3be\u9287\ua34b\u8d39\u7bea\u7629\uae3e\u8caf\u6bdf\u8807\u4be8\u357c\uedf2\u0684\ue90f\u5f8c\u28e1\u1e68\u4990\ucc8f\ufffc\u18b7\u2a64\uc6ce\u25df\u44fe\u4711\u667a\ua00a\u759d\u0944\u28ea\uc2e4\ue602\u4c48\u45ae\u7acc"],["fatal","\u9ad1\u40d3\u8b2e\uc72f\u4e92\ub1e6\udc78\uae2f\u5729\ud2ec\ua6f0\ud046\ud347\u2532\u33ce\u9736\u0e4e\uec88\ueb0a\ua83f\uf6bd\u3d72\uc95c\ud565\u9708\u2cea\ucda2\u103e\u5530\u26db\u750a\u968c\u69f1\u18b3\u0905\u84be\u432e\u4743\u165c\ub6d3\ucb6d\u6b9c\u5088\u2b36\uf2d5\u6bb3\udd35\u94aa\u1eae\u40aa\ud85c\u7372\ubef0\u0262\ua0ef\u8462\u89e9\ud937\u7f5d\uceed\u6fa2\ueb2b\u2490\u20eb\u5a42\ub306\u14da\uefe0\ud81f\u23e2\u1a35\u9fbe\ub1a8\u2497\u7479\ue3c4\u82e5\u844f\u37a4\u112c\u4d19\ufa61\uaedc\ufb33\ud1b3\ua8aa\uda06\u9ff3\u08cd\uc0b4\u0b7d\u83db\u35c9\u03b2\u513d\u9866\u7391\u14f1\u2a04\u94ef\u69bc\uaaed\ue7c5\ue528\u6cd6\u37c1\uef29\ue9ae\ud7fb\ucf6c\u2f31\u8f1c\u9121\uefcd\ud1ee\u69ca\u5a01\u5e0b\u9ce7\uf614\u47d5\udb97\u17d3\u14ef\ub7d4\u4f04\u80ff\ucbb0\ucbb4\u077e\ue86a\u088c\u0710\u3a79\ucebf\ueb3e\u970a\ub4b7\u6056\uc68a\uf48e\ufc1b\u87d0\u162d\uad1e\ud19f\ud4f5\uc2ac\u69c2\ud8de\u357c\udd1b\u99c0\ua3a6\u0a37\u3d69\u9cfb\u257f\u6a0e\u9b5b\u3f48\u63af\u2c0d\u34b9\u6ff8\ua3dd\u55f3\uc31a\u4441\ufcaf\u5813\u1160\uce19\u09bf\ude69\u0619\u7986\u0ae0\u7261\uad37\u1d16\uc88c\u25e1\ub664\u234a\u7b01\u5e23\uc2bd\u2663\u7ed1l\u1b94\u2006\u51f6\u5c78\u6b9a\u589b\uf1d9\u8438\ub087\u2713\uc8f1\u4def\uc468\ud9e4\u8ddb\u58be\u949a\u7380\uaff5\ucd1b\u7122\ue19b\u1ba6\u7bbc\u4e47\u6210\uf123\u28d8\u3dbc\u4fff\uae9c\ud3f0\ucdcd\ua348\u22ed\u4a8a\u7ce2\u9bf6\u12f7\u870e\u0dff\ue60d\u154f\u539d\u961b\ucf11\u851d\u2777\uaa52\u98e6\u35bb\u6f0b\u8119\u6043\u4850\u511d\ue2a5\u2453\ueac3\u3a04\u0082\ue4b4\u848a\ubbec\u4f6e\u349f\u6771\u3c81\uada7\u73df\u5a5b\ub510\u8016\u06ac\u4bb4\ucedc\u50be\u36ea\u13ba\u9349\uca8f\uca69\ub347\u85e9\u62e6\u9e88\u604b\u1a6b\uddd4\u18ba\uc783\u9e3f\u86ee\ud30c\u26ec\u2783\ub252\u247e\ubc93\u0352\ua6b1\uf2c1\ube84\ud43a\u2420\u2b2d\ub33b\ud3c8\uf1ef\ue435\u3f91\uc6ee\u688f\u34a2\ud776\u080c\u1621\u7a77\uda72\u5e2a\u0ceb\ua021\u6605\u7338\u67eb\uf0a9\u1fbe\ud7fa\u0d84\ue96a\ud316\u793b\u43ef\ucc6b\ub10c\ub979\u849c\u5230\ufaa4\ub927\u3a5c\u11ae\u2ea1\u4c3e\u3d1a\u1aba\u6f21\ue944\u9dfc\ube11\u1a59\u382d\u5f0f\uec1f\u61b2\ue49e\u4baa\u6718\u81c7\u62bd\u5393\u36c1\u7f59\ud480\u03c7\u9d12\uee1d\u8a6b\u0ea1\u9e35\ub3fe\u242b\u6f1e\u7ecb\u3c1c\uad45\ub186\ud672\u0b40\u079d\uf50c\u5e21\u0209\ua678\u56a6\u3abe\u597e\ufd41\u39c3\u54d6\u317c\u753d\udf54\u1267\u06aa\u4529\ufbe8\u1517\u4f32\ud3bb\uc323\u6a14\uf199\uf2dd\u2940\ua357\u8039\u6036\u829c\u411c\u5ee2\u499d\udc31\u8c46\uba67\u8d52\u2cf7\u8998\ua6ba\ud517\u19d0\u8cdd\ua520\u4741\u6324\ub6ee\ua3d5\u7b8a\u9985\ue893\u11b4\uedea\uff46\u06ba\ue807\uc99a\u82ec\u55e9\u8782\u3fc5\u72b4\u1a61\ub565\ued42\u4b84\u3dd9\uf8b7\ufcf5\ua75a\uf5db\u3240\ub7ea\uf59f\ua1ca\u180f\u840a\ue4dc\ua02a\ud18d\u001a\u0625\uaa5f\ueccd\u13a0\ubfdc\ua174\u129b\u1b61\u855f\u5546\u1474\u850b\uf259\u7673\u91d0\uf260\u93cd\ue687\u7ebf\ubc4c\u7747\ub685\ue6be\uc1cc\u9a4b\ub14b\uc19c\ua4e3\u905e\u88b0\u687d\u4805\ue84b\ud025\u2044\ufc2c\u7ee5\ub4a6&\u83d4\u6d9a\u2d08\u221d\u00cd\u84b8\u575a\u177a\u8694\u858a\u3a40\u0f02\ueb8a\ubce6\u98c3\uf495\uef8f\ubffe\ub6a3\u1bf5\u0f0c\u7c07\u36a9\u46b2\ua913\u7899\u572f\u9458\u62c8\u7609\u205c\u2b66\ue4ce\ud533\u0d88\u3981\uace1\u72a8\u4a0b\u7159\ua17c\ua965\u5744\u11fa\u4bde\u1081\u6fcc\u0238\u395f\u4b58\ud7c5\u237d\uec84\uf623\u56ea\u5bbe\u383d\u24bf\u7b08\u7779\u3f42\u86fe\u25d4\u7a63\ucad9\u3e2a\u11b1\u1c6c\u0d40\u8869\u9720\u403f\u57e9\u82a6\u26b9\u738c\ua5c3\u4687\uec93\ue7ec\u8c78\u04c5\ub076\u4f0f\u97d7\uca3f\u1a1d\u9924\u7b29\ub85d\u7f8e\u9289\ub4c1\ud977\ud5b7\uca06\u5922\u8def\u9a41\u883b\u0b3f\ud540\u3b43\u06f9\ud0d0\u286b\u019d\ud6c4\ub60a\u555b\u6c82\u2601\u1a0b\ub049\ub4b2\ua37d\uf1de\u4c3c\u2ae0\u70d5\u6796\u9596\u242d\u95d8\u3efd\u32a3\u62f1\uf90e\uf19d\ud3d5\u905f\ub305\u9269\u9ba3\u8e9f\u9c02\u341e\uf878\u9425\u60a1\ua4ca\u8f38\u9605\u3292\uf6bb\u3332\u7f2e\ue36c\uf5b8\u713d\ud50e\u8360\u8e65\ueba7\ub842\u940d\u027e\u7ef2\u0c60\ufeb3\uc679\u559c\u9719\u13e3\u9be8\ub2ef\u3bb1\ub11c\u1766\u3db8\u9a71\u5966\u6b1c\ufa15\u18f8\u6476\u46ad\uaa38\u8969\u4ff3\uafdb\udc73\uf7a4\u08a8\uc4bd\u8142\u0128\u787e\u9035\u955f\u50a9\ud0e3\uccb6\uebc1\u13a2\ue0c0\uc341\u5fe5\u0b67\u4eb4\u4a4c\u5b30\u6d68\u8636\u8f23\u6e38\uf00c\ub5f5\ud40b\ua462\ua257\u307e\u388d\u0585\uf745\ubd6b\uf3d2\u89c5\u8786\ue880\ue3ea\ued16\uffcb\ue08f\u4986\u11c9\u3ed8\u46ee\u07b6\uf99a\ud701\u2125\uf723\ua79a\u3a8d\ub2b8\u5955\ub620\uc43d\uce25\u3ff6\uc3f4\u089e\u8fcc\u2d98\ucbaf\u49ff\u289d\u68e9\u1e0c\u7ef1\u9907\uc59e\ud0ea\u3438\ub6eb\u994b\uc3f8\uae71\ub38c\u35ad\u47f7\u5221\ub6e0\ufe3d\ubef1\u46fd\u5160\u57bc\uab8f\ub68e\uad5d\u9101\u6742\uc136\u208e\u6cfd\u61b6\u9ae2\ud542\u851c\ue33f\u16e6\ud391\ua9d1\u80b4\u1e5a\u87e1\u6937\u20c1\ub863\uceb7\u0fe4\ue4af\uca38\ub96f\uc832\u9743\u5af8\udd7a\u6ed8\ua0d1\uc868\u1d90\u2fe2\u1c52\u2d3d\u702a\u1be1\u3a09\u2557\u20bc\ud68b\ua6cc\ubddb\u355f\u531a\ue97f\u45c6\u986c\ued18\u3c53\uaceb\uc3b4\ueb08\ub87f\uc772\u7771\uff47\u450e\u1cf6\ua62d\u8ffd\u17ae\uec3e\ub2ba\ud376\ua4f2\ubaa9\uf8b8\u83e0\ufa47\u1b98\u1dcc\u2127\u8fe8\ud54c\u3681\uc0bd\ufc3b\udbf2\u9f89\ubda1\ucfa5\udd87\u07fb\u50e5\udf2e\u4dac\u69e9\uc824\u0a0e\udacb\u0d18\u547d\u4fa7\u8d53\u12cf\uf94a\ude62\ub7a9\u3a6a\uf0ff\u23ce\uaf6f\u6d60\u5a4b\u6220\u7476\u3b47\u1c97\uee82\ua687\u5b6c\u896c\ubf9d\ua394\ueed6\u4bc1\u3fb6\ue689\uab37\u1066\u7974\u80ed\u26d1\u7257\u9959\u7091\u890d\u0e83\u57ee\u29e5\u4ffd\u6852\u050d\u948c\uf3fa\u5b3a\u896e\u45b4\u439d\u45df\u1d6aT\u609c\uca0d\u4cd9\u6950\ub2d4\ueec4\u418a\u2c5c\u0587\ueeac\u4398\uca59\uc6da\uaf0a\ua2e3\u80d7\u77b2\ufdbd\ua9b9\u2360\u39da\u95ea\u0190\ub7ef\uab8a"],["info","\uffe6\uad00\u167d\ud0ef\uf505\u294e\u6efa\ub08e\u4245\uc402\uc98a\uda36\uc27c\ub3c2\u2a44\ue7c4\u32a7\u6f8d\uce3a\uce23\ubd9b'\u24de\u1374\ubbef\u9313\u8c93\uc6dd\uea3b\u0b4e\u79d4\ubf10\u917e\u52f7\u80a3\ub47b\u7bfb\u1479\uf79a\u63b1\u94f9\u8871\u6bc5\uba0d\u6cdc\u06f9\u5de4\u0ece\u98e6\u56fa\u694f\u1b4c\u3aae\ua3c0\u2747\ue9bf\u3264\u0997\uc651\u3ae9\u343e\u98c9\uba91\u6969\u4feb\u9db5\uc627\ue8a8\ue199\uc03a\ua4c3\ufd77\u09fe\u48a7\u048a\ue790\u78f6\u7d8f\u9cbf\u6f14\uf29f\u11e5\u860d\u90e2\u068b\u224a\u2189\ua5f7\ua157\ucf2e\uae7f"],["warn","\ud420\ue097\u9890\u11d9\u1161\uddc3\ua93f\uc714\u02b9\u2e36\uc6f8\u075d\u5df5\ub660\u355b\u6e43\u43d7\uace1\u55da\u1a15\u20e1\u4bec\ubd4a\ud675\u499c\u2d4e\u5b8e\u4751\uf9be\u808c\u14af\u524d\u82d5\u8d8d\u306f\u332e\ub9bd\u1e06\u94b5\u17a8\u1db5\u26e6\u4821\u25e4\u56c3\u0e93\u0845\ue6d4\uc07a\u644a\u9fe7\u2dbf\u4b5f\ud5c8\ub57d\u6f54\u8d32\u6f76\ue2c5\ud8c3\u2b0a\u3f7b\u14aa\u834a\uf62f\u1370\ubefd\u0fcc\uf337\u5e3f\u9658\ua636\u4ed3\u5e9e\ubd59\u2777\u7e78\u0624\u2d3e\u0dab\u69ad\ue6e3\u9d02\ub91e\u1360\uc609\u9a31\ud6f6\u80ab\uf382\u7f53\ud4a1\ud9e4\ub8df\ua35f\u9512\uc05e\u44ec\ude71\ub438\uf8a8\u06e8\ua1e4\u59cd\u95e8\u272c\ua551\u22b0\u497e\u953a\u447d\uf762\u7ddd\u926b\u2eb0\uc140\ucc94\ue6e6\u27e8\u80ae\uf1c3\u312b\u06b1\u7cbf\ufdc8\ud263\uc229\ud377\u8e39\u03b4\udccd\u3e6f\u2e90\ub043\ub78a\u8576\u97fa\u1efb\ue0da\u7704\uae84\u70fb\u1385\uf6f5\u3e53\ud1e5\u502c\u5cb6\u2255\u6169\uf264\uea5f\uf8b2\u6b68\u7381\uf8e1\u8d3b\u26ce\u471e\u100c\u0c78\u489a\u600d\u634a\u0548\u6e0b\ub9ee\u8696\u4c93\uaf62\u2e15\u7e3b\u94e4\u1525\ud330\u507e\ue431\u6b89\u9e70\ud841\u4271\u620f\uf827\ucb86\u42aa\uc7ab\u32f6\u7f19"]],"metric.metric-1":[1,2,3,4],"metric.metric-2":[5,6,7,8]},"finished":true}_serial,__mv__serial,_time,__mv__time,random_bytes,__mv_random_bytes,random_dict,__mv_random_dict,random_integers,__mv_random_integers,random_unicode,__mv_random_unicode 30,,1443154423.18,,>sЗ6LOK;3QN4ՄŒ 5Džvo Ǚ*ݓ/,,"{""a"":4.485629169067438e+307,""b"":""\u3405\uc56e\u1656\u3f3e\u14ec\u6e7f\u0bf3\u398d\uf960\u3e3b\ub0a4\u4108\ud039\u1daf\u8b4a\u7fcd\u7c3c\u8146\u9537\u2af9\u45ba\u7b57\u3549\u936b\ued65\u3940\u21d8\u4e54\u6cce\uc465\u580c\ue3eb\u7bbc\u86ef\uf546\u038f\u9b08\u6da4\ubd60\udb28\ubfa6\u5614\uf069\u4f23\ube9a\u5c6f\u0680\udcf0\u5c25\ubdb8\ua6aa\u5010\ub56b\u82d3\u892d\u6b66\ua0d1\u76ed\u2726\u51cf\u392b\uf56d\ua421\u44ed\u29fd\udc47\ub6a0\ue891\u574b\udb44\u1e9b\u66cc\u48f8\u44e6\u3c6f\u82ff\uaab0\ua21d\ue2d1\ueaf4\u8976\ub000\uba03\u194f\u1865\u6f45\ua6c6\ue2d3\ub77e\uffed\u9fb8\u436f\u3211\ubeee\udb45\ue5b9\u8403\u2a25\u0319\u1cf2\ub25d\ue1de\u02ba\u6acf\uf5c6\u2fc8\u17ec\ud19c\ua025\u4f28\u01b2\u39d3\u17ee\u3a6e\u76bd\u8d5b\u370e\u6bee\u1029\ua211\u3f9b\uc0a8\u6386\u25b3\u4311\u3bb0\ue012\u7cd9\u2136\uc37e\u376e\u86fb\u15a3\u4035\u8c44\u11cb\uc184\u22a8\u423f\u9959\ufe30\u9169\u1443\uecd0\ua5bd\u46e6\ub573\u2aff\u18dc\u38ab\uf435\u8319\uc25c\u64d0\uee25\u78e6\u6dba\u3f68\ucc48\u0f39\uea80\u26b3\u4ebf\u5124\u0c1e\u325c\u4f86\u28bc\ub5f2\u2cb1\u86f2\u1225\u5570\u7f0a\u41d5\u7a93\ud402\u8dae\u0f67\u99b7\u11cc\u419a\u1550\ue362\u4639\u3415\u7b9a\u836c\u3f29\u951e\u3ec6\uce4c\u9101\ua824\u3cbc\u03d9\u60c7\u41c3\ua221\u6d20\u1969\ue59c\ufcbb\u240e\ue4ad\ub1a7\uf952\ueeba\u5f1c\u56c9\u0c39\u13b2\u9962\u539b\u894c\uf067\u80b0\u57ee\uedbf\ubce0\u8998\u3864\ua2f2\u462a\u42ac\uba5e\uea38\u3731\udf21\udf4c\uf150\uf0a5\u9618\u594a\u14a5\ude34\ue549\u326c\u2917\u4293\u50b7\ua91e\u35af\u3900\u59a8\ud1f0\u4938\udfc8\u9178\u7d86\ud921\ude1d\u23f9\u785d\u4725\u70a8\u2b75\u1676\uf424\u11a2\ua8ec\ua3ec\u9af8\u3293\ud7a9\ue794\u1acc\u2848\u08c7\u043a\u9b13\uddfe\u702e\u88c6\uabc7\u238a\u9a86\ud606\u5e61\u8a6b\u97d0\u30ef\u0cc8\ud605\uac35\ud761\u9ea9\u1cf6\u8418\uf252\u3381\u85a3\u8d76\u66b2\u7418\u3223\u8d93\ud58b\u84c8\u450d\u2f77\ua87c\u03cd\u57dd\uc20d\uf3a9\u3adb\u412c\uab8a\u7988\ubf1c\ub276\u4d89\u8993\u09da\ub179\uf21c\u8605\u00b5\u3326\ud88f\u11d5\uf1bb\u58e6\ufbb6\ud0c8\u2c43\u4dda\u5b28\u0729\u6abf\u22ac\u390c\u4394\u0331\u0a0d\u9335\u2c71\u4734\u8996\u672a\u1f58\u5386\u46b4\u47f4\udbd4\ub64b\ua839\u4a1e\ua3f8\uae9e\ue0c7\u30a6\u9fbf\ua56c\u0575\u6f02\u2680\u7125\uc100\ud8db\uebd6\u7bd6\u191b\uf298\u252d\u7d03\u0ad2\u8b2d\uc154\u9c36\ubfad\ub526\u70a4\u1cc3\ud8b2\u7670\u97c6\ue4f6\u4a6f\u359d\uac7e\uaa06\u7cb6\uce57\u1fc5\u1f44\ue464\u0fa1\u9999\uf8c3\u5de9\u227f\u4843\u9ebc\u8ecd\u66fe\u1447\u6b54\uce05\uaabf\u7a28\ub1df\uea6b\u090e\u5a6b\u65c1\ufc8f\ued10\u0a08\uf01d\uf427\u4024\u2f6e\u9147\u77c0\uc7e5\u0d31\u12d2\ub0e4\u90a7\u6b0f\u94fc\u4864\uec2c\ued55\u7a32\u236f\ud4e1\u15a9\u3f64\ub664\ua98e\uc0a7\u118f\ub9fd\ue961\u5f2e\ud213\u5b26\ubde0\u2067\u9e1f\u2d12\u3e86\u9f5a\ufc7f\u27fa\u6459\u9e06\ua99d\ub1d1\u5d5f\u8aa6\u59c9\uf766\u6b4f\u18a7\uf7d6\ua59e\uaa4f\u9ece\u9e99\u34f1\u7de4\u9b8c\u0f85\u4b7d\uf52b\ub1da\u3f12\u18c9\ud532\u0aab\uc84d\ud755\uaef9\u3347\u1179\u9572\ub008\ub927\u8621\uaac9\u50d5\u7e56\u0821\u0afb\u9809\ub7e7\u0f6b\ue913\u3a0e\u646a\u4c3e\u4a51\uca65\ud576\u48b0\u8307\u9621\ue4eb\uc24c\u8c73\u11a0\u1ab2\ucad9\u7f76\u0bd6\ua352\u8fee\ude7c\uc000\u3fb1\u1522\u3f47\u4014\u13e9\u1af0\u7211\ua79b\u4abe\ud850\u1f5d\uf8b9\u61a0\ub5af\u58bb\ub0b2\ua390\ua74a\uff94\u4a3e\ud7e9\ub903\u7a67\u02bc\u4a88\u310e\ud371\ub26b\u576d\u0f97\u4277\ue5cf\u8597\ubd30\u1d94\ucc23\u1ecf\u805a\u9071\u7046\u45e9\u02ea\u2132\u2100\u5b1b\u3333\ubb6d\u1c9f\ueda2\ud956\u1e33\u4931\u7e2a\u8417\u0012\u4f6b\u7e47\u26e4\u490a\u277d\uc810\u50f1\ud7f7\ub5ae\u81cb\u7c08\u4edc\u6c4a\uc3ed\uc83b\u5683\u05b0\u26b7\u86c1\u231f\u066b\u7f0f\ude80\ua172\ua10c\uf8ca\ub924\u51b2\u4202\ubeaf\udd14\ua8d5\uf520\u7b56\ue6a2\u5c4a\ub72d\u6737\u4d76\ub75e\ud5a3\ub742\u1592\u3bfc\u729c\u998d\u2643\ub2d4\u4bf9\ub907\u5f9c\ue54b\udc07\u6cd9\u7556\u5d1a\uc901\ue299\u75ed\ub8e4\u5e0c\ud3ae\uc6e8\ub381\u3a96\u2a58\u00a6\ub981\u1ff1\ue849\u8bf7\u071c\ue57a\u0f9b\u61d2\u8f00\u759a\u3a2a\u8f1f\ub31c\uf5ba\u3567\u42d0\uffba\uec29\u31ba\u5e15\u9477\ue86e\ufc9c\uf4a7\u51df\u2a74\uf1af\ua538\u602a\u7010\u01a5\u3c06\u18bf\u2938\u608b\uaf95\u1250\ufdc4\u5c5b\uc7b7\uade9\uf693\u624b\u13bf\u4cff\u6ced\u68e1\u0c5d\u72ee\u3e0b\u7c12\u4f76\ub6c5\u53d7\u83be\u6733\u0dce\ufbd2\u4b17\u0f7f\u59f0\u1486\u2a37\ue50c\ud06c\u38da\u3d40\ue802\u245f\u229e\u1073\u388d\ub3eb\udd3f\u1e3f\uffb7\u050d\u5d2f\u32ba\ued16\u47ee\ue14c\u648c\ud994\u9109\u39cc"",""\u798f \u9152\u5427"":{""fu"":1.3784681212841968e+308,""bar"":1.2184596174189031e+307}}",,"-1322536697583593472 -4210579812174846976 -417050970830199808 diff --git a/tests/searchcommands/test_internals_v2.py b/tests/searchcommands/test_internals_v2.py index 518c840cc..0d0f05e3c 100755 --- a/tests/searchcommands/test_internals_v2.py +++ b/tests/searchcommands/test_internals_v2.py @@ -227,10 +227,10 @@ def test_record_writer_with_random_data(self, save_recording=False): for name, metric in six.iteritems(metrics): writer.write_metric(name, metric) - self.assertEqual(writer._chunk_count, 3) - self.assertEqual(writer._record_count, 1) + self.assertEqual(writer._chunk_count, 0) + self.assertEqual(writer._record_count, 31) self.assertGreater(writer._buffer.tell(), 0) - self.assertEqual(writer._total_record_count, 30) + self.assertEqual(writer._total_record_count, 0) self.assertListEqual(writer._fieldnames, fieldnames) self.assertListEqual(writer._inspector['messages'], messages) @@ -240,7 +240,7 @@ def test_record_writer_with_random_data(self, save_recording=False): writer.flush(finished=True) - self.assertEqual(writer._chunk_count, 4) + self.assertEqual(writer._chunk_count, 1) self.assertEqual(writer._record_count, 0) self.assertEqual(writer._buffer.tell(), 0) self.assertEqual(writer._buffer.getvalue(), '') @@ -251,7 +251,8 @@ def test_record_writer_with_random_data(self, save_recording=False): self.assertRaises(AssertionError, writer.flush, partial='non-boolean') self.assertRaises(AssertionError, writer.flush) - self.assertRaises(RuntimeError, writer.write_record, {}) + # For SCPv2 we should follow the finish negotiation protocol. + # self.assertRaises(RuntimeError, writer.write_record, {}) self.assertFalse(writer._ofile.closed) self.assertIsNone(writer._fieldnames) From bb0d71b93b9e083ed8b31a99e904cd3beb9fb83a Mon Sep 17 00:00:00 2001 From: Ivan Jager Date: Wed, 22 Jan 2020 12:04:05 -0800 Subject: [PATCH 11/21] search_command no longer sends a successful response on fatal errors --- tests/searchcommands/test_search_command.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/searchcommands/test_search_command.py b/tests/searchcommands/test_search_command.py index 1ebb29fb9..386b5bb65 100755 --- a/tests/searchcommands/test_search_command.py +++ b/tests/searchcommands/test_search_command.py @@ -643,9 +643,7 @@ def test_process_scpv2(self): '{"inspector":{"messages":[["ERROR","Illegal value: logging_configuration=non-existent-logging.conf"],' '["ERROR","Illegal value: logging_level=NON-EXISTENT-LOGGING-LEVEL"],' '["ERROR","Illegal value: record=Non-boolean value"],' - '["ERROR","Illegal value: show_configuration=Non-boolean value"]]}}\n' - 'chunked 1.0,17,0\n' - '{"finished":true}', + '["ERROR","Illegal value: show_configuration=Non-boolean value"]]}}\n', result.getvalue().decode('utf-8')) self.assertEqual(command.protocol_version, 2) From 390d32767643e7cdf39f9623a908bf9c5634de11 Mon Sep 17 00:00:00 2001 From: Amy Sutedja Date: Fri, 5 Jun 2020 14:12:46 -0700 Subject: [PATCH 12/21] Rename and cleanup follow-up for chunk synchronization --- splunklib/searchcommands/internals.py | 56 +++++++++++++++------- splunklib/searchcommands/search_command.py | 10 ++-- tests/searchcommands/test_internals_v2.py | 6 ++- 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/splunklib/searchcommands/internals.py b/splunklib/searchcommands/internals.py index d9fdf9e7a..41caceb32 100644 --- a/splunklib/searchcommands/internals.py +++ b/splunklib/searchcommands/internals.py @@ -35,6 +35,7 @@ import os import re import sys +import warnings from . import environment @@ -505,8 +506,8 @@ def __init__(self, ofile, maxresultrows=None): self._inspector = OrderedDict() self._chunk_count = 0 - self._record_count = 0 - self._total_record_count = 0 + self._pending_record_count = 0 + self._committed_record_count = 0 @property def is_flushed(self): @@ -524,6 +525,30 @@ def ofile(self): def ofile(self, value): self._ofile = set_binary_mode(value) + @property + def pending_record_count(self): + return self._pending_record_count + + @property + def _record_count(self): + warnings.warn( + "_record_count will be deprecated soon. Use pending_record_count instead.", + PendingDeprecationWarning + ) + return self.pending_record_count + + @property + def committed_record_count(self): + return self._committed_record_count + + @property + def _total_record_count(self): + warnings.warn( + "_total_record_count will be deprecated soon. Use committed_record_count instead.", + PendingDeprecationWarning + ) + return self.committed_record_count + def write(self, data): bytes_type = bytes if sys.version_info >= (3, 0) else str if not isinstance(data, bytes_type): @@ -555,7 +580,7 @@ def _clear(self): self._buffer.seek(0) self._buffer.truncate() self._inspector.clear() - self._record_count = 0 + self._pending_record_count = 0 def _ensure_validity(self): if self._finished is True: @@ -650,9 +675,9 @@ def _write_record(self, record): values += (repr(value), None) self._writerow(values) - self._record_count += 1 + self._pending_record_count += 1 - if self._record_count >= self._maxresultrows: + if self.pending_record_count >= self._maxresultrows: self.flush(partial=True) try: @@ -689,7 +714,7 @@ def flush(self, finished=None, partial=None): RecordWriter.flush(self, finished, partial) # validates arguments and the state of this instance - if self._record_count > 0 or (self._chunk_count == 0 and 'messages' in self._inspector): + if self.pending_record_count > 0 or (self._chunk_count == 0 and 'messages' in self._inspector): messages = self._inspector.get('messages') @@ -727,9 +752,9 @@ def flush(self, finished=None, partial=None): print(level, text, file=stderr) self.write(self._buffer.getvalue()) - self._clear() self._chunk_count += 1 - self._total_record_count += self._record_count + self._committed_record_count += self.pending_record_count + self._clear() self._finished = finished is True @@ -758,7 +783,7 @@ def flush(self, finished=None, partial=None): def write_chunk(self, finished=None): inspector = self._inspector - self._total_record_count += self._record_count + self._committed_record_count += self.pending_record_count self._chunk_count += 1 # TODO: DVPL-6448: splunklib.searchcommands | Add support for partial: true when it is implemented in @@ -766,17 +791,14 @@ def write_chunk(self, finished=None): # # We will need to replace the following block of code with this block: # - # metadata = [ - # ('inspector', self._inspector if len(self._inspector) else None), - # ('finished', finished), - # ('partial', partial)] + # metadata = [item for item in (('inspector', inspector), ('finished', finished), ('partial', partial))] + # + # if partial is True: + # finished = False if len(inspector) == 0: inspector = None - #if partial is True: - # finished = False - metadata = [item for item in (('inspector', inspector), ('finished', finished))] self._write_chunk(metadata, self._buffer.getvalue()) self._clear() @@ -794,7 +816,7 @@ def write_metric(self, name, value): self._inspector['metric.' + name] = value def _clear(self): - RecordWriter._clear(self) + super(RecordWriterV2, self)._clear() self._fieldnames = None def _write_chunk(self, metadata, body): diff --git a/splunklib/searchcommands/search_command.py b/splunklib/searchcommands/search_command.py index ef94f5a09..a093b7d96 100644 --- a/splunklib/searchcommands/search_command.py +++ b/splunklib/searchcommands/search_command.py @@ -776,7 +776,6 @@ def _process_protocol_v2(self, argv, ifile, ofile): # noinspection PyBroadException try: debug('Executing under protocol_version=2') - #self._records = self._records_protocol_v2 self._metadata.action = 'execute' self._execute(ifile, None) except SystemExit: @@ -951,9 +950,12 @@ def _execute_v2(self, ifile, process): def _execute_chunk_v2(self, process, chunk): metadata, body = chunk - if len(body) > 0: - records = self._read_csv_records(StringIO(body)) - self._record_writer.write_records(process(records)) + + if len(body) <= 0: + return + + records = self._read_csv_records(StringIO(body)) + self._record_writer.write_records(process(records)) def _report_unexpected_error(self): diff --git a/tests/searchcommands/test_internals_v2.py b/tests/searchcommands/test_internals_v2.py index 0d0f05e3c..bdef65c4a 100755 --- a/tests/searchcommands/test_internals_v2.py +++ b/tests/searchcommands/test_internals_v2.py @@ -229,8 +229,10 @@ def test_record_writer_with_random_data(self, save_recording=False): self.assertEqual(writer._chunk_count, 0) self.assertEqual(writer._record_count, 31) + self.assertEqual(writer.pending_record_count, 31) self.assertGreater(writer._buffer.tell(), 0) self.assertEqual(writer._total_record_count, 0) + self.assertEqual(writer.committed_record_count, 0) self.assertListEqual(writer._fieldnames, fieldnames) self.assertListEqual(writer._inspector['messages'], messages) @@ -242,16 +244,18 @@ def test_record_writer_with_random_data(self, save_recording=False): self.assertEqual(writer._chunk_count, 1) self.assertEqual(writer._record_count, 0) + self.assertEqual(writer.pending_record_count, 0) self.assertEqual(writer._buffer.tell(), 0) self.assertEqual(writer._buffer.getvalue(), '') self.assertEqual(writer._total_record_count, 31) + self.assertEqual(writer.committed_record_count, 31) self.assertRaises(AssertionError, writer.flush, finished=True, partial=True) self.assertRaises(AssertionError, writer.flush, finished='non-boolean') self.assertRaises(AssertionError, writer.flush, partial='non-boolean') self.assertRaises(AssertionError, writer.flush) - # For SCPv2 we should follow the finish negotiation protocol. + # P2 [ ] TODO: For SCPv2 we should follow the finish negotiation protocol. # self.assertRaises(RuntimeError, writer.write_record, {}) self.assertFalse(writer._ofile.closed) From b8f24afba2cf3293e9f3d67935f352593a24859f Mon Sep 17 00:00:00 2001 From: Amy Sutedja Date: Thu, 10 Sep 2020 12:35:08 -0700 Subject: [PATCH 13/21] Fix for incorrect merge in interaction between multibyte characters and protocol fix --- splunklib/searchcommands/generating_command.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splunklib/searchcommands/generating_command.py b/splunklib/searchcommands/generating_command.py index 1a05dc471..724d45dd9 100644 --- a/splunklib/searchcommands/generating_command.py +++ b/splunklib/searchcommands/generating_command.py @@ -204,7 +204,7 @@ def _execute(self, ifile, process): """ if self._protocol_version == 2: - self._execute_v2(self._as_binary_stream(ifile), self.generate()) + self._execute_v2(ifile, self.generate()) else: assert self._protocol_version == 1 self._record_writer.write_records(self.generate()) From 9badb9acd7bbf035f4756ff70c6a4c5330b7d1df Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Sat, 11 Apr 2020 14:49:05 +0000 Subject: [PATCH 14/21] Fix SyntaxWarning over comparison of literals using is --- splunklib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/splunklib/client.py b/splunklib/client.py index de2f53a16..39b1dcc34 100644 --- a/splunklib/client.py +++ b/splunklib/client.py @@ -1872,7 +1872,7 @@ def delete(self, username, realm=None): name = UrlEncoded(realm, encode_slash=True) + ":" + UrlEncoded(username, encode_slash=True) # Append the : expected at the end of the name - if name[-1] is not ":": + if name[-1] != ":": name = name + ":" return Collection.delete(self, name) From 98ab7bbd94eae05b1d393a61c6fdc1f042a15e88 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Sat, 11 Apr 2020 14:49:11 +0000 Subject: [PATCH 15/21] Fix deprecation warning regarding invalid escape sequences. --- splunklib/searchcommands/internals.py | 2 +- tests/testlib.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/splunklib/searchcommands/internals.py b/splunklib/searchcommands/internals.py index 41caceb32..f7146e289 100644 --- a/splunklib/searchcommands/internals.py +++ b/splunklib/searchcommands/internals.py @@ -75,7 +75,7 @@ def set_binary_mode(fh): class CommandLineParser(object): - """ Parses the arguments to a search command. + r""" Parses the arguments to a search command. A search command line is described by the following syntax. diff --git a/tests/testlib.py b/tests/testlib.py index c5a40648d..04006030f 100644 --- a/tests/testlib.py +++ b/tests/testlib.py @@ -184,7 +184,7 @@ def app_collection_installed(self): return collectionName in self.service.apps def pathInApp(self, appName, pathComponents): - """Return a path to *pathComponents* in *appName*. + r"""Return a path to *pathComponents* in *appName*. `pathInApp` is used to refer to files in applications installed with `install_app_from_collection`. For example, the app `file_to_upload` in From 1f0a07624f057515166e69a9c7310315ed30e07e Mon Sep 17 00:00:00 2001 From: Amy Sutedja Date: Tue, 22 Sep 2020 10:58:31 -0700 Subject: [PATCH 16/21] Update copyright years to 2020 --- docs/conf.py | 4 ++-- tests/test_kvstore_batch.py | 4 ++-- tests/test_kvstore_conf.py | 12 ++++++------ tests/test_kvstore_data.py | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 4755a4b89..3c7c43d4b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -43,7 +43,7 @@ # General information about the project. project = u'Splunk SDK for Python' -copyright = u'2014, Splunk Inc' +copyright = u'2020, Splunk Inc' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -95,7 +95,7 @@ # a list of builtin themes. # agogo, default, epub, haiku, nature, pyramid, scrolls, sphinxdoc, traditional -html_theme = 'default' +html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/tests/test_kvstore_batch.py b/tests/test_kvstore_batch.py index 816172167..14806a699 100755 --- a/tests/test_kvstore_batch.py +++ b/tests/test_kvstore_batch.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2011-2014 Splunk, Inc. +# Copyright 2011-2020 Splunk, 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 @@ -68,7 +68,7 @@ def test_insert_find_update_data(self): self.assertEqual(testData[x][0]['_key'], str(x)) self.assertEqual(testData[x][0]['data'], '#' + str(x + 1)) self.assertEqual(testData[x][0]['num'], x + 1) - + def tearDown(self): confs = self.service.kvstore diff --git a/tests/test_kvstore_conf.py b/tests/test_kvstore_conf.py index dd7028d00..a587712e4 100755 --- a/tests/test_kvstore_conf.py +++ b/tests/test_kvstore_conf.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2011-2014 Splunk, Inc. +# Copyright 2011-2020 Splunk, 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 @@ -54,10 +54,10 @@ def test_update_fields(self): self.confs.create('test') self.confs['test'].post(**{'field.a': 'number'}) self.assertEqual(self.confs['test']['field.a'], 'number') - self.confs['test'].update_field('a', 'string') + self.confs['test'].update_field('a', 'string') self.assertEqual(self.confs['test']['field.a'], 'string') self.confs['test'].delete() - + def test_create_unique_collection(self): self.confs.create('test') @@ -77,9 +77,9 @@ def test_overlapping_collections(self): self.confs['test'].delete() self.confs['test'].delete() - """ + """ def test_create_accelerated_fields_fields(self): - self.confs.create('test', indexes={'foo': '{"foo": 1}', 'bar': {'bar': -1}}, **{'field.foo': 'string'}) + self.confs.create('test', indexes={'foo': '{"foo": 1}', 'bar': {'bar': -1}}, **{'field.foo': 'string'}) self.assertEqual(self.confs['test']['accelerated_fields.foo'], '{"foo": 1}') self.assertEqual(self.confs['test']['field.foo'], 'string') self.assertRaises(client.HTTPError, lambda: self.confs['test'].post(**{'accelerated_fields.foo': 'THIS IS INVALID'})) @@ -87,7 +87,7 @@ def test_create_accelerated_fields_fields(self): self.confs['test'].update_accelerated_fields('foo', '') self.assertEqual(self.confs['test']['accelerated_fields.foo'], None) """ - + def tearDown(self): if ('test' in self.confs): self.confs['test'].delete() diff --git a/tests/test_kvstore_data.py b/tests/test_kvstore_data.py index 153cdd363..1551f1c69 100755 --- a/tests/test_kvstore_data.py +++ b/tests/test_kvstore_data.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2011-2014 Splunk, Inc. +# Copyright 2011-2020 Splunk, 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 @@ -61,7 +61,7 @@ def test_update_delete_data(self): def test_query_data(self): if ('test1' in self.confs): - self.confs['test1'].delete() + self.confs['test1'].delete() self.confs.create('test1') self.col = self.confs['test1'].data for x in range(10): @@ -73,7 +73,7 @@ def test_query_data(self): self.assertEqual(data[0]['data'], '#0') data = self.col.query(limit=2, skip=9) self.assertEqual(len(data), 1) - + def test_invalid_insert_update(self): self.assertRaises(client.HTTPError, lambda: self.col.insert('NOT VALID DATA')) From 26d61567cfc8925e6223ae76a76ff0e9894559c3 Mon Sep 17 00:00:00 2001 From: David Poncelow Date: Wed, 14 Oct 2020 14:14:26 -0700 Subject: [PATCH 17/21] Add docstring and tests describing how to add body to POST request. --- splunklib/binding.py | 5 ++++- tests/test_binding.py | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/splunklib/binding.py b/splunklib/binding.py index e7336f2a1..9675f3081 100644 --- a/splunklib/binding.py +++ b/splunklib/binding.py @@ -724,7 +724,10 @@ def post(self, path_segment, owner=None, app=None, sharing=None, headers=None, * :type headers: ``list`` of 2-tuples. :param query: All other keyword arguments, which are used as query parameters. - :type query: ``string`` + :param body: Parameters to be used in the post body. If specified, + any parameters in the query will be applied to the URL instead of + the body. + :type body: dict :return: The response from the server. :rtype: ``dict`` with keys ``body``, ``headers``, ``reason``, and ``status`` diff --git a/tests/test_binding.py b/tests/test_binding.py index c636656fe..ee46e959b 100755 --- a/tests/test_binding.py +++ b/tests/test_binding.py @@ -808,6 +808,47 @@ def test_connect_with_preexisting_token_sans_user_and_pass(self): socket.write("\r\n".encode('utf-8')) socket.close() + +class TestPostWithBodyParam(unittest.TestCase): + + def test_post(self): + def handler(url, message, **kwargs): + assert url == "https://localhost:8089/servicesNS/testowner/testapp/foo/bar" + assert message["body"]["testkey"] == "testvalue" + return splunklib.data.Record({ + "status": 200, + "headers": [], + }) + ctx = binding.Context(handler=handler) + ctx.post("foo/bar", owner="testowner", app="testapp", body={"testkey": "testvalue"}) + + def test_post_with_params_and_body(self): + def handler(url, message, **kwargs): + assert url == "https://localhost:8089/servicesNS/testowner/testapp/foo/bar?extrakey=extraval" + assert message["body"]["testkey"] == "testvalue" + return splunklib.data.Record({ + "status": 200, + "headers": [], + }) + ctx = binding.Context(handler=handler) + ctx.post("foo/bar", extrakey="extraval", owner="testowner", app="testapp", body={"testkey": "testvalue"}) + + def test_post_with_params_and_no_body(self): + def handler(url, message, **kwargs): + assert url == "https://localhost:8089/servicesNS/testowner/testapp/foo/bar" + assert message["body"] == "extrakey=extraval" + return splunklib.data.Record({ + "status": 200, + "headers": [], + }) + ctx = binding.Context(handler=handler) + ctx.post("foo/bar", extrakey="extraval", owner="testowner", app="testapp") + + def test_with_body_with_full_request(self): + class TestRequestHandler(BaseHTTPRequestHandler): + pass + + if __name__ == "__main__": try: import unittest2 as unittest From 04a94c0b180e03b3a60083619dfd4d6f344c9c6c Mon Sep 17 00:00:00 2001 From: David Poncelow Date: Fri, 16 Oct 2020 11:28:27 -0700 Subject: [PATCH 18/21] fix handling of body parameters in Context.post(...) --- splunklib/binding.py | 8 +++- tests/test_binding.py | 92 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 89 insertions(+), 11 deletions(-) diff --git a/splunklib/binding.py b/splunklib/binding.py index 9675f3081..e21da6e52 100644 --- a/splunklib/binding.py +++ b/splunklib/binding.py @@ -726,8 +726,10 @@ def post(self, path_segment, owner=None, app=None, sharing=None, headers=None, * parameters. :param body: Parameters to be used in the post body. If specified, any parameters in the query will be applied to the URL instead of - the body. - :type body: dict + the body. If a dict is supplied, the key-value pairs will be form + encoded. If a string is supplied, the body will be passed through + in the request unchanged. + :type body: ``dict`` or ``str`` :return: The response from the server. :rtype: ``dict`` with keys ``body``, ``headers``, ``reason``, and ``status`` @@ -1226,6 +1228,8 @@ def post(self, url, headers=None, **kwargs): headers.append(("Content-Type", "application/x-www-form-urlencoded")) body = kwargs.pop('body') + if isinstance(body, dict): + body = _encode(**body).encode('utf-8') if len(kwargs) > 0: url = url + UrlEncoded('?' + _encode(**kwargs), skip_encode=True) else: diff --git a/tests/test_binding.py b/tests/test_binding.py index ee46e959b..b34ab14ee 100755 --- a/tests/test_binding.py +++ b/tests/test_binding.py @@ -16,14 +16,16 @@ from __future__ import absolute_import -import time from io import BytesIO +from threading import Thread +from splunklib.six.moves import BaseHTTPServer from splunklib.six.moves.urllib.request import Request, urlopen from splunklib.six.moves.urllib.error import HTTPError -from splunklib.six import StringIO +import splunklib.six as six from xml.etree.ElementTree import XML +import json import logging from tests import testlib import unittest @@ -104,7 +106,7 @@ def test_read_partial(self): def test_readable(self): txt = "abcd" - response = binding.ResponseReader(StringIO(txt)) + response = binding.ResponseReader(six.StringIO(txt)) self.assertTrue(response.readable()) def test_readinto_bytearray(self): @@ -813,8 +815,8 @@ class TestPostWithBodyParam(unittest.TestCase): def test_post(self): def handler(url, message, **kwargs): - assert url == "https://localhost:8089/servicesNS/testowner/testapp/foo/bar" - assert message["body"]["testkey"] == "testvalue" + assert six.ensure_str(url) == "https://localhost:8089/servicesNS/testowner/testapp/foo/bar" + assert six.ensure_str(message["body"]) == "testkey=testvalue" return splunklib.data.Record({ "status": 200, "headers": [], @@ -825,7 +827,7 @@ def handler(url, message, **kwargs): def test_post_with_params_and_body(self): def handler(url, message, **kwargs): assert url == "https://localhost:8089/servicesNS/testowner/testapp/foo/bar?extrakey=extraval" - assert message["body"]["testkey"] == "testvalue" + assert six.ensure_str(message["body"]) == "testkey=testvalue" return splunklib.data.Record({ "status": 200, "headers": [], @@ -836,7 +838,7 @@ def handler(url, message, **kwargs): def test_post_with_params_and_no_body(self): def handler(url, message, **kwargs): assert url == "https://localhost:8089/servicesNS/testowner/testapp/foo/bar" - assert message["body"] == "extrakey=extraval" + assert six.ensure_str(message["body"]) == "extrakey=extraval" return splunklib.data.Record({ "status": 200, "headers": [], @@ -844,10 +846,82 @@ def handler(url, message, **kwargs): ctx = binding.Context(handler=handler) ctx.post("foo/bar", extrakey="extraval", owner="testowner", app="testapp") - def test_with_body_with_full_request(self): - class TestRequestHandler(BaseHTTPRequestHandler): + +def _wrap_handler(func, response_code=200, body=""): + def wrapped(handler_self): + result = func(handler_self) + if result is None: + handler_self.send_response(response_code) + handler_self.end_headers() + handler_self.wfile.write(body) + return wrapped + + +class MockServer(object): + def __init__(self, port=9093, **handlers): + methods = {"do_" + k: _wrap_handler(v) for (k, v) in handlers.items()} + + def init(handler_self, socket, address, server): + BaseHTTPServer.BaseHTTPRequestHandler.__init__(handler_self, socket, address, server) + + def log(*args): # To silence server access logs pass + methods["__init__"] = init + methods["log_message"] = log + Handler = type("Handler", + (BaseHTTPServer.BaseHTTPRequestHandler, object), + methods) + self._svr = BaseHTTPServer.HTTPServer(("localhost", port), Handler) + + def run(): + self._svr.handle_request() + self._thread = Thread(target=run) + self._thread.daemon = True + + def __enter__(self): + self._thread.start() + return self._svr + + def __exit__(self, typ, value, traceback): + self._thread.join(10) + self._svr.server_close() + + +class TestFullPost(unittest.TestCase): + + def test_post_with_body_urlencoded(self): + def check_response(handler): + length = int(handler.headers.get('content-length', 0)) + body = handler.rfile.read(length) + assert six.ensure_str(body) == "foo=bar" + + with MockServer(POST=check_response): + ctx = binding.connect(port=9093, scheme='http', token="waffle") + ctx.post("/", foo="bar") + + def test_post_with_body_string(self): + def check_response(handler): + length = int(handler.headers.get('content-length', 0)) + body = handler.rfile.read(length) + assert six.ensure_str(handler.headers['content-type']) == 'application/json' + assert json.loads(body)["baz"] == "baf" + + with MockServer(POST=check_response): + ctx = binding.connect(port=9093, scheme='http', token="waffle", headers=[("Content-Type", "application/json")]) + ctx.post("/", foo="bar", body='{"baz": "baf"}') + + def test_post_with_body_dict(self): + def check_response(handler): + length = int(handler.headers.get('content-length', 0)) + body = handler.rfile.read(length) + assert six.ensure_str(handler.headers['content-type']) == 'application/x-www-form-urlencoded' + assert six.ensure_str(body) == 'baz=baf&hep=cat' + + with MockServer(POST=check_response): + ctx = binding.connect(port=9093, scheme='http', token="waffle") + ctx.post("/", foo="bar", body={"baz": "baf", "hep": "cat"}) + if __name__ == "__main__": try: From fdff4a6228eb20accfdcf9da85282cead25ea750 Mon Sep 17 00:00:00 2001 From: David Poncelow Date: Thu, 3 Dec 2020 12:50:24 -0800 Subject: [PATCH 19/21] allow params to be in either order in test --- tests/test_binding.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_binding.py b/tests/test_binding.py index b34ab14ee..2d3107507 100755 --- a/tests/test_binding.py +++ b/tests/test_binding.py @@ -916,7 +916,7 @@ def check_response(handler): length = int(handler.headers.get('content-length', 0)) body = handler.rfile.read(length) assert six.ensure_str(handler.headers['content-type']) == 'application/x-www-form-urlencoded' - assert six.ensure_str(body) == 'baz=baf&hep=cat' + assert six.ensure_str(body) == 'baz=baf&hep=cat' or six.ensure_str(body) == 'hep=cat&baz=baf' with MockServer(POST=check_response): ctx = binding.connect(port=9093, scheme='http', token="waffle") From f7222b36fb778d20d738c0b20c7038ae031d63b0 Mon Sep 17 00:00:00 2001 From: Tim Pavlik Date: Thu, 28 Jan 2021 13:19:38 -0800 Subject: [PATCH 20/21] Updates files for 1.6.15 release. --- README.md | 2 +- examples/searchcommands_app/setup.py | 2 +- splunklib/__init__.py | 2 +- splunklib/binding.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 34c5e5fe8..fbb4f3827 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # The Splunk Enterprise Software Development Kit for Python -#### Version 1.6.14 +#### Version 1.6.15 The Splunk Enterprise Software Development Kit (SDK) for Python contains library code and examples designed to enable developers to build applications using the Splunk platform. diff --git a/examples/searchcommands_app/setup.py b/examples/searchcommands_app/setup.py index ec2118dd0..fdb734630 100755 --- a/examples/searchcommands_app/setup.py +++ b/examples/searchcommands_app/setup.py @@ -439,7 +439,7 @@ def run(self): setup( description='Custom Search Command examples', name=os.path.basename(project_dir), - version='1.6.14', + version='1.6.15', author='Splunk, Inc.', author_email='devinfo@splunk.com', url='http://github.com/splunk/splunk-sdk-python', diff --git a/splunklib/__init__.py b/splunklib/__init__.py index a879ab9d1..668dcfe7f 100644 --- a/splunklib/__init__.py +++ b/splunklib/__init__.py @@ -16,5 +16,5 @@ from __future__ import absolute_import from splunklib.six.moves import map -__version_info__ = (1, 6, 14) +__version_info__ = (1, 6, 15) __version__ = ".".join(map(str, __version_info__)) diff --git a/splunklib/binding.py b/splunklib/binding.py index e21da6e52..a95faa480 100644 --- a/splunklib/binding.py +++ b/splunklib/binding.py @@ -1385,7 +1385,7 @@ def request(url, message, **kwargs): head = { "Content-Length": str(len(body)), "Host": host, - "User-Agent": "splunk-sdk-python/1.6.14", + "User-Agent": "splunk-sdk-python/1.6.15", "Accept": "*/*", "Connection": "Close", } # defaults From ddebf7392e2923d2a8625bd5b63985446b821126 Mon Sep 17 00:00:00 2001 From: Tim Pavlik Date: Thu, 28 Jan 2021 13:37:12 -0800 Subject: [PATCH 21/21] Update CHANGELOG --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6934cee08..89c2b6450 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Splunk Enterprise SDK for Python Changelog +## Version 1.6.15 + +### Bug fixes +[#301](https://github.com/splunk/splunk-sdk-python/pull/301) Fix chunk synchronization +[#327](https://github.com/splunk/splunk-sdk-python/pull/327) Rename and cleanup follow-up for chunk synchronization +[#352](https://github.com/splunk/splunk-sdk-python/pull/352) Allow supplying of a key-value body when calling Context.post() + +### Minor changes +[#350](https://github.com/splunk/splunk-sdk-python/pull/350) Initial end-to-end tests for streaming, reporting, generating custom search commands +[#348](https://github.com/splunk/splunk-sdk-python/pull/348) Update copyright years to 2020 +[#346](https://github.com/splunk/splunk-sdk-python/pull/346) Readme updates to urls, terminology, and formatting +[#317](https://github.com/splunk/splunk-sdk-python/pull/317) Fix deprecation warnings + ## Version 1.6.14 ### Bug fix