From e17dd4d42b41a808e4ce54bbeb7450b4852c909c Mon Sep 17 00:00:00 2001 From: harlankadish Date: Mon, 20 Jan 2020 10:46:09 -0500 Subject: [PATCH 01/83] Initial commit to tamr branch off of dev From 6f58c3d2ed95d521ea44e9aebd7ac764cfcbe2c0 Mon Sep 17 00:00:00 2001 From: Robert Stine Date: Tue, 21 Jan 2020 22:23:47 -0500 Subject: [PATCH 02/83] #1692 Async Hits - initial addition --- .../default.application.properties | 6 + .../main/java/gov/gtas/model/HitDetail.java | 15 +- .../gov/gtas/model/PendingHitDetails.java | 202 ++++++++++++++++++ .../PendingHitDetailRepository.java | 30 +++ .../resources/default.application.properties | 2 + .../gtas/job/config/JobSchedulerConfig.java | 9 + .../scheduler/AsyncHitPersistenceThread.java | 88 ++++++++ .../job/scheduler/RuleRunnerScheduler.java | 45 +++- 8 files changed, 388 insertions(+), 9 deletions(-) create mode 100644 gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PendingHitDetails.java create mode 100644 gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PendingHitDetailRepository.java create mode 100644 gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/AsyncHitPersistenceThread.java diff --git a/gtas-parent/docker-resources/default.application.properties b/gtas-parent/docker-resources/default.application.properties index 1a31d16431..4ef1eb83f1 100755 --- a/gtas-parent/docker-resources/default.application.properties +++ b/gtas-parent/docker-resources/default.application.properties @@ -15,6 +15,12 @@ user.group.default=1 neo4jusername=${NEO4J_USERNAME} neo4jpassword=${NEO4J_PASSWORD} neo4jEnabled=false +threadsOnRules=5 +threadsOnLoader=5 +maxMessagesPerRuleRun=500 +maxPassengersPerRuleRun=3000 +maxFlightsPerRuleRun=50 +maxFlightsProcessedPerThread=10 ###Hibernate### hibernate.connection.driver_class=org.mariadb.jdbc.Driver diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java index 86b0c90d59..25ebd576bc 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java @@ -20,7 +20,7 @@ public class HitDetail extends BaseEntity { private static final long serialVersionUID = 5219262569468670275L; - HitDetail() { + public HitDetail() { } @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "hitDetail", fetch = FetchType.LAZY) @@ -207,6 +207,19 @@ public void setHitMaker(HitMaker hitMaker) { public void setHitMakerId(Long hitMakerId) { this.hitMakerId = hitMakerId; } + + public static HitDetail from(PendingHitDetails pendingHitDetails) { + HitDetail hitDetail = new HitDetail(pendingHitDetails.getHitEnum()); + hitDetail.setHitType(pendingHitDetails.getHitEnum().toString()); + hitDetail.setPassengerId(pendingHitDetails.getPassengerId()); + hitDetail.setHitMakerId(pendingHitDetails.getHitMakerId()); + hitDetail.setRuleId(pendingHitDetails.getHitMakerId()); //Set as hitmaker Id - this field is typically based on drools hit. + hitDetail.setDescription(pendingHitDetails.getDescription()); + hitDetail.setCreatedDate(new Date()); + hitDetail.setTitle(pendingHitDetails.getTitle()); + hitDetail.setRuleConditions(pendingHitDetails.getRuleConditions()); + return hitDetail; + } public static HitDetail from(RuleHitDetail ruleHitDetail) { HitDetail hitDetail = new HitDetail(ruleHitDetail.getHitType()); diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PendingHitDetails.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PendingHitDetails.java new file mode 100644 index 0000000000..b19803c1fa --- /dev/null +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PendingHitDetails.java @@ -0,0 +1,202 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +package gov.gtas.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import gov.gtas.enumtype.HitTypeEnum; + +import javax.persistence.*; +import java.util.Date; +import java.util.Objects; + +@Entity +@Table(name = "pending_hit_detail") +public class PendingHitDetails extends BaseEntityAudit { + + public PendingHitDetails() {} + + public PendingHitDetails(HitTypeEnum hitEnum) { + this.hitEnum = hitEnum; + this.setHitType(hitEnum.toString()); + } + + @Column(name = "title", nullable = false) + private String Title; + + @Column(name = "description") + private String Description; + + @Column(name = "hit_type", nullable = false, length = 3) + private String hitType; + + @Enumerated(EnumType.STRING) + private HitTypeEnum hitEnum; + + // Binds directly to rule, watchlist item, or graph hit + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "hm_id", referencedColumnName = "id", insertable = false, updatable = false) + @JsonIgnore + private HitMaker hitMaker; + + @JsonIgnore + @Column(name = "hm_id", columnDefinition = "bigint unsigned", nullable = false) + private Long hitMakerId; + + /** + * String representation of matched conditions; it can be split into String[] + */ + @Lob + @Basic(fetch = FetchType.EAGER) + @Column(name = "cond_text", columnDefinition = "TEXT NULL") + private String ruleConditions; + + @Column(name = "created_date", nullable = false) + @Temporal(TemporalType.TIMESTAMP) + private Date createdDate; + + @JsonIgnore + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "passenger", nullable = false, insertable = false, updatable = false, referencedColumnName = "id") + protected Passenger passenger; + + @Column(name = "passenger", columnDefinition = "bigint unsigned") + protected Long passengerId; + + @JsonIgnore + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "flight", insertable = false, updatable = false, referencedColumnName = "id") + private Flight flight; + + @Column(name = "flight", columnDefinition = "bigint unsigned", nullable = false) + private Long flightId; + + @Column(name = "percentage_match") + private float percentage = 1; // 1 = 100% + + public Flight getFlight() { + return flight; + } + + public void setFlight(Flight flight) { + this.flight = flight; + } + + public Long getFlightId() { + return flightId; + } + + public void setFlightId(Long flightId) { + this.flightId = flightId; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public String getRuleConditions() { + return ruleConditions; + } + + public void setRuleConditions(String ruleConditions) { + this.ruleConditions = ruleConditions; + } + + public String getTitle() { + return Title; + } + + public void setTitle(String title) { + Title = title; + } + + public String getDescription() { + return Description; + } + + public void setDescription(String description) { + Description = description; + } + + public String getHitType() { + return hitType; + } + + public void setHitType(String hitType) { + this.hitType = hitType; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof PendingHitDetails)) + return false; + PendingHitDetails pendingHitDetail = (PendingHitDetails) o; + return getPassengerId().equals(pendingHitDetail.getPassengerId()) && getHitMakerId().equals(pendingHitDetail.getHitMakerId()) + && getHitEnum().equals(pendingHitDetail.getHitEnum()); + } + + @Override + public int hashCode() { + return Objects.hash(getHitMakerId(), getPassengerId(), getHitEnum()); + } + + public Passenger getPassenger() { + return passenger; + } + + public Long getPassengerId() { + return passengerId; + } + + public void setPassengerId(Long passengerId) { + this.passengerId = passengerId; + } + + public void setPassenger(Passenger passenger) { + this.passenger = passenger; + } + + public HitTypeEnum getHitEnum() { + return hitEnum; + } + + public void setHitEnum(HitTypeEnum hitEnum) { + this.hitEnum = hitEnum; + } + + public HitMaker getHitMaker() { + return hitMaker; + } + + public Long getHitMakerId() { + return hitMakerId; + } + + public void setHitMaker(HitMaker hitMaker) { + this.hitMaker = hitMaker; + } + + public void setHitMakerId(Long hitMakerId) { + this.hitMakerId = hitMakerId; + } + + public float getPercentage() { + return percentage; + } + + public void setPercentage(float percentage) { + this.percentage = percentage; + } + +} diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PendingHitDetailRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PendingHitDetailRepository.java new file mode 100644 index 0000000000..8711e0450c --- /dev/null +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PendingHitDetailRepository.java @@ -0,0 +1,30 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +package gov.gtas.repository; + + +import gov.gtas.model.PendingHitDetails; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Set; + +public interface PendingHitDetailRepository extends CrudRepository { + + //A direct query fails to auto parse as a long (defaulting to big int). Forced to use Number interface instead. + @Query(nativeQuery = true, value = "SELECT DISTINCT(phd.flight) FROM pending_hit_detail phd " + + "ORDER BY phd.created_date ASC LIMIT :theLimit") + Set getFlightsWithPendingHitsByLimit(@Param("theLimit") Integer theLimit); + + @Query("SELECT phd from PendingHitDetails phd where phd.flightId in :flightIds") + List getPendingHitDetailsByFlightIds(@Param("flightIds") Set flightIds); + +} diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index da0ab02f99..b39eed2fb8 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -21,6 +21,8 @@ threadsOnRules=5 threadsOnLoader=5 maxMessagesPerRuleRun=500 maxPassengersPerRuleRun=3000 +maxFlightsPerRuleRun=50 +maxFlightsProcessedPerThread=10 ###Elastic### diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/config/JobSchedulerConfig.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/config/JobSchedulerConfig.java index 870b230c19..943104ac6e 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/config/JobSchedulerConfig.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/config/JobSchedulerConfig.java @@ -34,6 +34,8 @@ public class JobSchedulerConfig implements SchedulingConfigurer { private static final String THREADS_ON_RULES = "threadsOnRules"; private static final String THREADS_ON_LOADER= "threadsOnLoader"; private static final String MAX_MESSAGES_PER_RULE_RUN="maxMessagesPerRuleRun"; + private static final String MAX_FLIGHTS_PER_RULE_RUN="maxFlightsPerRuleRun"; + private static final String MAX_FLIGHTS_PROCESSED_PER_THREAD="maxFlightsProcessedPerThread"; private static final String MAX_PASSENGERS_PER_RULE_RUN="maxPassengersPerRuleRun"; @Resource @@ -81,4 +83,11 @@ public int getMaxMessagesPerRuleRun() { return Integer.parseInt(env.getRequiredProperty(MAX_MESSAGES_PER_RULE_RUN)); } + public int getMaxFlightsPerRuleRun() { + return Integer.parseInt(env.getRequiredProperty(MAX_FLIGHTS_PER_RULE_RUN)); + } + + public int getMaxFlightsProcessedPerThread() { + return Integer.parseInt(env.getRequiredProperty(MAX_FLIGHTS_PROCESSED_PER_THREAD)); + } } diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/AsyncHitPersistenceThread.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/AsyncHitPersistenceThread.java new file mode 100644 index 0000000000..42d5f3e8bc --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/AsyncHitPersistenceThread.java @@ -0,0 +1,88 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +package gov.gtas.job.scheduler; + +import gov.gtas.model.HitDetail; +import gov.gtas.model.PendingHitDetails; +import gov.gtas.repository.PendingHitDetailRepository; +import gov.gtas.services.RuleHitPersistenceService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.stream.Collectors; + +@Component +@Scope("prototype") +public class AsyncHitPersistenceThread implements Callable { + + Logger logger = LoggerFactory.getLogger(AsyncHitPersistenceThread.class); + + private Set flightIds; + private PendingHitDetailRepository pendingHitDetailRepository; + private ApplicationContext applicationContext; + + public AsyncHitPersistenceThread(PendingHitDetailRepository pendingHitDetailRepository, + ApplicationContext applicationContext) { + this.pendingHitDetailRepository = pendingHitDetailRepository; + this.applicationContext = applicationContext; + } + + @Override + public Boolean call() { + if (flightIds == null) { + throw new IllegalArgumentException("flightIds must be set"); + } + boolean success = true; + RuleHitPersistenceService persistenceService = applicationContext.getBean(RuleHitPersistenceService.class); + + List pendingHitDetails = pendingHitDetailRepository + .getPendingHitDetailsByFlightIds(flightIds); + try { + Set hitDetails = createHitDetails(pendingHitDetails); + persistenceService.persistToDatabase(hitDetails); + + } catch (Exception e) { + success = false; + logger.error("Error in rule persistence!", e); + } + Set flightIds = pendingHitDetails.stream().map(PendingHitDetails::getFlightId) + .collect(Collectors.toSet()); + try { + persistenceService.updateFlightHitCounts(flightIds); + } catch (Exception e) { + success = false; + logger.error("Error updating flight counts!", e); + } + pendingHitDetailRepository.deleteAll(pendingHitDetails); // Delete all pending hits - no saving for now. + return success; + } + + protected Set createHitDetails(List pendingHitDetails) { + logger.debug("In async creating hit details."); + Set hitDetails = new HashSet<>(); + if (!pendingHitDetails.isEmpty()) { + for (PendingHitDetails pendingHitDetail : pendingHitDetails) { + HitDetail hitDetail = HitDetail.from(pendingHitDetail); + hitDetails.add(hitDetail); + } + } + return hitDetails; + } + + public void setFlightIds(Set flightIds) { + this.flightIds = flightIds; + } +} diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/RuleRunnerScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/RuleRunnerScheduler.java index 615803994f..5801fe655e 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/RuleRunnerScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/RuleRunnerScheduler.java @@ -9,7 +9,9 @@ import gov.gtas.model.Message; import gov.gtas.model.MessageStatus; import gov.gtas.model.MessageStatusEnum; +import gov.gtas.model.PendingHitDetails; import gov.gtas.repository.MessageStatusRepository; +import gov.gtas.repository.PendingHitDetailRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -18,6 +20,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.math.BigInteger; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -41,6 +44,7 @@ public class RuleRunnerScheduler { private int maxNumOfThreads = DEFAULT_THREADS_ON_RULES; private boolean graphDbOn; private JobSchedulerConfig jobSchedulerConfig; + private PendingHitDetailRepository pendingHitDetailRepository; /* The targeting service. */ @@ -49,9 +53,10 @@ public class RuleRunnerScheduler { */ @Autowired public RuleRunnerScheduler(ApplicationContext ctx, MessageStatusRepository messageStatusRepository, - JobSchedulerConfig jobSchedulerConfig) { + JobSchedulerConfig jobSchedulerConfig, PendingHitDetailRepository pendingHitDetailRepository) { this.messageStatusRepository = messageStatusRepository; this.jobSchedulerConfig = jobSchedulerConfig; + this.pendingHitDetailRepository = pendingHitDetailRepository; try { graphDbOn = this.jobSchedulerConfig.getNeo4JRuleEngineEnabled(); @@ -70,16 +75,40 @@ public RuleRunnerScheduler(ApplicationContext ctx, MessageStatusRepository messa } /** - * Job scheduling. - */ - // This is commented out as a scheduled task in order to remove concurrency - // issues in the DB involving loader and rule runner. This may not be the final - // solution to the problem - // but it suffices for now. The rule running portion of the scheduler is now - // tacked into the loader portion at the bottom to insure sequential operation. + * rule engine + **/ @Scheduled(fixedDelayString = "${ruleRunner.fixedDelay.in.milliseconds}", initialDelayString = "${ruleRunner.initialDelay.in.milliseconds}") public void jobScheduling() throws InterruptedException { + + int flightLimit = this.jobSchedulerConfig.getMaxFlightsPerRuleRun(); + Set flightIdsForPendingHits = pendingHitDetailRepository.getFlightsWithPendingHitsByLimit(flightLimit); + if (!flightIdsForPendingHits.isEmpty()) { + int flightsPerThread = this.jobSchedulerConfig.getMaxFlightsProcessedPerThread(); + List list = new ArrayList<>(); + int runningTotal = 0; + Set flightIds = new HashSet<>(); + for (Number flightId : flightIdsForPendingHits) { + flightIds.add(flightId.longValue()); + runningTotal++; + if (runningTotal >= flightsPerThread) { + AsyncHitPersistenceThread worker = ctx.getBean(AsyncHitPersistenceThread.class); + worker.setFlightIds(flightIds); + list.add(worker); + runningTotal = 0; + } + if (list.size() >= maxNumOfThreads - 1) { + break; + } + } + if (runningTotal != 0) { + AsyncHitPersistenceThread worker = ctx.getBean(AsyncHitPersistenceThread.class); + worker.setFlightIds(flightIds); + list.add(worker); + } + exec.invokeAll(list); + } + int messageLimit = this.jobSchedulerConfig.getMaxMessagesPerRuleRun(); List source = messageStatusRepository.getMessagesFromStatus(MessageStatusEnum.LOADED.getName(), messageLimit); From 437d4e86802386815202e1c7116bec470c526922 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Thu, 23 Jan 2020 16:58:40 -0500 Subject: [PATCH 03/83] Add tamr.enabled and tamr.activemq.broker.url application properties (not used anywhere yet) --- .../src/main/resources/default.application.properties | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index b39eed2fb8..ea34633603 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -176,3 +176,7 @@ elastic.node.name=elasticsearch elastic.username=elastic elastic.password=admin123 elastic.ssl.enabled=true + +######### Tamr Integration ######### +tamr.enabled=false +tamr.activemq.broker.url=tcp://localhost:61616 From 593404193558bc3586a392ac27046c04d5da2d63 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 24 Jan 2020 14:39:07 -0500 Subject: [PATCH 04/83] Implement TamrMessageReceiver functionality and send Tamr messages to TamrMessageHandlerService Still needs TH.CLUSTERS and TH.DELTAS response examples for further testing. --- .../tamr/TamrMessageHandlerService.java | 32 ++++ .../tamr/TamrMessageHandlerServiceImpl.java | 54 +++++++ .../parsers/tamr/jms/TamrMessageReceiver.java | 107 ++++++++----- .../parsers/tamr/jms/TamrQueueConfig.java | 58 ++++--- .../gtas/parsers/tamr/model/TamrDerogHit.java | 30 ++++ .../tamr/model/TamrHistoryCluster.java | 50 ++++++ .../gtas/parsers/tamr/model/TamrMessage.java | 70 +++++++++ .../parsers/tamr/model/TamrRecordError.java | 41 +++++ .../gtas/parsers/tamr/model/TamrResponse.java | 67 -------- .../parsers/tamr/model/TamrResponseData.java | 65 -------- .../tamr/model/TamrTravelerResponse.java | 59 +++++++ .../parsers/tamr/ReceiveTamrMessagesTest.java | 147 ++++++++++++++++++ .../tamr-messages/derog_query_response.json | 2 + .../tamr-messages/derog_replace_response.json | 1 + .../tamr-messages/error_message.json | 1 + .../tamr-messages/history_query_response.json | 2 + .../history_update_response.json | 1 + 17 files changed, 591 insertions(+), 196 deletions(-) create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerService.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogHit.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrRecordError.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponse.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponseData.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrTravelerResponse.java create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_query_response.json create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_replace_response.json create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/error_message.json create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_query_response.json create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_update_response.json diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerService.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerService.java new file mode 100644 index 0000000000..ce722d3c60 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerService.java @@ -0,0 +1,32 @@ +package gov.gtas.parsers.tamr; + +import org.springframework.stereotype.Service; + +import gov.gtas.parsers.tamr.model.TamrMessage; + +@Service +public interface TamrMessageHandlerService { + /** + * Handle responses to Tamr QUERY requests. This handles both the "derog + * matches" and "traveler history" responses. + */ + public void handleQueryResponse(TamrMessage response); + + /** + * Handles an acknowledgement response from Tamr. This response is received + * for requests that don't give any particular response data. + */ + public void handleAcknowledgeResponse(TamrMessage response); + + /** + * Handles TH.CLUSTERS and TH.DELTAS messages from Tamr. These both require + * similar functionality: updating the Tamr cluster IDs. + */ + public void handleTamrIdUpdate(TamrMessage response); + + /** + * Handles ERROR messages from Tamr. These can happen during Tamr + * processing or for any error unrelated to a request. + */ + public void handleErrorResponse(TamrMessage response); +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java new file mode 100644 index 0000000000..a43e7fe182 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -0,0 +1,54 @@ +package gov.gtas.parsers.tamr; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.repository.PassengerIDTagRepository; + +@Component +public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService { + + private final Logger logger = LoggerFactory.getLogger(TamrMessageHandlerServiceImpl.class); + + @Autowired + private PassengerIDTagRepository passengerIDTagRepository; + + /** + * Handle responses to Tamr QUERY requests. This handles both the "derog + * matches" and "traveler history" responses. + */ + @Override + public void handleQueryResponse(TamrMessage response) { + logger.info("TODO: handle QUERY response"); + } + + /** + * Handles an acknowledgement response from Tamr. This response is received + * for requests that don't give any particular response data. + */ + @Override + public void handleAcknowledgeResponse(TamrMessage response) { + logger.info("TODO: handle acknowledgement"); + } + + /** + * Handles TH.CLUSTERS and TH.DELTAS messages from Tamr. These both require + * similar functionality: updating the Tamr cluster IDs. + */ + @Override + public void handleTamrIdUpdate(TamrMessage response) { + logger.info("TODO: handle Tamr ID updates"); + } + + /** + * Handles ERROR messages from Tamr. These can happen during Tamr + * processing or for any error unrelated to a request. + */ + @Override + public void handleErrorResponse(TamrMessage response) { + logger.info("TODO: handle Tamr error"); + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java index 771aa4300a..c7e6c13b2a 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java @@ -13,6 +13,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @@ -20,60 +21,84 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import gov.gtas.parsers.tamr.model.TamrResponse; +import gov.gtas.parsers.tamr.TamrMessageHandlerService; +import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.repository.PassengerIDTagRepository; @Component +@ConditionalOnProperty(prefix = "tamr", name = "enabled") public class TamrMessageReceiver { private final Logger logger = LoggerFactory.getLogger(TamrMessageReceiver.class); - @Autowired - private PassengerIDTagRepository passengerIDTagRepository; - - // Commented out listener, uncomment for tamr integration - // @JmsListener(containerFactory = "tamrJmsListenerContainerFactory", - // destination = "OutboundQueue") + @Autowired + private TamrMessageHandlerService tamrMessageHandler; + + @JmsListener(containerFactory = "tamrJmsListenerContainerFactory", + destination = "OutboundQueue") public void receive(javax.jms.Message msg) { - logger.info("############### TAMR data received .... ################"); + logger.info("############### Tamr data received .... ################"); TextMessage textMessage = null; - - if (msg != null) { - logger.info("javax.jms.Message not null"); - textMessage = (TextMessage) msg; + String messageType, messageText; + + if (msg == null) { + logger.warn("Received null JMS message from Tamr"); + return; } - if (textMessage != null) { - try { - TamrResponse res = convert(textMessage.getText()); - if (res != null && res.getTravelerQuery() != null) - res.getTravelerQuery().forEach(p -> { - logger.info("Run update -> Tamr: " + p.getTamrId() + ", gtasId: " + p.getGtasId()); - this.passengerIDTagRepository.updateTamrId(p.getGtasId(), p.getTamrId()); - }); - } catch (JMSException e) { - logger.error("caught JMSException"); - } + + textMessage = (TextMessage) msg; + try { + messageType = textMessage.getJMSType(); + messageText = textMessage.getText(); + } catch (JMSException e) { + logger.error("Error handling Tamr JMS message: {}", + e); + return; } - } + logger.info("Message type: {}", messageType); + if (messageText.length() > 1000) + logger.info("Raw JSON data: {}...", messageText.substring(0, 1000)); + else + logger.info("Raw JSON data: {}", messageText); - public TamrResponse convert(String response) { - ObjectMapper mapper = new ObjectMapper(); - - TamrResponse result = null; + TamrMessage response = this.parseMessage(messageText); + if (response == null) { + return; + } + + if (messageType.equals("QUERY")) { + tamrMessageHandler.handleQueryResponse(response); + } else if (messageType.equals("DC.REPLACE") || messageType.equals("TH.UPDATE")) { + // These responses should be an acknowledgement. + tamrMessageHandler.handleAcknowledgeResponse(response); + } else if (messageType.equals("TH.CLUSTERS") || messageType.equals("TH.DELTAS")) { + tamrMessageHandler.handleTamrIdUpdate(response); + } else if (messageType.equals("ERROR")) { + tamrMessageHandler.handleErrorResponse(response); + } else { + logger.warn("Unknown Tamr JMS message type \"{}\". Ignoring...", + messageType); + return; + } + + } - try { - result = mapper.readValue(response, TamrResponse.class); - } catch (JsonParseException e) { - logger.info(e.getMessage()); - return null; - } catch (JsonMappingException e) { - logger.info(e.getMessage()); - return null; - } catch (IOException e) { - logger.info(e.getMessage()); - return null; - } + private TamrMessage parseMessage(String messageJson) { + ObjectMapper mapper = new ObjectMapper(); - return result; + try { + return mapper.readValue(messageJson, TamrMessage.class); + } catch (JsonParseException e) { + logger.error("Error parsing JSON from Tamr: {}", + e.getMessage()); + return null; + } catch (JsonMappingException e) { + logger.error("Error deserializing JSON from Tamr: {}", + e.getMessage()); + return null; + } catch (IOException e) { + logger.error(e.toString()); + return null; + } } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java index def67d2d1a..6fd9943172 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java @@ -5,42 +5,54 @@ */ package gov.gtas.parsers.tamr.jms; +import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; +import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.support.destination.DestinationResolver; //Uncomment in order in part to re-enable queues -/*@Configuration -@EnableJms*/ +@Configuration +@ConditionalOnProperty(prefix = "tamr", name = "enabled") +@EnableJms public class TamrQueueConfig { - @Bean - public DefaultJmsListenerContainerFactory tamrJmsListenerContainerFactory() { - DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); - factory.setConnectionFactory( - // Add tamr connection details here. - new ActiveMQConnectionFactory("")); - factory.setDestinationResolver(new DestinationResolver() { - - @Override - public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) - throws JMSException { - - // Create a destination - return session.createQueue("OutboundQueue"); - - } - }); - factory.setSessionTransacted(true); - factory.setConcurrency("5"); - return factory; - } + private final Logger logger = LoggerFactory.getLogger(TamrQueueConfig.class); + + @Value("${tamr.activemq.broker.url}") + private String activeMQBrokerUrl; + + @Bean + public JmsListenerContainerFactory tamrJmsListenerContainerFactory() { + DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); + +// factory.setDestinationResolver(new DestinationResolver() { +// @Override +// public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) +// throws JMSException { +// logger.info("session = {}, destinationName = {}, pubSubDomain = {}", +// session, destinationName, pubSubDomain); +// // Create a destination +// return session.createQueue("OutboundQueue"); +// } +// }); + factory.setConnectionFactory( + new ActiveMQConnectionFactory(activeMQBrokerUrl)); + factory.setSessionTransacted(true); + factory.setConcurrency("5"); + return factory; + } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogHit.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogHit.java new file mode 100644 index 0000000000..93362a2598 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogHit.java @@ -0,0 +1,30 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +public class TamrDerogHit { + private String derogId; + private float score = 0; + + public TamrDerogHit() { + } + + public String getDerogId() { + return this.derogId; + } + + public void setDerogId(String derogId) { + this.derogId = derogId; + } + + public float getScore() { + return this.score; + } + + public void setScore(float score) { + this.score = score; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java new file mode 100644 index 0000000000..ffc7559a89 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java @@ -0,0 +1,50 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +public class TamrHistoryCluster { + private String gtasId; + private String tamrId; + private int version; + private String action; + + public TamrHistoryCluster() { + } + + public String getTamrId() { + return tamrId; + } + + public void setTamrId(String tamrId) { + this.tamrId = tamrId; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public String getGtasId() { + return gtasId; + } + + public void setGtasId(String gtasId) { + this.gtasId = gtasId; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java new file mode 100644 index 0000000000..e438658184 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java @@ -0,0 +1,70 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Model that encompasses all types of messages that can be sent from Tamr to + * GTAS. + * @author Cassidy Laidlaw + */ +public class TamrMessage { + private List travelerQuery; + + private List historyClusters; + + private Boolean acknowledgment = null; + private String error; + + private List recordErrors; + + public TamrMessage() { + } + + public List getTravelerQuery() { + return travelerQuery; + } + + public void setTravelerQuery(List travelerQuery) { + this.travelerQuery = travelerQuery; + } + + public List getHistoryClusters() { + return historyClusters; + } + + public void setHistoryClusters(List historyClusters) { + this.historyClusters = historyClusters; + } + + public Boolean getAcknowledgment() { + return acknowledgment; + } + + public void setAcknowledgment(Boolean acknowledgment) { + this.acknowledgment = acknowledgment; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public List getRecordErrors() { + return recordErrors; + } + + public void setRecordErrors(List recordErrors) { + this.recordErrors = recordErrors; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrRecordError.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrRecordError.java new file mode 100644 index 0000000000..aee0c0ed41 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrRecordError.java @@ -0,0 +1,41 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +public class TamrRecordError { + private String recordId; + private String record; + private List errors; + + public TamrRecordError() { + } + + public String getRecordId() { + return recordId; + } + + public void setRecordId(String recordId) { + this.recordId = recordId; + } + + public String getRecord() { + return record; + } + + public void setRecord(String record) { + this.record = record; + } + + public List getErrors() { + return errors; + } + + public void setErrors(List errors) { + this.errors = errors; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponse.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponse.java deleted file mode 100644 index e3f75ca0db..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponse.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr.model; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -public class TamrResponse { - private List travelerQuery; - - @JsonIgnore - private Object historyClusters; - - private Object acknowledgment; - - private Object error; - - private Object recordErrors; - - public Object getError() { - return error; - } - - public void setError(Object error) { - this.error = error; - } - - public Object getHistoryClusters() { - return historyClusters; - } - - public void setHistoryClusters(Object historyClusters) { - this.historyClusters = historyClusters; - } - - public Object getAcknowledgment() { - return acknowledgment; - } - - public void setAcknowledgment(Object acknowledgment) { - this.acknowledgment = acknowledgment; - } - - public TamrResponse() { - - } - - public List getTravelerQuery() { - return travelerQuery; - } - - public void setTravelerQuery(List travelerQuery) { - this.travelerQuery = travelerQuery; - } - - public Object getRecordErrors() { - return recordErrors; - } - - public void setRecordErrors(Object recordErrors) { - this.recordErrors = recordErrors; - } -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponseData.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponseData.java deleted file mode 100644 index 19688b370c..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrResponseData.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr.model; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -public class TamrResponseData { - private String tamrId; - private Long gtasId; - private double version; - private double score; - - @JsonIgnore - private List derogIds; - - public TamrResponseData() { - - } - - public String getTamrId() { - return tamrId; - } - - public void setTamrId(String tamrId) { - this.tamrId = tamrId; - } - - public Long getGtasId() { - return gtasId; - } - - public void setGtasId(Long gtasId) { - this.gtasId = gtasId; - } - - public double getVersion() { - return version; - } - - public void setVersion(double version) { - this.version = version; - } - - public double getScore() { - return score; - } - - public void setScore(double score) { - this.score = score; - } - - public List getDerogs() { - return derogIds; - } - - public void setDerogs(List derogs) { - this.derogIds = derogs; - } - -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrTravelerResponse.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrTravelerResponse.java new file mode 100644 index 0000000000..3607ac55b1 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrTravelerResponse.java @@ -0,0 +1,59 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +public class TamrTravelerResponse { + private String gtasId; + private List derogIds; + private String tamrId; + private int version; + private float score; + + public TamrTravelerResponse() { + } + + public String getTamrId() { + return tamrId; + } + + public void setTamrId(String tamrId) { + this.tamrId = tamrId; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public String getGtasId() { + return gtasId; + } + + public void setGtasId(String gtasId) { + this.gtasId = gtasId; + } + + public List getDerogIds() { + return this.derogIds; + } + + public void setDerogIds(List derogIds) { + this.derogIds = derogIds; + } + + public float getScore() { + return this.score; + } + + public void setScore(float score) { + this.score = score; + } +} diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java new file mode 100644 index 0000000000..a66c0f5e8f --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -0,0 +1,147 @@ +package gov.gtas.parsers.tamr; + +import static org.junit.Assert.*; +import static org.mockito.BDDMockito.*; + +import java.io.IOException; +import java.net.URISyntaxException; + +import javax.jms.JMSException; +import javax.jms.TextMessage; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import gov.gtas.parsers.ParserTestHelper; +import gov.gtas.parsers.tamr.jms.TamrMessageReceiver; +import gov.gtas.parsers.tamr.model.TamrMessage; + +public class ReceiveTamrMessagesTest implements ParserTestHelper { + private static final String HISTORY_QUERY_RESPONSE = "/tamr-messages/history_query_response.json"; + private static final String DEROG_QUERY_RESPONSE = "/tamr-messages/derog_query_response.json"; + private static final String HISTORY_UPDATE_RESPONSE = "/tamr-messages/history_update_response.json"; + private static final String DEROG_REPLACE_RESPONSE = "/tamr-messages/derog_replace_response.json"; + private static final String ERROR_MESSAGE = "/tamr-messages/error_message.json"; + + private TamrMessageReceiver receiver; + private TamrMessageHandlerService handler; + + @Before + public void setUp() { + this.receiver = new TamrMessageReceiver(); + this.handler = mock(TamrMessageHandlerService.class); + ReflectionTestUtils.setField(receiver, "tamrMessageHandler", handler); + } + + @Test + public void testHistoryQueryResponse() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("QUERY"); + given(message.getText()).willReturn(getMessageText(HISTORY_QUERY_RESPONSE)); + + receiver.receive(message); + + verify(handler).handleQueryResponse(any(TamrMessage.class)); + verify(handler, never()).handleAcknowledgeResponse(any()); + verify(handler, never()).handleTamrIdUpdate(any()); + verify(handler, never()).handleErrorResponse(any()); + } + + @Test + public void testDerogQueryResponse() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("QUERY"); + given(message.getText()).willReturn(getMessageText(DEROG_QUERY_RESPONSE)); + + receiver.receive(message); + + verify(handler).handleQueryResponse(any(TamrMessage.class)); + verify(handler, never()).handleAcknowledgeResponse(any()); + verify(handler, never()).handleTamrIdUpdate(any()); + verify(handler, never()).handleErrorResponse(any()); + } + + @Test + public void testHistoryUpdateResponse() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("TH.UPDATE"); + given(message.getText()).willReturn(getMessageText(HISTORY_UPDATE_RESPONSE)); + + receiver.receive(message); + + verify(handler).handleAcknowledgeResponse(any(TamrMessage.class)); + verify(handler, never()).handleQueryResponse(any()); + verify(handler, never()).handleTamrIdUpdate(any()); + verify(handler, never()).handleErrorResponse(any()); + } + + @Test + public void testDerogReplaceResponse() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("DC.REPLACE"); + given(message.getText()).willReturn(getMessageText(DEROG_REPLACE_RESPONSE)); + + receiver.receive(message); + + verify(handler).handleAcknowledgeResponse(any(TamrMessage.class)); + verify(handler, never()).handleQueryResponse(any()); + verify(handler, never()).handleTamrIdUpdate(any()); + verify(handler, never()).handleErrorResponse(any()); + } + + @Test + @Ignore("Waiting on test data") + public void testClustersMessage() { + fail("not implemented"); + } + + @Test + @Ignore("Waiting on test data") + public void testDeltasMessage() { + fail("not implemented"); + } + + @Test + public void testErrorMessage() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("ERROR"); + given(message.getText()).willReturn(getMessageText(ERROR_MESSAGE)); + + receiver.receive(message); + + verify(handler).handleErrorResponse(any(TamrMessage.class)); + verify(handler, never()).handleQueryResponse(any()); + verify(handler, never()).handleAcknowledgeResponse(any()); + verify(handler, never()).handleTamrIdUpdate(any()); + } + + @Test + public void testUnknownMessageType() throws JMSException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("UNKNOWN"); + given(message.getText()).willReturn("{}"); + + receiver.receive(message); + + // Message should not make it through to the handler. + verifyZeroInteractions(handler); + } + + @Test + public void testMalformedMessage() throws JMSException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("QUERY"); + given(message.getText()).willReturn("{"); + receiver.receive(message); + + message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("QUERY"); + given(message.getText()).willReturn("{\"foo\": \"bar\"}"); + receiver.receive(message); + + // Malformed messages should not make it through to the handler. + verifyZeroInteractions(handler); + } +} diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_query_response.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_query_response.json new file mode 100644 index 0000000000..06d49c463e --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_query_response.json @@ -0,0 +1,2 @@ +{"travelerQuery":[{"gtasId":"14711313","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13787797","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1755223","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10369267","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15224405","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18660127","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12279764","derogIds":[{"derogId":"26967","score":0.02904940554533142}],"tamrId":null,"score":0.0},{"gtasId":"12289452","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12533943","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10783357","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11893535","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14986444","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19071797","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18054448","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20333468","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11907911","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12544953","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1881002","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13096174","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1140839","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11763299","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18945260","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11654972","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13383278","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18811895","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21899252","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10718813","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10922531","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15408958","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13244057","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10841549","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11562879","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15666295","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16608615","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1764276","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15237815","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18752684","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16150601","derogIds":[{"derogId":"4862","score":1.0}],"tamrId":null,"score":0.0},{"gtasId":"10196089","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17371681","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21233020","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10535714","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13871940","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12930470","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13502506","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15782157","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13088581","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12565205","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15087871","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14997388","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13986838","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18442285","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18959516","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19013102","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18299964","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12761825","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21049378","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14104457","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10931179","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16011565","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"177038","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10534920","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15351837","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19666757","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13786278","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21283988","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1268934","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14565750","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11551809","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20762752","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17540560","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13749017","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13137717","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17336203","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2079933","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"156460","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15270212","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13295520","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21228984","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15768084","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1083307","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11355570","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14255794","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10120759","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12351611","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15251964","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17266888","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18587935","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10700365","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11876153","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17665231","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15305846","derogIds":[{"derogId":"54296","score":0.2780719051126377}],"tamrId":null,"score":0.0},{"gtasId":"19507845","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15609137","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11056368","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12233561","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17715798","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15588272","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21531175","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21421724","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15420406","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11072713","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2098116","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12633151","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19682761","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10579005","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16543950","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17812368","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11287210","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16846843","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11783289","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21133028","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20135485","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16676800","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1705804","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14922616","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17424433","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18612678","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1838227","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"217476","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21691456","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17974571","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20953702","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11953402","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18553254","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17077998","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15373817","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10604887","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12048718","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10061184","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21621492","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10158195","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11239254","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13488603","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1410676","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20668698","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10420660","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10244533","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10159271","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19366992","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21398455","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11605978","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1462196","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12399477","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19615916","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10023955","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18444035","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10697647","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10841833","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12730161","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13484119","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14834676","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12730043","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16435476","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18480347","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11893106","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20681414","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16626444","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17187141","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18917799","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13416779","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10733738","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10469075","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11396932","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10956905","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1898953","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14577352","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10029038","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21458275","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16010997","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10566136","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10659287","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12175916","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20217467","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11453527","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12335342","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14050085","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14597008","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11786474","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16950471","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18010938","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11273254","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16836987","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10536972","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1862669","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"182332","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21330190","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14000719","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1034348","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17135416","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11409604","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11997691","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15019215","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11134048","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15542225","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11729140","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20929403","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12301443","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19564798","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13497743","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13671445","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15720649","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20381972","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15618791","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12546101","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21691866","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15391894","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14579571","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1702256","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1935749","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15091359","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17304389","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20888382","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1003011","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15550319","derogIds":[{"derogId":"36213","score":0.2780719051126377}],"tamrId":null,"score":0.0},{"gtasId":"16382340","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10161407","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11164444","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18233864","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11232216","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16806667","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18312434","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19778714","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19158602","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16906395","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19871814","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14604753","derogIds":[{"derogId":"104517","score":0.2780719051126377}],"tamrId":null,"score":0.0},{"gtasId":"21825430","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1922575","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11679568","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10626021","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12947324","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18592813","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10866294","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20984635","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21403422","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11142798","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10344630","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10685043","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11884598","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13812031","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18996394","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11656578","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15482430","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17080771","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20170615","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12409228","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18541307","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21657836","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21620343","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13496852","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1289073","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18060895","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2024800","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14675610","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15804885","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10035301","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1016655","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20809472","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10607683","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21389173","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16523904","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16404017","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18897239","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12782812","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19972801","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"174436","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13286053","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10695497","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14472393","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17639759","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16357338","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11837119","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17877189","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"105254","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13139570","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14133689","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15079764","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10913049","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20229823","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12154041","derogIds":[{"derogId":"13758","score":0.2780719051126377},{"derogId":"46998","score":0.02904940554533142}],"tamrId":null,"score":0.0},{"gtasId":"1165895","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13316073","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1209063","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10482219","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14270003","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"164777","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18634506","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1855842","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17233298","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18389372","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19967478","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10903499","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16802115","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19066304","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20647059","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1388957","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15628310","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19767539","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15818849","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12977393","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18358385","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1021761","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11725042","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18540868","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13514566","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18296253","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17920282","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12349444","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1122586","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20954376","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21164440","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13189781","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17772713","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19141572","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14039507","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18360352","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17034577","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18208178","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18288173","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14581475","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21420032","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1030458","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14106342","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21176413","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15223374","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21142317","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1303704","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12222242","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20617353","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1069170","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14682079","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13352976","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19152568","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1136419","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14198469","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13725000","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18755685","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13321509","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"214419","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12956254","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14412662","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18031080","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15861278","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18850415","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19842724","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1039136","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2082008","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2190316","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18409222","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11658717","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20776197","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11608588","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17117124","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1041693","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21202845","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14490433","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13242083","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10868718","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13454481","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14705744","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15079157","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13513388","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18408002","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10226566","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13735580","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14361495","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10878516","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11098821","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16723368","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10808202","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13142667","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15817578","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16990314","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1541100","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13714795","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1509610","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18012582","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11561346","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12293405","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2171934","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18756562","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11691729","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18677732","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18735787","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11830457","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13596500","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12174139","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16336163","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17198866","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12503021","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12573536","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21184370","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19591222","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1610022","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15269401","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19617213","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19911995","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10140175","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16429161","derogIds":[],"tamrId":null,"score":0.0}]} +{"travelerQuery":[{"gtasId":"7987183","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7213981","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25062507","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6594391","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9544854","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25083683","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3143067","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"56417","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9207497","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6054056","derogIds":[{"derogId":"30329","score":1.0}],"tamrId":null,"score":0.0},{"gtasId":"2314673","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3777203","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8992195","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8089348","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9854606","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6194243","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23362851","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9070163","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2645473","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7200206","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"29151","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"973892","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6998445","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"238462","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7925710","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9407831","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24233096","derogIds":[{"derogId":"24191","score":1.0}],"tamrId":null,"score":0.0},{"gtasId":"8733891","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4623721","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5648559","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6447305","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23811929","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"846337","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8167199","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4004721","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2673824","derogIds":[{"derogId":"40605","score":0.2780719051126377}],"tamrId":null,"score":0.0},{"gtasId":"2196057","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24992181","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9140575","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9614932","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7414134","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9710387","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2565550","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24560554","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6644871","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4326728","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22764388","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8580130","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4711288","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8448878","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"729327","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8367302","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23530176","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7486385","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25115294","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2796466","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3857356","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25067292","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7622158","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7623127","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5519477","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9661940","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7235840","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2841108","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7567731","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"783936","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6471583","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9160499","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7614533","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3673388","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5710853","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4303805","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7294680","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8980170","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9199339","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5846784","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4872145","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24458760","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3669900","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2498962","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7244223","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8420322","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25183196","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22459631","derogIds":[{"derogId":"78595","score":1.0}],"tamrId":null,"score":0.0},{"gtasId":"2501748","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24659471","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9950186","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9289885","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4416537","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2568629","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"698429","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2772501","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4988127","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7769197","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2651853","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2217918","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6651364","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25251237","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3923313","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5727024","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5920377","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"366465","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9462381","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22116648","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9206550","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3578230","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9302916","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25098421","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22718566","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4071615","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"639725","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8308378","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2932737","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3801479","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2980815","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5838709","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23319281","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6603231","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7314963","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"616391","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8943620","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3391203","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7368353","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3013894","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7694028","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7890212","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2886611","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2802487","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8684532","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3082890","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2850208","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9226038","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5193240","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23541883","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4855073","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7814216","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4642637","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7672008","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"890087","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2675977","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3068211","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7383756","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23859902","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5020344","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6017149","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4554131","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4334191","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3351401","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9918616","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6172609","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"74269","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22062164","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22650919","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22320174","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9074218","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23548292","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22972763","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5719680","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3088171","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7894941","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9939006","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9856257","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3087195","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22143364","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4678098","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9265602","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"289838","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7477820","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7383941","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"895760","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6365063","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3986486","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"326899","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2637491","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3495059","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7239126","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8006382","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5464676","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8007230","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6658496","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4305941","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9008597","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3357020","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7081918","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24158625","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6566344","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2745533","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7637321","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6521113","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23551489","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23369712","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22645241","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6211611","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6090779","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8803897","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7057851","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3494066","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9656291","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9967907","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4514627","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6019132","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"250084","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"487999","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5312125","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7376073","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7092935","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24557905","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"242269","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9916720","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4092711","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7982291","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23250593","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25262762","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7044477","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4923008","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9373045","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24036370","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25448908","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22234342","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24175336","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24555515","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7526328","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21928574","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3472599","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7180281","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9555051","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8727409","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5815677","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2699418","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7653671","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8771125","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2849702","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5288676","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9489105","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23082607","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8994804","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9650571","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6442208","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22358018","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3701204","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5139567","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"586283","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4440048","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7171364","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3887781","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23916996","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4435930","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9756996","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8576456","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8958852","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24750891","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9765584","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"919594","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4524330","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23379774","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9089552","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7995570","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23619609","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8888660","derogIds":[{"derogId":"25164","score":1.0}],"tamrId":null,"score":0.0},{"gtasId":"8073419","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9627671","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7493997","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2930962","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6554178","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9894888","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6258532","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9903527","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2892344","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"506360","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6786624","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2403854","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3849297","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23999755","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4339787","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25350468","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24165453","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7269185","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6810705","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23044770","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7126975","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3673954","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6984745","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8035099","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4305537","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22965097","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3828002","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4521081","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8565302","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5269975","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5676315","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24633422","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8278207","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9459994","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5265259","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3822821","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22555133","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22726544","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"591835","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8371427","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3237960","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4537431","derogIds":[{"derogId":"17100","score":0.02904940554533142}],"tamrId":null,"score":0.0},{"gtasId":"4973205","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3286090","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3818328","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9854690","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8152402","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22890610","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24101923","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5951780","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22169921","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2259070","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4250248","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9404076","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2678756","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2804604","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22638681","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2745701","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4867226","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22015461","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24360963","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6049284","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23570422","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6482964","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3583145","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24171135","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9152050","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"831204","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6353567","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6189500","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5218861","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6711135","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6200067","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9779314","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5610365","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6874552","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22167809","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4584562","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22510263","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7973831","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8163669","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6430069","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"727009","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8957241","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7102945","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9832785","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23340890","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6809206","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9408083","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9374754","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9382368","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"699334","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5781292","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8705537","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2693936","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2227981","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4272974","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4256022","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"577980","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22703423","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22445966","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9315233","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3176225","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24292722","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25451048","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5606057","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7902455","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9643682","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7750403","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2270284","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22639220","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3136733","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"983778","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22839595","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4436569","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7921250","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8632466","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6970560","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"971784","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25175743","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23456837","derogIds":[{"derogId":"94628","score":0.2780719051126377}],"tamrId":null,"score":0.0},{"gtasId":"5877310","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25148113","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23242133","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5714344","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3707748","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23546372","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"478010","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7584548","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2609021","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6575608","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8992775","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9480869","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8822819","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"397696","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9060548","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5464094","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5561590","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2901036","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9502265","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9432598","derogIds":[],"tamrId":null,"score":0.0}]} diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_replace_response.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_replace_response.json new file mode 100644 index 0000000000..fb9e517421 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/derog_replace_response.json @@ -0,0 +1 @@ +{"acknowledgment":true,"error":null} diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/error_message.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/error_message.json new file mode 100644 index 0000000000..27935e6bbf --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/error_message.json @@ -0,0 +1 @@ +{"acknowledgment": false, "error": "Some internal error..."} \ No newline at end of file diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_query_response.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_query_response.json new file mode 100644 index 0000000000..12abdeda63 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_query_response.json @@ -0,0 +1,2 @@ +{"travelerQuery":[{"gtasId":"11316025","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20561036","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12474763","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1540515","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16433220","derogIds":[],"tamrId":"8f1e467e-5977-3982-b6a4-56e110dfefa4","score":0.9946666666666666},{"gtasId":"16285331","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12268623","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13742770","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11834216","derogIds":[],"tamrId":"d7972567-61eb-3755-b8b0-f45ee778c873","score":1.0},{"gtasId":"16859634","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16956090","derogIds":[],"tamrId":"424b6d29-e7b6-39bc-a262-c71b14d76469","score":1.0},{"gtasId":"17774733","derogIds":[],"tamrId":"dd5c9a3a-3b6c-3da7-b2fa-7e60d9b0411e","score":1.0},{"gtasId":"18832339","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2048025","derogIds":[],"tamrId":"9991d755-1410-3963-972f-089aa716803d","score":0.9183673469387755},{"gtasId":"18077452","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22643889","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"197819","derogIds":[],"tamrId":"58e3a3dc-62fb-3a69-886a-b504149b9854","score":1.0},{"gtasId":"22530844","derogIds":[],"tamrId":"12f4fc8b-70cd-3591-ba0c-907f9a9171e4","score":0.95},{"gtasId":"14357636","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10786883","derogIds":[],"tamrId":"37a240b1-eea1-32eb-b268-51b2f88f4d6f","score":0.9875},{"gtasId":"11896914","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18668085","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22000797","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17049300","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19232887","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10671548","derogIds":[],"tamrId":"1a9319cb-fdd5-34e0-8d85-1001c29d4181","score":1.0},{"gtasId":"16019232","derogIds":[],"tamrId":"ea16d3b2-913a-3914-92d7-86ee2ae347d6","score":1.0},{"gtasId":"20403323","derogIds":[],"tamrId":"a49219cd-c562-367d-b674-b5e3285c79f0","score":1.0},{"gtasId":"17350747","derogIds":[],"tamrId":"2ad88786-7c0c-38d4-8cec-f19de91cc648","score":1.0},{"gtasId":"21569678","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20240378","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13262954","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13314376","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22214190","derogIds":[],"tamrId":"00ee51af-1a3f-351a-a362-f719c6e4b07d","score":1.0},{"gtasId":"16936482","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11584519","derogIds":[],"tamrId":"247315ca-f06d-314a-891d-6120bd631f4a","score":1.0},{"gtasId":"21581420","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14963584","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15162160","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18009413","derogIds":[],"tamrId":"fe525615-5fbd-3105-8c5e-fa2339b73bba","score":1.0},{"gtasId":"17549151","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14001865","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20990705","derogIds":[],"tamrId":"7047b93a-0a84-3295-8e82-a7c206f79027","score":1.0},{"gtasId":"13688714","derogIds":[],"tamrId":"bb2500e3-f3eb-31c7-8ee6-f9a0daeb76b7","score":1.0},{"gtasId":"14851896","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11972648","derogIds":[],"tamrId":"081d376c-33bc-368e-8bec-18ccce9b1b59","score":1.0},{"gtasId":"21784062","derogIds":[],"tamrId":"689ca1d7-1d0b-3567-a3a1-467e5adf4ae7","score":0.9958333333333332},{"gtasId":"2226964","derogIds":[],"tamrId":"42fe03b3-aaeb-387c-a2f3-6633724e4691","score":1.0},{"gtasId":"1829936","derogIds":[],"tamrId":"0b436f79-f31c-3d31-925a-10399abce88e","score":1.0},{"gtasId":"20296276","derogIds":[],"tamrId":"79011a4b-d24d-3117-bac0-c1a5ec157e7d","score":1.0},{"gtasId":"15625971","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15984958","derogIds":[],"tamrId":"6df6ea64-0a3b-3856-8d74-b97ff2d7a6ab","score":1.0},{"gtasId":"14976699","derogIds":[],"tamrId":"86f156f7-814c-34a3-a294-e74a73fa72ae","score":1.0},{"gtasId":"19312423","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13187289","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13926427","derogIds":[],"tamrId":"8ea00821-c685-3da4-844b-85da1e48d590","score":0.0},{"gtasId":"10691689","derogIds":[],"tamrId":"f657e9d7-9510-31a3-9f92-ba5df5804eac","score":1.0},{"gtasId":"12307177","derogIds":[],"tamrId":"7ed5cd17-8f5f-3f59-a27f-df4abe0b2eff","score":0.8070175438596491},{"gtasId":"11651263","derogIds":[],"tamrId":"6e6c0d9a-3d68-34b9-8948-514ff44314be","score":0.9272727272727276},{"gtasId":"19861867","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10347173","derogIds":[],"tamrId":"560fa046-0340-3427-b435-5034e620233f","score":0.8518518518518519},{"gtasId":"10622174","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15035297","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1937152","derogIds":[],"tamrId":"d5f48da5-6b01-3264-9a9e-8f29d93c6d28","score":1.0},{"gtasId":"11422611","derogIds":[],"tamrId":"2e947cb2-a3d4-3779-aa12-2a01d869c0c4","score":1.0},{"gtasId":"17853575","derogIds":[],"tamrId":"908a8789-ca2c-3ba7-8174-07d34c6541d7","score":0.8275862068965517},{"gtasId":"14312956","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19875663","derogIds":[],"tamrId":"d0f5b73b-4983-375e-8fd2-345d375ce31a","score":0.9939393939393939},{"gtasId":"20840975","derogIds":[],"tamrId":"f7acbc7f-b28b-3ecc-a4f3-78e78273a7b8","score":1.0},{"gtasId":"15378180","derogIds":[],"tamrId":"06f0513d-8b41-3b6e-aa9c-52b08d7f930e","score":1.0},{"gtasId":"10341866","derogIds":[],"tamrId":"8eda55b5-05f5-3438-908c-6faf444dd65b","score":1.0},{"gtasId":"12518452","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15472156","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12746424","derogIds":[],"tamrId":"85a8bdba-04a4-3b07-a656-eb1f38ed043f","score":0.9565217391304348},{"gtasId":"21613984","derogIds":[],"tamrId":"7ed5cd17-8f5f-3f59-a27f-df4abe0b2eff","score":0.7017543859649122},{"gtasId":"11392944","derogIds":[],"tamrId":"83fd1386-b77b-369f-8477-e4429b06f603","score":0.9897435897435898},{"gtasId":"17966602","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10943003","derogIds":[],"tamrId":"0bb50888-0eb7-3161-91ce-2c28ee4765da","score":0.85},{"gtasId":"13438074","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11544066","derogIds":[],"tamrId":"552b0f36-f31e-358e-85a9-8de16250b07e","score":1.0},{"gtasId":"21842579","derogIds":[],"tamrId":"3ff9091f-14d0-3b29-865f-7da88563aeba","score":1.0},{"gtasId":"16745759","derogIds":[],"tamrId":"43a95c95-c7f5-3b6a-8dd3-3d0b6f8b1141","score":1.0},{"gtasId":"19996458","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20326535","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22361839","derogIds":[],"tamrId":"e2aa1dc5-131c-3e86-ade7-a6b884c256a2","score":1.0},{"gtasId":"13410756","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10347036","derogIds":[],"tamrId":"8e7eebba-e2c0-3da0-b666-5aada5051892","score":1.0},{"gtasId":"14881258","derogIds":[],"tamrId":"7af958f4-004a-36a4-aa40-d79889bf8a13","score":0.9853658536585366},{"gtasId":"14845339","derogIds":[],"tamrId":"7c53a60b-0e29-3ca0-9f28-43a56cf34942","score":1.0},{"gtasId":"18253883","derogIds":[],"tamrId":"def8f975-52a6-39c9-96fb-c8fc8e6ba525","score":1.0},{"gtasId":"13709660","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15695912","derogIds":[],"tamrId":"dd5e8ce3-8920-33d8-9975-047e1852e07e","score":1.0},{"gtasId":"16065674","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1760890","derogIds":[],"tamrId":"4248bcc5-8597-3589-89cf-38127c11762f","score":1.0},{"gtasId":"19727514","derogIds":[],"tamrId":"211b85ac-0abf-35ec-8be3-f9a098718d50","score":1.0},{"gtasId":"20576129","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12001751","derogIds":[],"tamrId":"e7fa3599-6834-3afc-9b0c-319ef80d1340","score":1.0},{"gtasId":"13856147","derogIds":[],"tamrId":"270c00cd-eb78-37eb-9017-b23ebc84f38c","score":0.9},{"gtasId":"15941464","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12954704","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15121123","derogIds":[],"tamrId":"c8aaefbc-95cb-3111-b191-43fe3307c031","score":1.0},{"gtasId":"13543555","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14845327","derogIds":[],"tamrId":"4ebe3e35-a427-3948-8d78-a11d7e98d094","score":1.0},{"gtasId":"19186483","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14077584","derogIds":[],"tamrId":"843a2c54-57f1-3dbf-9b7f-75f6e2ee9769","score":0.9923076923076923},{"gtasId":"19271175","derogIds":[],"tamrId":"6680fb21-c4d2-367f-bdf1-f3a228bb0db2","score":1.0},{"gtasId":"11578474","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15899184","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19379746","derogIds":[],"tamrId":"edeff775-f107-3506-9123-165b7c212500","score":0.9874999999999999},{"gtasId":"1563923","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1011174","derogIds":[],"tamrId":"38265dd4-4817-3c0c-8ff1-115f61df0deb","score":1.0},{"gtasId":"18946198","derogIds":[],"tamrId":"6efdda37-5bc3-3399-8627-814af5d40c2a","score":1.0},{"gtasId":"20167087","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10646281","derogIds":[],"tamrId":"800ca7e8-22bc-3e20-8259-ab024a21af88","score":1.0},{"gtasId":"10789633","derogIds":[],"tamrId":"79801bd9-0cb9-3077-9df0-d546ed010dee","score":0.88},{"gtasId":"19505177","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17830490","derogIds":[],"tamrId":"f767a579-42f4-388a-9ccc-6c00e51025e2","score":1.0},{"gtasId":"2079613","derogIds":[],"tamrId":"8e211d6a-597f-3017-a423-dfa17f6a4efa","score":0.9666666666666667},{"gtasId":"19553488","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2057129","derogIds":[],"tamrId":"d54bd18a-ed4d-3897-a633-3d077dd0af6e","score":0.0},{"gtasId":"22092059","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14489902","derogIds":[],"tamrId":"360c44a1-3510-36b1-ae60-df23435c0f15","score":1.0},{"gtasId":"2101154","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1002342","derogIds":[],"tamrId":"0074e336-e6a6-38d0-9751-c9c78734b387","score":1.0},{"gtasId":"13744764","derogIds":[],"tamrId":"5857cb33-3f7e-33c4-99f7-76b64de21272","score":1.0},{"gtasId":"15171964","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15499716","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15798209","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19529394","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12363094","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13741021","derogIds":[],"tamrId":"0c289927-ee9f-325c-a1a5-5749b4bdc1b7","score":1.0},{"gtasId":"16886051","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22720550","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19660527","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20936378","derogIds":[],"tamrId":"9e8a2095-a00b-38de-bd11-1db48ec74676","score":0.0},{"gtasId":"11514902","derogIds":[],"tamrId":"47a457dd-5b03-34c2-a9d2-02805a9c9c75","score":1.0},{"gtasId":"19001197","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17974790","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11978987","derogIds":[],"tamrId":"35885883-3a77-36ae-b123-dc1f2cc58395","score":1.0},{"gtasId":"22508763","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1174699","derogIds":[],"tamrId":"5a117c0e-3f4f-3797-9112-96078358db02","score":1.0},{"gtasId":"12299791","derogIds":[],"tamrId":"4c225453-c3d7-3b2e-94b2-98b8937199f2","score":1.0},{"gtasId":"17283799","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16508352","derogIds":[],"tamrId":"253e2008-08e4-3822-a873-e54c36b839e7","score":1.0},{"gtasId":"20357644","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13308061","derogIds":[],"tamrId":"e282d6ec-454f-31ca-a191-2ec3f1013fb1","score":1.0},{"gtasId":"21486856","derogIds":[],"tamrId":"8fcd1816-5f77-344b-9910-bd528fcc8c5e","score":1.0},{"gtasId":"11587285","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22468171","derogIds":[],"tamrId":"dac99622-2fef-3dc3-870f-beada40f5c9b","score":1.0},{"gtasId":"12096284","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10595921","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22201067","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1944432","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22392816","derogIds":[],"tamrId":"2ef34b8d-745d-3e67-af0b-51f286ef6632","score":1.0},{"gtasId":"20022863","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19542797","derogIds":[],"tamrId":"7a3a21c7-6bab-369e-b59c-635d070f2056","score":1.0},{"gtasId":"21450310","derogIds":[],"tamrId":"b838e5b1-0403-3b73-9a5c-b3e7cb56c1ba","score":1.0},{"gtasId":"21419909","derogIds":[],"tamrId":"73dc74fb-991d-3c1b-bc3b-a0e593271233","score":0.5714285714285714},{"gtasId":"11057958","derogIds":[],"tamrId":"7dcef182-d394-33f6-9d43-496d5a1787f3","score":0.9090909090909091},{"gtasId":"22562057","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2079654","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2076387","derogIds":[],"tamrId":"477c4c94-c8c6-33ac-acb7-37366a2627ab","score":0.9942857142857142},{"gtasId":"18808050","derogIds":[],"tamrId":"e635ac83-7b62-3812-b96a-1d11414e44b2","score":1.0},{"gtasId":"13696864","derogIds":[],"tamrId":"faf32d0a-6da1-31dc-8680-ea8bef42c98a","score":1.0},{"gtasId":"17740110","derogIds":[],"tamrId":"c0d40da5-41a7-3337-8d3d-fb6d84da19e3","score":1.0},{"gtasId":"1921535","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16204118","derogIds":[],"tamrId":"7ed5cd17-8f5f-3f59-a27f-df4abe0b2eff","score":0.8596491228070176},{"gtasId":"11046836","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11497898","derogIds":[],"tamrId":"9e26927f-5740-3d21-8c49-d9677e0c44ce","score":1.0},{"gtasId":"21226045","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16772399","derogIds":[],"tamrId":"a6cfa23a-a13e-3abf-af68-f1b1d61465d7","score":1.0},{"gtasId":"19657781","derogIds":[],"tamrId":"b065f42f-d4d2-3ce5-a5a7-15e0f49f2f7f","score":1.0},{"gtasId":"10799563","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12367003","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16881634","derogIds":[],"tamrId":"4c0cee6f-e57c-3e90-992f-b0be2006c05b","score":0.7619047619047619},{"gtasId":"16251459","derogIds":[],"tamrId":"efe0699a-f42c-3be9-a63e-5f8be2d4dc05","score":0.7083333333333334},{"gtasId":"18687193","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1951175","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17566507","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11835129","derogIds":[],"tamrId":"2e9ecee7-b169-30e8-ad40-0ac5c315511e","score":1.0},{"gtasId":"184765","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10164929","derogIds":[],"tamrId":"12f4fc8b-70cd-3591-ba0c-907f9a9171e4","score":1.0},{"gtasId":"22124412","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22087400","derogIds":[],"tamrId":"25e876fe-001d-3cf9-9ffe-9c6a6fa13f05","score":1.0},{"gtasId":"11174941","derogIds":[],"tamrId":"e6b2cf39-8e98-32bb-b3ac-4fe6a3ae8001","score":1.0},{"gtasId":"21538088","derogIds":[],"tamrId":"30f67721-1797-394d-816f-71f61d6ed60f","score":1.0},{"gtasId":"21541367","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1277694","derogIds":[],"tamrId":"8e392a24-619b-33cf-8e5e-f14f939c4797","score":1.0},{"gtasId":"1118402","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18238699","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22423178","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13418756","derogIds":[],"tamrId":"02877e71-0006-3b4c-953c-8eb771c02e41","score":1.0},{"gtasId":"18826344","derogIds":[],"tamrId":"119a2516-ce0a-3141-8bee-82af430f09d1","score":1.0},{"gtasId":"13950166","derogIds":[],"tamrId":"8e211d6a-597f-3017-a423-dfa17f6a4efa","score":0.7666666666666667},{"gtasId":"11588567","derogIds":[],"tamrId":"3bfff88a-1270-338a-aac5-8c8b67350cc1","score":0.0},{"gtasId":"14295991","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18610425","derogIds":[],"tamrId":"b9c74946-2493-32bb-a0ab-4425c40f184c","score":1.0},{"gtasId":"15346728","derogIds":[],"tamrId":"562db19f-6627-38d8-8163-af123864984f","score":1.0},{"gtasId":"17926415","derogIds":[],"tamrId":"e3a59b58-7a4f-3ad5-9826-d4b710a09573","score":1.0},{"gtasId":"17629746","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14911213","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20007561","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14323188","derogIds":[],"tamrId":"7c662b81-20e0-344a-8e74-e4b6a869f67f","score":1.0},{"gtasId":"12558572","derogIds":[],"tamrId":"031646c3-9815-3a6d-b70e-936a5c0a24ff","score":1.0},{"gtasId":"18806861","derogIds":[],"tamrId":"99b84243-9d10-3b31-be20-5532c1de9170","score":1.0},{"gtasId":"20336195","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10838705","derogIds":[],"tamrId":"e21fecc4-3f1b-3140-a46d-a77ed2c03a59","score":0.535483870967742},{"gtasId":"10159556","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13579800","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17010785","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22738327","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15709333","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13335519","derogIds":[],"tamrId":"c06117e7-e6ad-346d-a257-efdbeee3496d","score":0.8333333333333334},{"gtasId":"16843841","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11759119","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10421015","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14408861","derogIds":[],"tamrId":"e66a3b66-55db-3ae7-bd93-a0421846b286","score":1.0},{"gtasId":"11314983","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17787384","derogIds":[],"tamrId":"4d724fdf-1fb5-3bfb-a400-6cd30eecc9d6","score":1.0},{"gtasId":"11139396","derogIds":[],"tamrId":"616a1c2f-ae6e-3660-8059-fff8cfefaf2f","score":0.99375},{"gtasId":"22041751","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14224453","derogIds":[],"tamrId":"6e161749-9641-34fe-bef3-66c098eb1b89","score":1.0},{"gtasId":"17033626","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21759966","derogIds":[],"tamrId":"0d99f45c-c1bc-33c5-94f9-a12ef000a4be","score":0.8648648648648649},{"gtasId":"10309429","derogIds":[],"tamrId":"ddd3c645-742b-33e5-a2b1-0bddb28908c1","score":1.0},{"gtasId":"14145984","derogIds":[],"tamrId":"06f0513d-8b41-3b6e-aa9c-52b08d7f930e","score":1.0},{"gtasId":"21219799","derogIds":[],"tamrId":"bb9c6ac2-1db2-39a4-a691-3b72318c932f","score":0.6428571428571429},{"gtasId":"11310255","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16615826","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20543071","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15837655","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14925941","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16551090","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16417303","derogIds":[],"tamrId":"cd86ae9e-8c94-3793-a2ea-404947ad9a28","score":0.9793103448275862},{"gtasId":"21413349","derogIds":[],"tamrId":"316ef73f-79ae-339d-b4db-89eb5740b8e5","score":0.9696969696969697},{"gtasId":"21860353","derogIds":[],"tamrId":"9e6ba575-1acd-3876-84d6-504f6f00f677","score":1.0},{"gtasId":"1318903","derogIds":[],"tamrId":"56716b92-b8c2-31cf-8853-516830219c6f","score":0.0},{"gtasId":"10389876","derogIds":[],"tamrId":"3f9da27a-14b8-322f-91ff-dcd54f37e1fc","score":0.9666666666666667},{"gtasId":"1343800","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14004291","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16702462","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11761329","derogIds":[],"tamrId":"4a03fe89-3cf1-3460-8b94-94651a91386f","score":1.0},{"gtasId":"15925109","derogIds":[],"tamrId":"124aa2b5-542d-302f-85f6-56d64653ed23","score":1.0},{"gtasId":"22658373","derogIds":[],"tamrId":"3f9736f0-0968-3a13-ab8f-5f86b4e323ca","score":1.0},{"gtasId":"21265595","derogIds":[],"tamrId":"7335b859-d74e-38d1-a6ce-f88a876dfa3b","score":1.0},{"gtasId":"17493707","derogIds":[],"tamrId":"43ab5d43-4ac0-3dfe-a714-2e75e7630b88","score":1.0},{"gtasId":"14981480","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22233298","derogIds":[],"tamrId":"b514ac3d-61b9-33df-b745-650835374def","score":0.875},{"gtasId":"18027659","derogIds":[],"tamrId":"80b85d2e-846d-3553-bf84-f484bf01cf05","score":0.9473684210526315},{"gtasId":"18678407","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21232790","derogIds":[],"tamrId":"963ebaaa-0f21-390b-a0f9-eb8b5f5a2b5b","score":1.0},{"gtasId":"18142428","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22373464","derogIds":[],"tamrId":"db079766-67b4-3101-b598-e49403e359a8","score":1.0},{"gtasId":"21871544","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15424215","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11276597","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17261647","derogIds":[],"tamrId":"8f1e467e-5977-3982-b6a4-56e110dfefa4","score":1.0},{"gtasId":"13310434","derogIds":[],"tamrId":"991cd340-bf6c-36b5-be3e-77a617bd7e14","score":1.0},{"gtasId":"14236353","derogIds":[],"tamrId":"2597fee6-f5e3-3e2b-b555-15a5a3149e52","score":1.0},{"gtasId":"19098560","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20727225","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11957887","derogIds":[],"tamrId":"5ac5220c-d2d8-3a0e-809a-1f44192f9968","score":0.7419354838709677},{"gtasId":"15804408","derogIds":[],"tamrId":"081fb9cc-e7b9-3b64-8e3e-c038c12de276","score":0.90625},{"gtasId":"1164113","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20479691","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11545926","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15722322","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13617351","derogIds":[],"tamrId":"b1cb6060-2051-355e-b80d-e904baf8cbda","score":1.0},{"gtasId":"11638730","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12092309","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11237813","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14947226","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14323050","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11958963","derogIds":[],"tamrId":"efa70008-ea0c-369a-8735-8b25dab078af","score":1.0},{"gtasId":"16122408","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18762859","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22654905","derogIds":[],"tamrId":"965aed38-a11b-30e4-a8b7-dd6b72d4fdeb","score":1.0},{"gtasId":"117248","derogIds":[],"tamrId":"d56a4068-1451-364e-8041-459ccd39a8e3","score":1.0},{"gtasId":"2050088","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20331789","derogIds":[],"tamrId":"b0363eee-a47e-38a5-a1ae-f78ff56b0f6b","score":1.0},{"gtasId":"18153211","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13609828","derogIds":[],"tamrId":"b8a43fa7-aa7e-3c6c-93ca-d80dc07647b5","score":0.9840000000000001},{"gtasId":"10155151","derogIds":[],"tamrId":"8059c085-1c4b-31a3-bd5b-46d23306065d","score":1.0},{"gtasId":"16338843","derogIds":[],"tamrId":"344b5563-6883-329f-b9c6-83f62afb4fab","score":0.9600000000000002},{"gtasId":"1325633","derogIds":[],"tamrId":"6b02c70b-ec8a-3753-84b2-4c24f64f4b46","score":1.0},{"gtasId":"1973911","derogIds":[],"tamrId":"f60bec00-5b70-392e-a03f-f656165c0d2f","score":0.9909090909090907},{"gtasId":"11280874","derogIds":[],"tamrId":"b763a43e-da94-3afc-b675-ffcf46147351","score":0.9090909090909091},{"gtasId":"1153694","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1209066","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15754349","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13255436","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1282767","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10184350","derogIds":[],"tamrId":"136c6682-f788-3a5d-b108-5c2458f29ea0","score":0.9795918367346939},{"gtasId":"19775345","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11461762","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14495394","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20166688","derogIds":[],"tamrId":"6b1e62a7-7cd7-33b3-a9dc-457c3be8ab21","score":0.6428571428571429},{"gtasId":"12663683","derogIds":[],"tamrId":"09a60eca-6564-318a-9622-99f8fc36f377","score":1.0},{"gtasId":"14568690","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1045188","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12908139","derogIds":[],"tamrId":"1a0f2342-bef4-33bc-9078-aae89167da13","score":0.7777777777777778},{"gtasId":"15697412","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20854645","derogIds":[],"tamrId":"113dd8c2-4903-3c4b-b6ca-feda04af6ff4","score":1.0},{"gtasId":"1853055","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13258755","derogIds":[],"tamrId":"12a0a361-15e3-3435-9541-fbf126765a62","score":1.0},{"gtasId":"18299643","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16288564","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20614059","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13751992","derogIds":[],"tamrId":"6d5bf69d-b521-3d3f-bca6-9fface241181","score":0.9565217391304348},{"gtasId":"12863138","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"20460973","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17856074","derogIds":[],"tamrId":"7a6eb9c0-c666-3c92-a5ce-7e271b861c02","score":1.0},{"gtasId":"19066116","derogIds":[],"tamrId":"5ddd2555-6ce1-38f4-bee1-b5d926d4d936","score":1.0},{"gtasId":"13698553","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1100673","derogIds":[],"tamrId":"7ab0c64f-2e23-39b4-b594-b05dceebee8f","score":1.0},{"gtasId":"22037320","derogIds":[],"tamrId":"a1d7865d-7b63-332a-ab77-77bd1bbf8cac","score":0.9818181818181819},{"gtasId":"19673483","derogIds":[],"tamrId":"719fb549-3107-3bda-84e8-4b58d6d28c66","score":1.0},{"gtasId":"10794780","derogIds":[],"tamrId":"66f677f5-1b0d-32c9-808d-ca5c9eb32748","score":1.0},{"gtasId":"16498256","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18719251","derogIds":[],"tamrId":"e866485d-c6ef-3924-b166-e3865b176e2e","score":1.0},{"gtasId":"16503033","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13970855","derogIds":[],"tamrId":"89170924-ed92-38dd-8ca2-19b551f17824","score":1.0},{"gtasId":"15315268","derogIds":[],"tamrId":"43efe71c-b563-3cb2-890b-d11a84029854","score":0.9795918367346939},{"gtasId":"16658826","derogIds":[],"tamrId":"12415cbf-ebcf-3d01-b3b1-fe11d7fd9391","score":1.0},{"gtasId":"20806791","derogIds":[],"tamrId":"4f5aeb03-f8db-395b-a3c3-47ec7cbcaab8","score":1.0},{"gtasId":"19899090","derogIds":[],"tamrId":"e6ce8c95-8cab-3dc4-96ce-f95120c3196f","score":0.9945945945945945},{"gtasId":"11362548","derogIds":[],"tamrId":"e8d56402-2a1f-3d22-8494-0d2d02aa0875","score":0.9047619047619048},{"gtasId":"11730731","derogIds":[],"tamrId":"2e59bf1a-8b39-3c34-a666-8385f22a1a5b","score":0.6785714285714286},{"gtasId":"11839083","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12328169","derogIds":[],"tamrId":"293e0f0f-aea6-3256-9ce3-9ab52befe0ad","score":0.72},{"gtasId":"17518943","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13317005","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16101087","derogIds":[],"tamrId":"3fcd204f-4a3d-3401-a90d-377acc270fc4","score":1.0},{"gtasId":"22210434","derogIds":[],"tamrId":"db6f3305-bb93-3894-a3c1-608d2d011a8e","score":1.0},{"gtasId":"14852513","derogIds":[],"tamrId":"fb6985fc-fd10-366b-a22f-26ac8ad3ec16","score":1.0},{"gtasId":"22212854","derogIds":[],"tamrId":"15103281-59a7-38c9-848f-56d1ace59b2f","score":1.0},{"gtasId":"15469516","derogIds":[],"tamrId":"e78316d2-1871-3631-a6e6-ac7e87827de5","score":1.0},{"gtasId":"10491647","derogIds":[],"tamrId":"2cf1db76-51f6-30f2-8b15-004a42dd3cb3","score":1.0},{"gtasId":"22783741","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16013773","derogIds":[],"tamrId":"2ba4b74a-7077-3148-8181-be17f277188c","score":1.0},{"gtasId":"11232162","derogIds":[],"tamrId":"b216bfb5-8d1e-3421-a9d3-fabdb6c305cd","score":1.0},{"gtasId":"16888605","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13960605","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16499312","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11671935","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"14676425","derogIds":[],"tamrId":"ca9ab2aa-59fc-3b40-a487-644968543b30","score":1.0},{"gtasId":"11130478","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19533392","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17127334","derogIds":[],"tamrId":"9e399faf-efe3-3db4-b6c6-c3c2b1b8b058","score":0.8904109589041096},{"gtasId":"12008906","derogIds":[],"tamrId":"a91e540d-9fcc-38d3-a88c-0e9b98ff0aef","score":0.95},{"gtasId":"21026411","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19130882","derogIds":[],"tamrId":"554f1c49-ac96-3ca8-b131-6917f03063e9","score":1.0},{"gtasId":"12347186","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"19557479","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10676222","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"18292933","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17625193","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17698448","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1048087","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1366778","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11187008","derogIds":[],"tamrId":"3f597bfd-5bd6-3426-9e20-edbdc1b7ba0d","score":1.0},{"gtasId":"10477368","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"11746292","derogIds":[],"tamrId":"3dde771d-4001-388f-b5dc-0cd308064d14","score":1.0},{"gtasId":"16697312","derogIds":[],"tamrId":"274fc150-ac84-361f-9bb4-a68d9379a7e8","score":0.84},{"gtasId":"11747385","derogIds":[],"tamrId":"3f92cf82-9d15-32fe-aad4-e9ef201568c5","score":1.0},{"gtasId":"22713885","derogIds":[],"tamrId":"485f2911-8a50-3cde-8da7-ff95e375d295","score":1.0},{"gtasId":"14720089","derogIds":[],"tamrId":"af527f25-e708-3a7e-aada-90fbdf97d828","score":1.0},{"gtasId":"14254033","derogIds":[],"tamrId":"9fbf4478-9232-30f3-80a5-1495b42aaaa1","score":1.0},{"gtasId":"18184118","derogIds":[],"tamrId":"efe0699a-f42c-3be9-a63e-5f8be2d4dc05","score":1.0},{"gtasId":"20852403","derogIds":[],"tamrId":"8562ba4e-cd47-305f-aed1-f25d9641b342","score":1.0},{"gtasId":"16898516","derogIds":[],"tamrId":"78dbbab4-7205-3569-9113-3b31975a7b37","score":1.0},{"gtasId":"19923999","derogIds":[],"tamrId":"2b2e938a-84b2-3a38-9700-2ead2a308a4b","score":1.0},{"gtasId":"16128478","derogIds":[],"tamrId":"229da7ad-865c-33d5-b847-29bc074ee3f4","score":1.0},{"gtasId":"19908358","derogIds":[],"tamrId":"f62d5aed-75b8-3fc9-8516-e414e788e01c","score":1.0},{"gtasId":"15696025","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13692919","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12797809","derogIds":[],"tamrId":"9a5db7de-5b4b-35cb-a61c-fcb31a1afe22","score":1.0},{"gtasId":"20970710","derogIds":[],"tamrId":"06231add-a3fa-3cc7-adea-f84c3a48df91","score":1.0},{"gtasId":"13551881","derogIds":[],"tamrId":"15428126-7615-3ee6-badd-2763e3028edb","score":1.0},{"gtasId":"20735222","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21185204","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"16626096","derogIds":[],"tamrId":"7af2c413-3022-3efd-90ad-e2410205effc","score":0.9777777777777779},{"gtasId":"20779126","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1435132","derogIds":[],"tamrId":"5114b6fd-b8f6-35bc-a3e6-fd146e6c1bb1","score":1.0},{"gtasId":"11444012","derogIds":[],"tamrId":"58333c3f-07cd-3325-9d1b-ee524d964677","score":0.65},{"gtasId":"14143758","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"1996615","derogIds":[],"tamrId":"bfbde16e-a5e9-34e5-ac98-c8f0f5a6c5cd","score":1.0},{"gtasId":"21743180","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15174456","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"17142502","derogIds":[],"tamrId":"94007340-ea20-31e5-ad14-86fde7a46029","score":1.0},{"gtasId":"11040744","derogIds":[],"tamrId":"6c7441dc-c16a-33f7-964f-faa5719180a2","score":1.0},{"gtasId":"21131871","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"13665564","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2169859","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"12127078","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"15361107","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"10843423","derogIds":[],"tamrId":"48ec6ed3-3824-3ce7-bdea-d32ea7e3619a","score":0.9487179487179487},{"gtasId":"11433361","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"21219061","derogIds":[],"tamrId":"2581d4b1-540f-316d-a2b6-ce8f5cf03de2","score":0.9608695652173912},{"gtasId":"13935786","derogIds":[],"tamrId":null,"score":0.0}]} +{"travelerQuery":[{"gtasId":"433202","derogIds":[],"tamrId":"e898539e-85a8-3402-8e0d-dee3d6d1e128","score":1.0},{"gtasId":"6607558","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9103158","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23323265","derogIds":[],"tamrId":"d06b3e9d-5119-3c2e-ae47-2d56639e9e7c","score":1.0},{"gtasId":"9899621","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6289743","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6651399","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2757050","derogIds":[],"tamrId":"9e645a60-62a6-3108-afb2-cb01d7d245c2","score":1.0},{"gtasId":"3411778","derogIds":[],"tamrId":"99b8b7f1-f52b-305d-bdf3-0be80175249e","score":1.0},{"gtasId":"6689771","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"308527","derogIds":[],"tamrId":"e3aa2e59-8247-32f1-be57-27a9ef44a80a","score":1.0},{"gtasId":"9303856","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3408230","derogIds":[],"tamrId":"c378a5f8-0ac3-3fa1-87e2-ecd2204a57d2","score":1.0},{"gtasId":"991199","derogIds":[],"tamrId":"ec411043-148d-35cd-a920-91c5db806f14","score":1.0},{"gtasId":"3739152","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23644493","derogIds":[],"tamrId":"4391ab66-9520-32ef-bf5b-91585caa203a","score":0.990909090909091},{"gtasId":"24590194","derogIds":[],"tamrId":"eb09b029-33ab-30e0-9d7f-1fb5c8fcd21e","score":1.0},{"gtasId":"6505999","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8112351","derogIds":[],"tamrId":"26dab513-570a-3db0-8514-5b021a995a71","score":0.9928571428571429},{"gtasId":"7222217","derogIds":[],"tamrId":"27d1379f-5e11-3e8d-9608-6c2476853f68","score":1.0},{"gtasId":"6996131","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3443261","derogIds":[],"tamrId":"ee0ed2f9-6584-3769-b6f8-de6cc74b4afc","score":1.0},{"gtasId":"5169616","derogIds":[],"tamrId":"acf25595-fbec-3184-b534-b8d38f058dc6","score":1.0},{"gtasId":"8071803","derogIds":[],"tamrId":"e9beb27b-f58e-380e-937b-78bc9e79d924","score":1.0},{"gtasId":"8929927","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9244328","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8020250","derogIds":[],"tamrId":"0e3595a2-c690-33da-986b-7509296592c2","score":1.0},{"gtasId":"4256654","derogIds":[],"tamrId":"bee5174b-9e9d-3b78-9463-d4ddc7c4e692","score":1.0},{"gtasId":"8604486","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"447866","derogIds":[],"tamrId":"bcba7534-c7f4-3b09-b5df-915bfd379a81","score":1.0},{"gtasId":"7064736","derogIds":[],"tamrId":"0e97ca34-e5cc-3ab9-b077-e89d59a037e7","score":1.0},{"gtasId":"8144156","derogIds":[],"tamrId":"f747f2a1-3977-39c1-af21-ddb6dd93d5b9","score":1.0},{"gtasId":"25533915","derogIds":[],"tamrId":"2dba75ed-09c5-3201-9191-9a2925796d8e","score":1.0},{"gtasId":"3111219","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8228312","derogIds":[],"tamrId":"d7678515-38af-382c-b51d-8fbf8e76db4e","score":1.0},{"gtasId":"7426179","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9304842","derogIds":[],"tamrId":"840a927f-2d98-350b-aa56-0e80ea876eab","score":0.7037037037037037},{"gtasId":"4772407","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7482086","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6504205","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23660530","derogIds":[],"tamrId":"f7fbab1c-b5f9-302c-bfa1-28722a10d2f6","score":1.0},{"gtasId":"786195","derogIds":[],"tamrId":"73b31946-6edd-3ce8-80d4-440d5efdf7e4","score":1.0},{"gtasId":"24607860","derogIds":[],"tamrId":"2581d4b1-540f-316d-a2b6-ce8f5cf03de2","score":0.9304347826086956},{"gtasId":"24688758","derogIds":[],"tamrId":"4784f55d-769f-3c06-854b-a52f221b442a","score":0.9523809523809523},{"gtasId":"9712320","derogIds":[],"tamrId":"ef199842-2196-3765-a834-d00e59d05468","score":1.0},{"gtasId":"6779003","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8354885","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24407078","derogIds":[],"tamrId":"81df854c-57ad-3dd8-b8f2-ef5e4e96aa90","score":1.0},{"gtasId":"4768336","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25100192","derogIds":[],"tamrId":"2607caf5-9495-30ce-b249-eb579bcc7bd7","score":1.0},{"gtasId":"5524711","derogIds":[],"tamrId":"c561e486-2402-3a2e-9e6b-665ec6fa60d6","score":1.0},{"gtasId":"8433772","derogIds":[],"tamrId":"e883f861-3295-302c-aa80-fa075ae63d1e","score":1.0},{"gtasId":"23073787","derogIds":[],"tamrId":"5841322d-f3c4-3c5e-b674-75dc6a21a76e","score":1.0},{"gtasId":"5024803","derogIds":[],"tamrId":"94b2e49a-c1ca-3094-a478-3fff0cd666b5","score":1.0},{"gtasId":"4671863","derogIds":[],"tamrId":"b07bf250-5336-3eb1-a3a8-327a10d405d7","score":0.9117647058823529},{"gtasId":"5032653","derogIds":[],"tamrId":"6a03b40c-9e5d-363a-aa9a-a88dbd54b663","score":1.0},{"gtasId":"24648247","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5537520","derogIds":[],"tamrId":"914e491b-76f4-3485-b353-33c4f0bd57b8","score":1.0},{"gtasId":"443200","derogIds":[],"tamrId":"247315ca-f06d-314a-891d-6120bd631f4a","score":0.0},{"gtasId":"9073470","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4368792","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5730320","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6755383","derogIds":[],"tamrId":"fa39974f-6330-3c8c-95ec-893ad5305080","score":0.9565217391304348},{"gtasId":"23862044","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2450580","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4121748","derogIds":[],"tamrId":"f86fd08b-123a-3f0f-83af-018843a96d3b","score":0.8387096774193549},{"gtasId":"9010388","derogIds":[],"tamrId":"123d8155-bc3a-3c1f-ae1a-6174b55dd851","score":1.0},{"gtasId":"8423954","derogIds":[],"tamrId":"f2a55fc4-5274-3769-923a-aa79182db29e","score":1.0},{"gtasId":"25118458","derogIds":[],"tamrId":"4476d55d-c382-3e5b-bbd6-cdbc4ca0bfc0","score":1.0},{"gtasId":"6893023","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2911331","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5237711","derogIds":[],"tamrId":"ef8c7467-5d04-3ff1-956c-842314f39b12","score":1.0},{"gtasId":"8711797","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2556416","derogIds":[],"tamrId":"1fe89589-6921-3a6c-85ef-04791a212f12","score":0.5172413793103449},{"gtasId":"9612430","derogIds":[],"tamrId":"991cd340-bf6c-36b5-be3e-77a617bd7e14","score":1.0},{"gtasId":"25094533","derogIds":[],"tamrId":"624d4068-6c2f-3059-82a5-83eaf476e076","score":0.9545454545454546},{"gtasId":"9498794","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3721503","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6199828","derogIds":[],"tamrId":"8f1e467e-5977-3982-b6a4-56e110dfefa4","score":1.0},{"gtasId":"7026054","derogIds":[],"tamrId":"1954e670-afcf-3256-98d8-7dd61e7df3f6","score":1.0},{"gtasId":"9836018","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23451324","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3905901","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"801315","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8230834","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4964298","derogIds":[],"tamrId":"9808bbec-ba5e-352d-939e-e9aa794bc2b0","score":1.0},{"gtasId":"9138695","derogIds":[],"tamrId":"3383d2f9-b2f7-3977-b433-9b789f69b86a","score":1.0},{"gtasId":"6906514","derogIds":[],"tamrId":"2c5e3223-689f-34b2-b215-c7874d0e60f6","score":0.9846153846153847},{"gtasId":"645948","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6443915","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4297344","derogIds":[],"tamrId":"c03e72f9-3655-3fea-9bdc-5f0258f41943","score":1.0},{"gtasId":"6406850","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6437113","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23681968","derogIds":[],"tamrId":"1cf07595-5a3f-3a34-8467-89a0b6e7724c","score":1.0},{"gtasId":"6503507","derogIds":[],"tamrId":"edff8429-c70e-33c6-bc70-cdd6cf23854f","score":1.0},{"gtasId":"7836382","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8998565","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6919324","derogIds":[],"tamrId":"10ee17d5-a8d3-3618-b54f-00493c9236bc","score":0.9230769230769231},{"gtasId":"9245919","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4757882","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4995258","derogIds":[],"tamrId":"ea58c1c0-8131-3328-9887-c9782b52a554","score":1.0},{"gtasId":"9685839","derogIds":[],"tamrId":"563b3827-7a27-351f-8330-3f4200e427cf","score":1.0},{"gtasId":"6045514","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25391658","derogIds":[],"tamrId":"729a93fc-c318-3b54-910c-022dbb5bd40f","score":1.0},{"gtasId":"22890351","derogIds":[],"tamrId":"cae87699-4b66-3854-ade7-cdcab430c6b1","score":0.8529411764705882},{"gtasId":"7200835","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4417567","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6641991","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9102114","derogIds":[],"tamrId":"9ce72703-6cb4-3207-bc33-a01db2e8b274","score":1.0},{"gtasId":"8639728","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5641795","derogIds":[],"tamrId":"3e076349-b67d-3fd5-8520-c3fb192d67ef","score":1.0},{"gtasId":"9187043","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"737721","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5823695","derogIds":[],"tamrId":"5c407c3d-ff8e-3f33-a49d-2af7140e52eb","score":1.0},{"gtasId":"23050080","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23156679","derogIds":[],"tamrId":"a8d11bbe-784a-372c-82a3-f608aef3b67d","score":1.0},{"gtasId":"3395910","derogIds":[],"tamrId":"d16c6ed5-d2e1-30f3-bcf0-1bd8c42fb77b","score":1.0},{"gtasId":"8021983","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5485366","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9043989","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24625450","derogIds":[],"tamrId":"fdee8852-5395-3fbc-a7e3-6d42ccef0206","score":1.0},{"gtasId":"5359464","derogIds":[],"tamrId":"acf65ff1-617f-33a9-8acc-f38d7717b258","score":0.9210526315789473},{"gtasId":"24539338","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24403771","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6954423","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2693245","derogIds":[],"tamrId":"f36a6ea4-abda-362c-91dc-8bc044e5fffc","score":1.0},{"gtasId":"2744241","derogIds":[],"tamrId":"f182cb87-e980-368e-ad73-43814261eb39","score":0.9761904761904762},{"gtasId":"7266891","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7496403","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7220341","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4449376","derogIds":[],"tamrId":"3bb85105-99cc-3b61-bffa-fce332ebe38b","score":1.0},{"gtasId":"8773122","derogIds":[],"tamrId":"b22a73ca-e000-317c-b720-7553dafcce32","score":1.0},{"gtasId":"3175405","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4530176","derogIds":[],"tamrId":"da996e44-302f-3832-8374-c1d9b5727397","score":0.0},{"gtasId":"3026732","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4485146","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"86235","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7524658","derogIds":[],"tamrId":"f96aa214-8e0e-30da-8ede-dd1c98268a54","score":1.0},{"gtasId":"4098072","derogIds":[],"tamrId":"edc9a4de-742a-36cc-b9d4-77e6afb4a86f","score":1.0},{"gtasId":"7493360","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5997416","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8038054","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8549802","derogIds":[],"tamrId":"de021a6d-e248-3130-bc92-6bdda6f612ad","score":0.75},{"gtasId":"3173514","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9664702","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8799689","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5442892","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9381659","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8784073","derogIds":[],"tamrId":"97b70282-9e3a-39f8-8ada-e24bff0a407a","score":0.9130434782608695},{"gtasId":"4212862","derogIds":[],"tamrId":"42408259-66ea-3beb-a4b1-103df6c96736","score":1.0},{"gtasId":"23472872","derogIds":[],"tamrId":"64d8ee29-c24f-38a1-8290-5df257642871","score":1.0},{"gtasId":"2582719","derogIds":[],"tamrId":"4d831bcf-8e5c-388b-af63-05d2637b253c","score":1.0},{"gtasId":"8170412","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2619402","derogIds":[],"tamrId":"e7691a10-4456-3473-948e-5f59a75438e0","score":1.0},{"gtasId":"3148268","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3906180","derogIds":[],"tamrId":"223652fa-8620-331f-9b4d-9da3cc1fac3d","score":1.0},{"gtasId":"9291902","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"99329","derogIds":[],"tamrId":"ef8608cf-df35-3514-ad00-b2b544144739","score":1.0},{"gtasId":"6464303","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"273084","derogIds":[],"tamrId":"ad85f34e-a8f6-3bf9-a4e3-88b7b03ca930","score":0.8529411764705882},{"gtasId":"23613450","derogIds":[],"tamrId":"62d680ca-8fec-3371-93c0-4085a878d44c","score":1.0},{"gtasId":"6748900","derogIds":[],"tamrId":"2a2344e0-55b7-3fa3-a7b7-bc361fd73a27","score":1.0},{"gtasId":"2550606","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7798795","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4209692","derogIds":[],"tamrId":"811f2d64-796a-3efd-abb9-abc63a81c661","score":1.0},{"gtasId":"9287773","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23311539","derogIds":[],"tamrId":"00d611b2-c847-3bb9-a934-84f96e3ec78a","score":1.0},{"gtasId":"4788441","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"649345","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5463570","derogIds":[],"tamrId":"2bedecbf-fd91-3f90-8e17-eb21b7f8b657","score":1.0},{"gtasId":"23190460","derogIds":[],"tamrId":"14a52a8d-d033-336d-b343-702a6e73675c","score":1.0},{"gtasId":"3930585","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"739072","derogIds":[],"tamrId":"23be4110-54a4-374c-96c4-1c3d77693799","score":0.875},{"gtasId":"5287336","derogIds":[],"tamrId":"50b80be0-ab1d-3e93-aa1c-93ac57a26fb2","score":1.0},{"gtasId":"7605881","derogIds":[],"tamrId":"914881ef-62b0-3d02-8c5e-78d50e400fad","score":1.0},{"gtasId":"8464622","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25025192","derogIds":[],"tamrId":"4ccfeb5b-2687-3261-b652-89b588edbafc","score":1.0},{"gtasId":"4789782","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"777336","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"242451","derogIds":[],"tamrId":"d307fad9-b525-391a-830c-edccf2832cec","score":1.0},{"gtasId":"440463","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6989703","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"56404","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25461979","derogIds":[],"tamrId":"7f812491-763c-37d4-b5f0-2e14204decd2","score":0.0},{"gtasId":"24429809","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9869308","derogIds":[],"tamrId":"84eaed4b-18bf-3b07-8028-0196d9f670b2","score":0.9739130434782608},{"gtasId":"8965003","derogIds":[],"tamrId":"293e0f0f-aea6-3256-9ce3-9ab52befe0ad","score":0.9879999999999999},{"gtasId":"5476909","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6695893","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2942813","derogIds":[],"tamrId":"0ce06d3b-3d34-3444-ad4a-acf34536cea4","score":1.0},{"gtasId":"23907936","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4305453","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2329118","derogIds":[],"tamrId":"8eae2276-b1ec-3388-8551-f36d7708cf2b","score":1.0},{"gtasId":"4030113","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25051050","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4271354","derogIds":[],"tamrId":"3311dafd-3434-3959-b1b9-8e20c754f12e","score":1.0},{"gtasId":"6316412","derogIds":[],"tamrId":"073efeb9-f199-3b95-8504-251cdbabe1bc","score":1.0},{"gtasId":"4823638","derogIds":[],"tamrId":"fd10f93a-fb98-33f5-b207-d74cf1e6dd4a","score":1.0},{"gtasId":"4087017","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3350837","derogIds":[],"tamrId":"8c3d205c-9e43-331e-a7a1-da6194870065","score":1.0},{"gtasId":"2764020","derogIds":[],"tamrId":"4f2ee22a-5d75-3405-8d06-3fb4fda48a22","score":0.8888888888888888},{"gtasId":"24877838","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7325903","derogIds":[],"tamrId":"75ab82eb-7a5b-3c80-a84a-14014c72cb75","score":1.0},{"gtasId":"24670539","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8197497","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"337502","derogIds":[],"tamrId":"56e81154-ee2f-3585-b055-feb7a1445ad8","score":1.0},{"gtasId":"2298424","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3712138","derogIds":[],"tamrId":"1fc46185-ebaf-3fb3-a25e-03efee180362","score":0.92},{"gtasId":"5428966","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7630564","derogIds":[],"tamrId":"91e6bb5e-c648-3776-9bff-4fae0a482a90","score":1.0},{"gtasId":"8954586","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3932315","derogIds":[],"tamrId":"b717ac7a-9c14-31e0-af52-a68fbe817bb9","score":1.0},{"gtasId":"9288821","derogIds":[],"tamrId":"ea9ca14a-1064-3881-b34e-2be048700477","score":1.0},{"gtasId":"22877546","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7071951","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22980542","derogIds":[],"tamrId":"06a3ba9a-8c72-3f65-83fc-3824f20112d8","score":1.0},{"gtasId":"3810802","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8921768","derogIds":[],"tamrId":"07c5820b-c70d-3a65-9778-b436bb3b9072","score":0.6901408450704225},{"gtasId":"4566043","derogIds":[],"tamrId":"47a73c67-77bb-3204-a9de-95eeea901c49","score":0.982608695652174},{"gtasId":"22886169","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6492","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3215097","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5198420","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8579725","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23414808","derogIds":[],"tamrId":"aea1dce0-3287-3b04-be30-daa7fb6151c6","score":1.0},{"gtasId":"6870818","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4969251","derogIds":[],"tamrId":"5d35efb7-ede8-3967-bbb3-a6adaef50030","score":1.0},{"gtasId":"2410314","derogIds":[],"tamrId":"2b2fb04d-5165-376c-94d7-9788ac44f58a","score":1.0},{"gtasId":"23660099","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2375166","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3176334","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4498297","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8169818","derogIds":[],"tamrId":"f1ad3107-692e-3af1-b503-91c6a64dc797","score":1.0},{"gtasId":"8233357","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23938596","derogIds":[],"tamrId":"56f47627-ca13-331b-adc6-fba24a8928f2","score":1.0},{"gtasId":"7470535","derogIds":[],"tamrId":"d2ec7acf-8358-39d6-8d8d-417a570a1f54","score":1.0},{"gtasId":"24476757","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2672294","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9921180","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6752866","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23198934","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7506606","derogIds":[],"tamrId":"4023914d-ab61-322e-acf3-b6ed9698a441","score":0.9803921568627451},{"gtasId":"8418957","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23377484","derogIds":[],"tamrId":"d78b2236-9ce3-3915-a68a-ef1c86ed71b8","score":1.0},{"gtasId":"25136308","derogIds":[],"tamrId":"c926985f-d674-3d1e-9706-9430127fe3c1","score":1.0},{"gtasId":"5897315","derogIds":[],"tamrId":"5e1439fa-fca1-31a4-8313-7db324d2e6a8","score":1.0},{"gtasId":"5529845","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7265823","derogIds":[],"tamrId":"55c06817-f24f-3236-9a12-82c7d0c164b2","score":0.9300000000000003},{"gtasId":"24645760","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3857919","derogIds":[],"tamrId":"83087870-7914-3073-9f80-0e22656e8c30","score":1.0},{"gtasId":"5960033","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23649112","derogIds":[],"tamrId":"b72e2194-e6b6-3349-b274-47d5487fbbbc","score":1.0},{"gtasId":"23087386","derogIds":[],"tamrId":"78ec2464-5ee7-3edb-b12f-f4c7ad22f6d7","score":1.0},{"gtasId":"24040943","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6583981","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7844360","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3899712","derogIds":[],"tamrId":"49d96e35-6663-35da-9720-97d73b1e8d17","score":0.8125},{"gtasId":"24049993","derogIds":[],"tamrId":"b730e5d6-b64c-304f-be1b-d68de803d1bd","score":1.0},{"gtasId":"25455491","derogIds":[],"tamrId":"3f92cf82-9d15-32fe-aad4-e9ef201568c5","score":1.0},{"gtasId":"23688787","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2853193","derogIds":[],"tamrId":"258e986c-c95d-3ade-acd2-09580c301abb","score":1.0},{"gtasId":"954153","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6429248","derogIds":[],"tamrId":"e9367500-ade7-3365-ad12-9364e6a50e78","score":1.0},{"gtasId":"4040230","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23202353","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24734251","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5712117","derogIds":[],"tamrId":"edb4b9e3-896e-3099-98d8-15ac35741efb","score":1.0},{"gtasId":"2421332","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6304230","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5187882","derogIds":[],"tamrId":"d4bb99af-5bce-3e7e-8637-5be01c4a63a7","score":1.0},{"gtasId":"6102093","derogIds":[],"tamrId":"c08abc13-d60d-3546-9a8a-3fc5d7ebd1c6","score":1.0},{"gtasId":"25181695","derogIds":[],"tamrId":"a7ec5a3a-31d6-34dc-a474-dd64dbcd22bb","score":0.9818181818181818},{"gtasId":"2518739","derogIds":[],"tamrId":"f1d68345-47da-372f-8f0b-14ab92518f90","score":1.0},{"gtasId":"2573874","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6899000","derogIds":[],"tamrId":"6aef1bac-87bd-3cf5-b4d1-81aaf2129c7b","score":1.0},{"gtasId":"3987390","derogIds":[],"tamrId":"da5bc0eb-ca2f-3f6a-94bc-ab5dec44e5b2","score":0.8},{"gtasId":"6978551","derogIds":[],"tamrId":"8d82536e-17f5-3ae8-8f0c-cd9688c5d1e5","score":1.0},{"gtasId":"3405782","derogIds":[],"tamrId":"fd8477d6-d9a3-32b7-9d62-bc1828b1f8ae","score":1.0},{"gtasId":"2598815","derogIds":[],"tamrId":"6458cc4b-daa6-309d-85fa-d9d97f8d73a8","score":1.0},{"gtasId":"6345198","derogIds":[],"tamrId":"4f11961b-3191-3bd8-a123-8404a8012d85","score":1.0},{"gtasId":"6190457","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"745482","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4889352","derogIds":[],"tamrId":"8fcee133-978b-3b59-97c5-2e3e153f77f2","score":1.0},{"gtasId":"9274852","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6506026","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"531216","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"494201","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"853623","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24232860","derogIds":[],"tamrId":"360c44a1-3510-36b1-ae60-df23435c0f15","score":1.0},{"gtasId":"893297","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"878908","derogIds":[],"tamrId":"3c656de0-22d2-3623-a0b5-8fe73c82add8","score":1.0},{"gtasId":"8359572","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4845338","derogIds":[],"tamrId":"9eb5378b-3bc1-3021-8572-598040a3b57a","score":1.0},{"gtasId":"2625586","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7516358","derogIds":[],"tamrId":"bfd82a1a-abae-33fc-b8b5-75a5f4aaa2b1","score":1.0},{"gtasId":"624346","derogIds":[],"tamrId":"2770da43-6605-3ace-b3e2-76331f330b29","score":1.0},{"gtasId":"3470229","derogIds":[],"tamrId":"78e0c26a-d1fd-3a9b-a705-c29debeb2614","score":1.0},{"gtasId":"959629","derogIds":[],"tamrId":"3b821f84-a79f-35ef-9e13-109cc692c9dd","score":1.0},{"gtasId":"4099755","derogIds":[],"tamrId":"369fbca0-612b-3b2d-88c3-10044cbf9080","score":1.0},{"gtasId":"5059140","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25234686","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5030959","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7762836","derogIds":[],"tamrId":"d7f5e813-23a9-3bd6-b91a-d5eaed31cd9a","score":1.0},{"gtasId":"3752527","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2687270","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7564307","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7023008","derogIds":[],"tamrId":"a6c628ba-a82e-39bc-82de-a81645f8e4bd","score":1.0},{"gtasId":"2331272","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2375422","derogIds":[],"tamrId":"fef29761-ca93-34ab-a21a-70807bb9027e","score":1.0},{"gtasId":"968237","derogIds":[],"tamrId":"08c03dda-6485-363f-9ac7-0b816471bfd3","score":1.0},{"gtasId":"7607496","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3375884","derogIds":[],"tamrId":"121fa2b3-5383-3363-9176-bbe82a2bb132","score":1.0},{"gtasId":"8656521","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4134736","derogIds":[],"tamrId":"05660a01-5aa4-3637-81f8-30c88b671e8c","score":1.0},{"gtasId":"4321651","derogIds":[],"tamrId":"d694be61-dc2a-34f2-9d41-b05cf0311f82","score":0.0},{"gtasId":"6625713","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4193937","derogIds":[],"tamrId":"caa0ebd3-7dfc-3966-9fae-7371e9a987dd","score":0.90625},{"gtasId":"6386257","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24998776","derogIds":[],"tamrId":"6e6c0d9a-3d68-34b9-8948-514ff44314be","score":0.9454545454545454},{"gtasId":"8805075","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24709338","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5252861","derogIds":[],"tamrId":"f2decd9b-368f-3a65-b8b0-f83126838bbf","score":1.0},{"gtasId":"6202258","derogIds":[],"tamrId":"58566a08-c2be-3745-a35a-aa781ce1826c","score":0.723404255319149},{"gtasId":"24464486","derogIds":[],"tamrId":"3457d4f6-c8ea-30ad-ad9e-9e225825e736","score":0.99375},{"gtasId":"3777814","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"696060","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"806358","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"22818951","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3989494","derogIds":[],"tamrId":"84b8bc58-32c4-3c8d-9900-268153aa1313","score":1.0},{"gtasId":"8336025","derogIds":[],"tamrId":"2597fee6-f5e3-3e2b-b555-15a5a3149e52","score":1.0},{"gtasId":"8693947","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3855870","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3061031","derogIds":[],"tamrId":"3c327bd5-b64f-360a-b4b6-ed69644afd71","score":1.0},{"gtasId":"2688464","derogIds":[],"tamrId":"bee5174b-9e9d-3b78-9463-d4ddc7c4e692","score":1.0},{"gtasId":"8175302","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6304255","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7377521","derogIds":[],"tamrId":"8554fad2-1d41-3c5c-96f9-a9e591fe2e3d","score":1.0},{"gtasId":"402994","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3831316","derogIds":[],"tamrId":"6eb78309-49bf-3741-b357-99c42ab4e7ab","score":0.9333333333333333},{"gtasId":"8665253","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24470818","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3932172","derogIds":[],"tamrId":"ed475f9d-7a8a-38cb-8752-87afbcf50238","score":0.9782608695652174},{"gtasId":"8680631","derogIds":[],"tamrId":"4ea20136-8a90-3bd8-8f4a-5bb7e42b5457","score":1.0},{"gtasId":"6808243","derogIds":[],"tamrId":"c378a5f8-0ac3-3fa1-87e2-ecd2204a57d2","score":1.0},{"gtasId":"5573409","derogIds":[],"tamrId":"8e60514f-5219-3746-83e2-d0c168e8392b","score":0.9333333333333332},{"gtasId":"23114130","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4581039","derogIds":[],"tamrId":"9a5e926e-de76-36a4-9fee-4382d95f1a8c","score":1.0},{"gtasId":"5436960","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8623503","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"25512480","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6610368","derogIds":[],"tamrId":"a3062436-d6c3-3b29-96cc-10ad4d14afb2","score":1.0},{"gtasId":"6851371","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4319772","derogIds":[],"tamrId":"44df8d2a-0927-3056-b323-29edb3282ae0","score":1.0},{"gtasId":"5322803","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23313146","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9759649","derogIds":[],"tamrId":"690fa8c5-0f48-3ef5-a4d7-e644fd0bbf5d","score":1.0},{"gtasId":"25187615","derogIds":[],"tamrId":"412f5c46-8a3f-3b83-b573-cbac8197e53f","score":1.0},{"gtasId":"2832006","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9491503","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"478046","derogIds":[],"tamrId":"2288e016-639c-3274-a719-03338db56679","score":1.0},{"gtasId":"3061130","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9505796","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6291471","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6062737","derogIds":[],"tamrId":"3865b7c4-4897-3e4c-9c20-7f740b8170bb","score":1.0},{"gtasId":"5704458","derogIds":[],"tamrId":"ce7dea70-1da3-3ea4-b8b2-06645df8db21","score":1.0},{"gtasId":"6849053","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9373110","derogIds":[],"tamrId":"dee52aa9-027a-343a-b47a-7fb0334f8377","score":1.0},{"gtasId":"6062860","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5939966","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6267062","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23359012","derogIds":[],"tamrId":"b2a549df-6a1a-3286-aa77-9b1d0f7f5bab","score":1.0},{"gtasId":"5080289","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"9430079","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5984948","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"4015135","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3899333","derogIds":[],"tamrId":"dce71733-ddb9-3e97-aea2-2743188f5a93","score":1.0},{"gtasId":"2601424","derogIds":[],"tamrId":"defea41e-2720-393e-8317-45403118bd76","score":0.9285714285714286},{"gtasId":"3679312","derogIds":[],"tamrId":"b92637f0-6221-333d-b972-208ffbf6c27d","score":0.9888888888888889},{"gtasId":"4422013","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5318119","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7738658","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24988689","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5362362","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"8693908","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2757071","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"5499297","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"434481","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3383192","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23370382","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"23184696","derogIds":[],"tamrId":"491cb0e2-ab6a-36c6-8ec6-d3cdc8c6e466","score":1.0},{"gtasId":"24386818","derogIds":[],"tamrId":"b5969a4c-8389-35f9-8a55-76b02cb50be7","score":0.6666666666666666},{"gtasId":"7131214","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"7989497","derogIds":[],"tamrId":"d95d70ff-865e-381c-8d82-89eab8162699","score":1.0},{"gtasId":"3425305","derogIds":[],"tamrId":"37a240b1-eea1-32eb-b268-51b2f88f4d6f","score":0.9625},{"gtasId":"3249300","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"6006518","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"3525190","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"2638805","derogIds":[],"tamrId":"bd7d324a-ca9c-356e-9dd5-c0f7a70416c0","score":0.9393939393939394},{"gtasId":"6581297","derogIds":[],"tamrId":null,"score":0.0},{"gtasId":"24653880","derogIds":[],"tamrId":null,"score":0.0}]} diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_update_response.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_update_response.json new file mode 100644 index 0000000000..fb9e517421 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/history_update_response.json @@ -0,0 +1 @@ +{"acknowledgment":true,"error":null} From 35b3424e665efe9385d05c957aabb754c198fd30 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 24 Jan 2020 15:14:06 -0500 Subject: [PATCH 05/83] Store JMS message type in TamrMessage instances --- .../parsers/tamr/jms/TamrMessageReceiver.java | 1 + .../gtas/parsers/tamr/model/TamrMessage.java | 16 +++++++++++++++- .../parsers/tamr/ReceiveTamrMessagesTest.java | 19 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java index c7e6c13b2a..a473eaaa42 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java @@ -65,6 +65,7 @@ public void receive(javax.jms.Message msg) { if (response == null) { return; } + response.setMessageType(messageType); if (messageType.equals("QUERY")) { tamrMessageHandler.handleQueryResponse(response); diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java index e438658184..4e5b36782e 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java @@ -16,6 +16,12 @@ * @author Cassidy Laidlaw */ public class TamrMessage { + /** + * The JMS message type, which is set by TamrMessageReceiver. + */ + @JsonIgnore + private String messageType; + private List travelerQuery; private List historyClusters; @@ -24,9 +30,17 @@ public class TamrMessage { private String error; private List recordErrors; - + public TamrMessage() { } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } public List getTravelerQuery() { return travelerQuery; diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index a66c0f5e8f..a0550a21cb 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -12,6 +12,7 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; +import org.mockito.ArgumentCaptor; import org.springframework.test.util.ReflectionTestUtils; import gov.gtas.parsers.ParserTestHelper; @@ -144,4 +145,22 @@ public void testMalformedMessage() throws JMSException { // Malformed messages should not make it through to the handler. verifyZeroInteractions(handler); } + + /** + * Make sure the JMS message type is stored properly in the parsed + * TamrMessage. + */ + @Test + public void testMessageTypeStored() throws JMSException { + TextMessage jmsMessage = mock(TextMessage.class); + given(jmsMessage.getJMSType()).willReturn("DC.REPLACE"); + given(jmsMessage.getText()).willReturn("{}"); + + receiver.receive(jmsMessage); + + final ArgumentCaptor messageCaptor = + ArgumentCaptor.forClass(TamrMessage.class); + verify(handler).handleAcknowledgeResponse(messageCaptor.capture()); + assertEquals("DC.REPLACE", messageCaptor.getValue().getMessageType()); + } } From 7f1d4d57e74d78d3a17b2331ccf9dcc0528ea241 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 24 Jan 2020 16:42:32 -0500 Subject: [PATCH 06/83] Log DEBUG messages instead of INFO on Tamr JMS messages --- .../gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java index a473eaaa42..103e7c1086 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java @@ -37,7 +37,7 @@ public class TamrMessageReceiver { @JmsListener(containerFactory = "tamrJmsListenerContainerFactory", destination = "OutboundQueue") public void receive(javax.jms.Message msg) { - logger.info("############### Tamr data received .... ################"); + logger.debug("############### Tamr data received .... ################"); TextMessage textMessage = null; String messageType, messageText; @@ -55,11 +55,11 @@ public void receive(javax.jms.Message msg) { e); return; } - logger.info("Message type: {}", messageType); + logger.debug("Message type: {}", messageType); if (messageText.length() > 1000) - logger.info("Raw JSON data: {}...", messageText.substring(0, 1000)); + logger.debug("Raw JSON data: {}...", messageText.substring(0, 1000)); else - logger.info("Raw JSON data: {}", messageText); + logger.debug("Raw JSON data: {}", messageText); TamrMessage response = this.parseMessage(messageText); if (response == null) { From 4154f2e2c24da5cf4d2eef768d33be1b3f9b87c7 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 24 Jan 2020 16:43:00 -0500 Subject: [PATCH 07/83] Remove unused code and imports --- .../gtas/parsers/tamr/jms/TamrQueueConfig.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java index 6fd9943172..16c3b468df 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java @@ -5,25 +5,17 @@ */ package gov.gtas.parsers.tamr.jms; -import javax.jms.ConnectionFactory; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Session; - import org.apache.activemq.ActiveMQConnectionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory; -import org.springframework.jms.support.destination.DestinationResolver; -//Uncomment in order in part to re-enable queues @Configuration @ConditionalOnProperty(prefix = "tamr", name = "enabled") @EnableJms @@ -38,16 +30,6 @@ public class TamrQueueConfig { public JmsListenerContainerFactory tamrJmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); -// factory.setDestinationResolver(new DestinationResolver() { -// @Override -// public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) -// throws JMSException { -// logger.info("session = {}, destinationName = {}, pubSubDomain = {}", -// session, destinationName, pubSubDomain); -// // Create a destination -// return session.createQueue("OutboundQueue"); -// } -// }); factory.setConnectionFactory( new ActiveMQConnectionFactory(activeMQBrokerUrl)); factory.setSessionTransacted(true); From 57eddd098415f59037fc7660b70d5f859ccc0599 Mon Sep 17 00:00:00 2001 From: Robert Stine Date: Fri, 24 Jan 2020 22:42:57 -0500 Subject: [PATCH 08/83] Add tamr adapter. Implement dataflow to be send outside of transaction after file load. --- .../gtas/job/scheduler/LoaderScheduler.java | 33 +++---- .../gov/gtas/services/ApisMessageService.java | 23 ++++- .../main/java/gov/gtas/services/Loader.java | 17 +++- .../gov/gtas/services/MessageInformation.java | 37 ++++++++ .../gtas/services/MessageLoaderService.java | 2 +- .../gov/gtas/services/PnrMessageService.java | 22 ++++- .../gov/gtas/services/ProcessedMessages.java | 11 ++- .../gov/gtas/parsers/tamr/TamrAdapter.java | 20 +++++ .../gtas/parsers/tamr/TamrAdapterImpl.java | 78 +++++++++++++++++ .../tamr/model/TamrDocumentSendObject.java | 6 ++ .../tamr/model/TamrPassengerSendObject.java | 9 ++ .../parsers/tamr/TamrAdapterImplTest.java | 86 +++++++++++++++++++ 12 files changed, 313 insertions(+), 31 deletions(-) create mode 100644 gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index 355ed78cf0..c9514b92b7 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -12,42 +12,24 @@ */ import static gov.gtas.constant.GtasSecurityConstants.GTAS_APPLICATION_USERID; -import gov.gtas.constant.RuleServiceConstants; import gov.gtas.enumtype.AuditActionType; -import gov.gtas.error.ErrorDetailInfo; -import gov.gtas.error.ErrorHandlerFactory; import gov.gtas.json.AuditActionData; import gov.gtas.json.AuditActionTarget; import gov.gtas.model.MessageStatus; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; import gov.gtas.repository.MessageStatusRepository; import gov.gtas.services.*; import gov.gtas.services.matcher.MatchingService; import gov.gtas.svc.TargetingService; import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.DirectoryStream; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.InvalidPathException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.Iterator; import java.util.List; -import java.util.Set; -import org.apache.commons.io.comparator.LastModifiedFileComparator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** @@ -110,12 +92,25 @@ public String toString() { @Value("${maxNumofFiles}") private int maxNumofFiles; + @Value("${tamr.enabled}") + private Boolean tamrEnabled; + private void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) { logger.debug(String.format("Processing %s", f.getAbsolutePath())); ProcessedMessages processedMessages = loader.processMessage(f, primeFlightKey); int[] result = processedMessages.getProcessed(); List messageStatusList = processedMessages.getMessageStatusList(); messageStatusRepository.saveAll(messageStatusList); + + if (tamrEnabled) { + // post message on queue here. Dummy Code below: + // todo : write send logic + List objectsToSend = processedMessages.getTamrPassengerSendObjectList(); + for (TamrPassengerSendObject tpso : objectsToSend) { + logger.info(tpso.toString()); + } + } + if (result != null) { stats.incrementNumFilesProcessed(); stats.incrementNumMessagesProcessed(result[0]); diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java index c3feab6e53..b9885ace59 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java @@ -10,12 +10,16 @@ import gov.gtas.model.*; import gov.gtas.model.lookup.Airport; +import gov.gtas.parsers.tamr.TamrAdapter; +import gov.gtas.parsers.tamr.TamrAdapterImpl; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; import gov.gtas.parsers.vo.BagVo; import gov.gtas.repository.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import gov.gtas.error.ErrorUtils; @@ -46,6 +50,9 @@ public class ApisMessageService extends MessageLoaderService { @Autowired private BookingBagRepository bookingBagRepository; + @Value("${tamr.enabled}") + private Boolean tamrEnabled; + @Override public List preprocess(String message) { return Collections.singletonList(message); @@ -97,7 +104,8 @@ public MessageDto parse(MessageDto msgDto) { } @Override - public MessageStatus load(MessageDto msgDto) { + public MessageInformation load(MessageDto msgDto) { + MessageInformation messageInformation = new MessageInformation(); msgDto.getMessageStatus().setSuccess(true); ApisMessage apis = msgDto.getApis(); try { @@ -124,16 +132,24 @@ public MessageStatus load(MessageDto msgDto) { msgDto.getMessageStatus().setFlightId(primeFlight.getId()); msgDto.getMessageStatus().setFlight(primeFlight); apis.setPassengerCount(apis.getPassengers().size()); + if (tamrEnabled) { + TamrAdapter tamrAdapter = new TamrAdapterImpl(); + List tamrPassengerSendObjectList = tamrAdapter + .convert(apis.getFlights().iterator().next(), apis.getPassengers()); + messageInformation.setTamrPassengerSendObjects(tamrPassengerSendObjectList); + } } catch (Exception e) { msgDto.getMessageStatus().setSuccess(false); msgDto.getMessageStatus().setMessageStatusEnum(MessageStatusEnum.FAILED_LOADING); handleException(e, msgDto.getApis()); logger.error("ERROR", e); } finally { - msgDto.getMessageStatus().setSuccess(createMessage(apis)); + boolean success = createMessage(apis); + msgDto.getMessageStatus().setSuccess(success); } - return msgDto.getMessageStatus(); + messageInformation.setMessageStatus(msgDto.getMessageStatus()); + return messageInformation; } /* @@ -244,6 +260,7 @@ private boolean createMessage(ApisMessage m) { try { m.setFilePath(loaderUtils.getUpdatedPath(m.getFilePath())); + m = msgDao.save(m); } catch (Exception e) { ret = false; diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java index 23e80c291b..87dcde83fd 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java @@ -7,14 +7,14 @@ import java.io.File; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; import gov.gtas.model.MessageStatusEnum; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import gov.gtas.error.ErrorUtils; @@ -38,6 +38,9 @@ public class Loader { @Autowired private PnrMessageService pnrLoader; + @Value("${tamr.enabled}") + private Boolean tamrEnabled; + /** * Processes all the messages in a single file. * @@ -99,11 +102,16 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { msgDto.setFilepath(filePath); rawMessages = msgDto.getRawMsgs(); List messageStatuses = new ArrayList<>(); + List tamrPassengerSendObjectList = new ArrayList<>(); for (String rawMessage : rawMessages) { msgDto.setRawMsg(rawMessage); MessageDto parsedMessageDto = svc.parse(msgDto); if (parsedMessageDto.getMessageStatus().isSuccess()) { - MessageStatus messageStatus = svc.load(parsedMessageDto); + MessageInformation messageInformation = svc.load(parsedMessageDto); + MessageStatus messageStatus = messageInformation.getMessageStatus(); + if (tamrEnabled) { + tamrPassengerSendObjectList.addAll(messageInformation.getTamrPassengerSendObjects()); + } messageStatuses.add(messageStatus); if (messageStatus.isSuccess()) { successMsgCount++; @@ -118,6 +126,7 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { ProcessedMessages processedMessages = new ProcessedMessages(); processedMessages.setProcessed(new int[] { successMsgCount, failedMsgCount }); processedMessages.setMessageStatusList(messageStatuses); + processedMessages.setTamrPassengerSendObjectList(tamrPassengerSendObjectList); return processedMessages; } diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java new file mode 100644 index 0000000000..c657335b82 --- /dev/null +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java @@ -0,0 +1,37 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +package gov.gtas.services; + +import gov.gtas.model.MessageStatus; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; + +import java.util.List; + +public class MessageInformation { + + MessageStatus messageStatus; + + private List tamrPassengerSendObjects; + + public MessageStatus getMessageStatus() { + return messageStatus; + } + + public void setMessageStatus(MessageStatus messageStatus) { + this.messageStatus = messageStatus; + } + + public void setTamrPassengerSendObjects(List tamrPassengerSendObjects) { + this.tamrPassengerSendObjects = tamrPassengerSendObjects; + } + + public List getTamrPassengerSendObjects() { + return tamrPassengerSendObjects; + } +} diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageLoaderService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageLoaderService.java index 72a5c03e77..818afa4ce2 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageLoaderService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageLoaderService.java @@ -51,7 +51,7 @@ public void setUseIndexer(boolean useIndexer) { public abstract MessageDto parse(MessageDto msgDto); - public abstract MessageStatus load(MessageDto msgDto); + public abstract MessageInformation load(MessageDto msgDto); WeightCountDto getBagStatistics(Set bagSet) { Set bagMeasurementsSet = bagSet.stream().map(Bag::getBagMeasurements).filter(Objects::nonNull) diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java index 1cbc11fddc..3ecbc023ef 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java @@ -15,6 +15,9 @@ import javax.transaction.Transactional; import gov.gtas.model.*; +import gov.gtas.parsers.tamr.TamrAdapter; +import gov.gtas.parsers.tamr.TamrAdapterImpl; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; import gov.gtas.parsers.vo.*; import gov.gtas.repository.*; import org.apache.commons.collections4.CollectionUtils; @@ -22,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import gov.gtas.error.ErrorUtils; @@ -47,6 +51,9 @@ public class PnrMessageService extends MessageLoaderService { private final BookingBagRepository bookingBagRepository; + @Value("${tamr.enabled}") + private Boolean tamrEnabled; + @Autowired public PnrMessageService(PnrRepository msgDao, LoaderUtils utils, LookUpRepository lookupRepo, FlightPaxRepository flightPaxRepository, BagRepository bagRepository, @@ -108,8 +115,9 @@ public MessageDto parse(MessageDto msgDto) { } @Override - public MessageStatus load(MessageDto msgDto) { + public MessageInformation load(MessageDto msgDto) { msgDto.getMessageStatus().setSuccess(true); + MessageInformation messageInformation = new MessageInformation(); Pnr pnr = msgDto.getPnr(); try { PnrVo vo = (PnrVo) msgDto.getMsgVo(); @@ -143,18 +151,26 @@ public MessageStatus load(MessageDto msgDto) { TripTypeEnum tripType = calculateTripType(pnr.getFlightLegs(), pnr.getDwellTimes()); pnr.setTripType(tripType.toString()); + if (tamrEnabled) { + TamrAdapter tamrAdapter = new TamrAdapterImpl(); + List tamrPassengerSendObjectList = tamrAdapter + .convert(pnr.getFlights().iterator().next(), pnr.getPassengers()); + messageInformation.setTamrPassengerSendObjects(tamrPassengerSendObjectList); + } } catch (Exception e) { msgDto.getMessageStatus().setMessageStatusEnum(MessageStatusEnum.FAILED_LOADING); msgDto.getMessageStatus().setSuccess(false); pnr.setError(e.toString()); logger.error("ERROR", e); } finally { - if (!createMessage(pnr)) { + boolean success = createMessage(pnr); + if (success) { msgDto.getMessageStatus().setSuccess(false); msgDto.getMessageStatus().setMessageStatusEnum(MessageStatusEnum.FAILED_LOADING); } } - return msgDto.getMessageStatus(); + messageInformation.setMessageStatus(msgDto.getMessageStatus()); + return messageInformation; } @Transactional diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java index 2327a14246..d265106028 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java @@ -1,13 +1,14 @@ package gov.gtas.services; import gov.gtas.model.MessageStatus; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; import java.util.List; public class ProcessedMessages { private int[] processed; private List messageStatusList; - + private List tamrPassengerSendObjectList; public int[] getProcessed() { return processed; } @@ -23,4 +24,12 @@ public List getMessageStatusList() { public void setMessageStatusList(List messageStatusList) { this.messageStatusList = messageStatusList; } + + public List getTamrPassengerSendObjectList() { + return tamrPassengerSendObjectList; + } + + public void setTamrPassengerSendObjectList(List tamrPassengerSendObjectList) { + this.tamrPassengerSendObjectList = tamrPassengerSendObjectList; + } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java new file mode 100644 index 0000000000..0febcdb787 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java @@ -0,0 +1,20 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +package gov.gtas.parsers.tamr; + +import gov.gtas.model.Flight; +import gov.gtas.model.Passenger; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; + +import java.util.List; +import java.util.Set; + +public interface TamrAdapter { + List convert(Flight flight, Set passengers); +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java new file mode 100644 index 0000000000..e02b76c008 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java @@ -0,0 +1,78 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +package gov.gtas.parsers.tamr; + +import gov.gtas.model.Document; +import gov.gtas.model.Flight; +import gov.gtas.model.Passenger; +import gov.gtas.parsers.tamr.model.TamrDocumentSendObject; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class TamrAdapterImpl implements TamrAdapter { + + @Override + public List convert(Flight flight, Set passengers) { + List tamrPassengers = new ArrayList(); + for (Passenger passenger : passengers) { + // per passenger convert to tamrPax + TamrPassengerSendObject tamrPax = convertPassengerToTamrPassenger(flight, passenger); + // get docs from passengers + for (Document doc : passenger.getDocuments()) { + // add tamrDoc to tamrPax doc list + tamrPax.getDocuments().add(convertDocumentToTamrDocument(doc)); + } + tamrPassengers.add(tamrPax); + } + return tamrPassengers; + } + + private TamrPassengerSendObject convertPassengerToTamrPassenger(Flight flight, Passenger passenger) { + TamrPassengerSendObject tamrPax = new TamrPassengerSendObject(); + // initializing doc list + List docs = new ArrayList<>(); + tamrPax.setDocuments(docs); + + // flight related + tamrPax.setAPIS_ARVL_APRT_CD(flight.getDestination()); + tamrPax.setAPIS_DPRTR_APRT_CD(flight.getOrigin()); + tamrPax.setETA_DT(flight.getMutableFlightDetails().getEta()); + tamrPax.setIATA_CARR_CD(flight.getCarrier()); + tamrPax.setFLIT_NBR(flight.getFullFlightNumber()); + + // pax related + List nationalities = new ArrayList<>(); + nationalities.add(passenger.getPassengerDetails().getNationality()); + tamrPax.setNATIONALITY_CD(nationalities); + tamrPax.setDOB_Date(passenger.getPassengerDetails().getDob()); + tamrPax.setFirst_name(passenger.getPassengerDetails().getFirstName()); + tamrPax.setGNDR_CD(passenger.getPassengerDetails().getGender()); + tamrPax.setGtasId(passenger.getId().toString()); + tamrPax.setLast_name(passenger.getPassengerDetails().getLastName()); + + // temp values + tamrPax.setUid(""); + tamrPax.setFlt("test"); + + return tamrPax; + } + + private TamrDocumentSendObject convertDocumentToTamrDocument(Document doc) { + TamrDocumentSendObject tamrDoc = new TamrDocumentSendObject(); + + tamrDoc.setDOC_CTRY_CD(doc.getIssuanceCountry()); + tamrDoc.setDOC_ID(doc.getDocumentNumber()); + tamrDoc.setDOC_TYP_NM(doc.getDocumentType()); + + return tamrDoc; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java index 2f6012c7d8..6fc9506dfb 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java @@ -44,4 +44,10 @@ public String getDOC_ID() { public void setDOC_ID(String dOC_ID) { DOC_ID = dOC_ID; } + + @Override + public String toString() { + return "TamrDocumentSendObject{" + "DOC_CTRY_CD='" + DOC_CTRY_CD + '\'' + ", DOC_TYP_NM='" + DOC_TYP_NM + '\'' + + ", DOC_ID='" + DOC_ID + '\'' + '}'; + } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java index 99cedd33af..b212a55c7a 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java @@ -180,4 +180,13 @@ public void setDocuments(List documents) { this.documents = documents; } + @Override + public String toString() { + return "TamrPassengerSendObject{" + "gtasId='" + gtasId + '\'' + ", first_name='" + first_name + '\'' + + ", last_name='" + last_name + '\'' + ", Uid='" + Uid + '\'' + ", ETA_DT=" + ETA_DT + + ", IATA_CARR_CD='" + IATA_CARR_CD + '\'' + ", FLIT_NBR='" + FLIT_NBR + '\'' + ", flt='" + flt + '\'' + + ", APIS_DPRTR_APRT_CD='" + APIS_DPRTR_APRT_CD + '\'' + ", APIS_ARVL_APRT_CD='" + APIS_ARVL_APRT_CD + + '\'' + ", NATIONALITY_CD=" + NATIONALITY_CD + ", DOB_Date=" + DOB_Date + ", GNDR_CD='" + GNDR_CD + + '\'' + ", documents=" + documents + '}'; + } } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java new file mode 100644 index 0000000000..02c5be5ea3 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java @@ -0,0 +1,86 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +package gov.gtas.parsers.tamr; + +import gov.gtas.model.*; +import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.time.LocalDate; +import java.util.*; + +import static java.time.ZoneOffset.UTC; + +public class TamrAdapterImplTest { + + Flight testFlight; + Passenger testPassenger; + LocalDate eta; + Date etaFlightDate; + Date etaTestDate; + LocalDate localBirthDate; + Date birthDate; + Date birthDateTest; + + @Before + public void setUp() { + eta = LocalDate.of(2020, 1, 24); + etaFlightDate = Date.from(eta.atStartOfDay(UTC).toInstant()); + etaTestDate = Date.from(eta.atStartOfDay(UTC).toInstant()); + localBirthDate = LocalDate.of(1988, 4, 24); + birthDate = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); + birthDateTest = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); + + Flight flight = new Flight(); + MutableFlightDetails mfd = new MutableFlightDetails(); + mfd.setEta(etaFlightDate); + flight.setDestination("IAD"); + flight.setOrigin("ABC"); + flight.setCarrier("WAL"); + flight.setFlightNumber("ABC123"); + flight.setMutableFlightDetails(mfd); + Passenger p = new Passenger(); + p.setId(5L); + PassengerDetails passengerDetails = new PassengerDetails(p); + p.setPassengerDetails(passengerDetails); + passengerDetails.setDob(birthDate); + passengerDetails.setNationality("USA"); + passengerDetails.setFirstName("WALLY"); + passengerDetails.setLastName("HUND"); + passengerDetails.setGender("M"); + Set documentSet = new HashSet<>(); + Document d = new Document(); + d.setId(1L); + d.setDocumentNumber("123123123"); + d.setDocumentType("P"); + d.setIssuanceCountry("USA"); + p.setDocuments(documentSet); + + testFlight = flight; + testPassenger = p; + } + + @Test + public void tamrConversionTest() { + TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); + List tamrPassengerSendObjectList = tamrAdapter.convert(testFlight, + Collections.singleton(testPassenger)); + TamrPassengerSendObject tpso = tamrPassengerSendObjectList.get(0); + Assert.assertEquals(birthDateTest, tpso.getDOB_Date()); + Assert.assertEquals("WALLY", tpso.getFirst_name()); + Assert.assertEquals(etaTestDate, tpso.getETA_DT()); + Assert.assertEquals("IAD", tpso.getAPIS_ARVL_APRT_CD()); + Assert.assertEquals("ABC", tpso.getAPIS_DPRTR_APRT_CD()); + Assert.assertEquals("M", tpso.getGNDR_CD()); + Assert.assertEquals("5", tpso.getGtasId()); + Assert.assertEquals("HUND", tpso.getLast_name()); + } +} From 554421ee2f00f7d2fc2b0a4a4e3934fe258e92cf Mon Sep 17 00:00:00 2001 From: Robert Stine Date: Fri, 24 Jan 2020 23:24:50 -0500 Subject: [PATCH 09/83] Bug fix, !success instead of success. --- .../src/main/java/gov/gtas/services/PnrMessageService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java index 3ecbc023ef..1784002a5b 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java @@ -164,7 +164,7 @@ public MessageInformation load(MessageDto msgDto) { logger.error("ERROR", e); } finally { boolean success = createMessage(pnr); - if (success) { + if (!success) { msgDto.getMessageStatus().setSuccess(false); msgDto.getMessageStatus().setMessageStatusEnum(MessageStatusEnum.FAILED_LOADING); } From 16a5d2b4cc3215d2194a596c90046293e7f4d985 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sat, 25 Jan 2020 19:21:44 -0500 Subject: [PATCH 10/83] Log error messages and acknowledgements from Tamr --- .../tamr/TamrMessageHandlerServiceImpl.java | 56 ++++++- .../tamr/TamrStatusErrorMessagesTest.java | 139 ++++++++++++++++++ 2 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index a43e7fe182..78d9c0ced4 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -5,6 +5,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.repository.PassengerIDTagRepository; @@ -22,6 +25,8 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService */ @Override public void handleQueryResponse(TamrMessage response) { + if (this.checkRecordErrors(response)) return; + logger.info("TODO: handle QUERY response"); } @@ -31,7 +36,16 @@ public void handleQueryResponse(TamrMessage response) { */ @Override public void handleAcknowledgeResponse(TamrMessage response) { - logger.info("TODO: handle acknowledgement"); + if (response.getAcknowledgment() == true) { + logger.info("{} request to Tamr acknowledged", + response.getMessageType()); + } else if (response.getAcknowledgment() == false) { + logger.error("Error with {} request to Tamr: {}", + response.getMessageType(), response.getError()); + } else { + logger.warn("{} message received from Tamr with no " + + "\"acknowledgment\" key. Ignoring..."); + } } /** @@ -39,8 +53,16 @@ public void handleAcknowledgeResponse(TamrMessage response) { * similar functionality: updating the Tamr cluster IDs. */ @Override - public void handleTamrIdUpdate(TamrMessage response) { - logger.info("TODO: handle Tamr ID updates"); + public void handleTamrIdUpdate(TamrMessage message) { + // The "error" field can be set on these. + if (message.getError() != null) { + logger.error("Tamr error during {} request: {}", + message.getMessageType(), message.getError()); + } else if (this.checkRecordErrors(message)) { + return; + } else { + logger.info("TODO: handle Tamr ID updates"); + } } /** @@ -49,6 +71,32 @@ public void handleTamrIdUpdate(TamrMessage response) { */ @Override public void handleErrorResponse(TamrMessage response) { - logger.info("TODO: handle Tamr error"); + logger.error("{} message received from Tamr: {}", + response.getMessageType(), response.getError()); + } + + /** + * Checks to see if recordErrors are present on the given response. If so, + * returns true and logs a warning message. + */ + private boolean checkRecordErrors(TamrMessage response) { + boolean hasRecordErrors = response.getRecordErrors() != null && + response.getRecordErrors().size() > 0; + if (hasRecordErrors) { + ObjectMapper mapper = new ObjectMapper(); + try { + String recordErrorsJson = mapper + .writerWithDefaultPrettyPrinter() + .writeValueAsString(response.getRecordErrors()); + logger.warn("Received recordErrors from Tamr for {} " + + "request. recordErrors = {}", + response.getMessageType(), recordErrorsJson); + } catch (JsonProcessingException e) { + logger.warn("Received recordErrors from Tamr for {} " + + "request. Unable to display errors.", + response.getMessageType()); + } + } + return hasRecordErrors; } } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java new file mode 100644 index 0000000000..9e61bfc217 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java @@ -0,0 +1,139 @@ +package gov.gtas.parsers.tamr; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.Invocation; +import org.slf4j.Logger; +import org.springframework.test.util.ReflectionTestUtils; + +import gov.gtas.parsers.ParserTestHelper; +import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrRecordError; + +/** + * Test that various JMS status and error messages returned from the Tamr API + * are properly logged. + */ +public class TamrStatusErrorMessagesTest implements ParserTestHelper { + private TamrMessageHandlerService handler; + private Logger logger; + + @Before + public void setUp() { + this.handler = new TamrMessageHandlerServiceImpl(); + this.logger = mock(Logger.class); + ReflectionTestUtils.setField(handler, "logger", logger); + } + + @Test + public void testAcknowledgmentSuccess() { + String[] messageTypes = {"TH.UPDATE", "DC.REPLACE"}; + for (String messageType: messageTypes) { + this.handler.handleAcknowledgeResponse( + this.buildAcknowledgmentResponse(messageType)); + + this.assertTextLogged("INFO", "acknowledg"); + this.assertTextLogged("INFO", messageType); + } + } + + @Test + public void testAcknowledgmentError() { + TamrMessage acknowledgmentMessage = new TamrMessage(); + acknowledgmentMessage.setMessageType("TH.UPDATE"); + acknowledgmentMessage.setAcknowledgment(false); + acknowledgmentMessage.setError("Here is an error."); + this.handler.handleAcknowledgeResponse(acknowledgmentMessage); + + // Make sure message type and error is logged as ERROR. + this.assertTextLogged("ERROR", + acknowledgmentMessage.getMessageType()); + this.assertTextLogged("ERROR", + acknowledgmentMessage.getError()); + } + + @Test + public void testRecordErrors() { + String[] messageTypes = {"QUERY", "TH.DELTAS", "TH.CLUSTERS"}; + for (String messageType: messageTypes) { + TamrMessage errorMessage = new TamrMessage(); + errorMessage.setMessageType(messageType); + List recordErrors = new ArrayList(); + TamrRecordError recordError = new TamrRecordError(); + recordError.setErrors(Arrays.asList( + new String [] {"Error A", "Error B"})); + recordErrors.add(recordError); + errorMessage.setRecordErrors(recordErrors); + + if (messageType.equals("QUERY")) { + handler.handleQueryResponse(errorMessage); + } else { + handler.handleTamrIdUpdate(errorMessage); + } + + // Make sure message type and all errors are logged as WARN. + this.assertTextLogged("WARN", messageType); + for (String error: recordError.getErrors()) { + this.assertTextLogged("WARN", error); + } + } + } + + /** + * Test messages of type ERROR. + */ + @Test + public void testErrorMessages() { + TamrMessage errorMessage = new TamrMessage(); + errorMessage.setMessageType("ERROR"); + errorMessage.setAcknowledgment(false); + errorMessage.setError("Error error"); + + handler.handleErrorResponse(errorMessage); + + // Make sure error message is logged. + this.assertTextLogged("ERROR", errorMessage.getError()); + } + + private TamrMessage buildAcknowledgmentResponse(String messageType) { + TamrMessage message = new TamrMessage(); + message.setAcknowledgment(true); + message.setMessageType(messageType); + return message; + } + + /** + * Asserts the given message part was logged as part of a message with the + * given log level. For instance, + * assertTextLogged("WARN", "problem") + * will ensure that a warning was logged with the word "problem" included. + */ + private void assertTextLogged(String logLevel, String messagePart) { + Collection invocations = + mockingDetails(logger).getInvocations(); + boolean messagePartPresent = false; + for (Invocation invocation: invocations) { + if (logLevel.toLowerCase().equals( + invocation.getMethod().getName())) { + for (Object argument: invocation.getArguments()) { + if (argument instanceof String) { + if (((String) argument).contains(messagePart)) { + messagePartPresent = true; + } + } + } + } + } + assertTrue(String.format("%s present in %s message", messagePart, + logLevel), messagePartPresent); + } +} From 60d9685ad7db48951c004737830914a69f07139b Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sat, 25 Jan 2020 19:32:11 -0500 Subject: [PATCH 11/83] Check for recordErrors on DC.REPLACE and TH.UPDATE messages from Tamr --- .../gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java | 6 +++--- .../gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 78d9c0ced4..4882e82572 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -36,7 +36,9 @@ public void handleQueryResponse(TamrMessage response) { */ @Override public void handleAcknowledgeResponse(TamrMessage response) { - if (response.getAcknowledgment() == true) { + if (this.checkRecordErrors(response)) { + // Record errors are already logged. + } else if (response.getAcknowledgment() == true) { logger.info("{} request to Tamr acknowledged", response.getMessageType()); } else if (response.getAcknowledgment() == false) { @@ -58,8 +60,6 @@ public void handleTamrIdUpdate(TamrMessage message) { if (message.getError() != null) { logger.error("Tamr error during {} request: {}", message.getMessageType(), message.getError()); - } else if (this.checkRecordErrors(message)) { - return; } else { logger.info("TODO: handle Tamr ID updates"); } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java index 9e61bfc217..16c0f26fe9 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java @@ -63,7 +63,7 @@ public void testAcknowledgmentError() { @Test public void testRecordErrors() { - String[] messageTypes = {"QUERY", "TH.DELTAS", "TH.CLUSTERS"}; + String[] messageTypes = {"QUERY", "DC.REPLACE", "TH.UPDATE"}; for (String messageType: messageTypes) { TamrMessage errorMessage = new TamrMessage(); errorMessage.setMessageType(messageType); @@ -77,7 +77,7 @@ public void testRecordErrors() { if (messageType.equals("QUERY")) { handler.handleQueryResponse(errorMessage); } else { - handler.handleTamrIdUpdate(errorMessage); + handler.handleAcknowledgeResponse(errorMessage); } // Make sure message type and all errors are logged as WARN. From dde7972a21f650e01c2075984bacd713fad87207 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sat, 25 Jan 2020 19:37:53 -0500 Subject: [PATCH 12/83] Add Tamr recordErrors test (not yet implemented because we don't have example data) --- .../java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index a0550a21cb..36f92da3e3 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -118,6 +118,12 @@ public void testErrorMessage() throws JMSException, IOException, URISyntaxExcept verify(handler, never()).handleTamrIdUpdate(any()); } + @Test + @Ignore("Waiting on test data") + public void testRecordErrors() { + fail("Not implemented"); + } + @Test public void testUnknownMessageType() throws JMSException { TextMessage message = mock(TextMessage.class); From 0292bcbddc88e0f4bb2bb7b4b5140c87ab53889e Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sat, 25 Jan 2020 19:42:16 -0500 Subject: [PATCH 13/83] Add TH.DELTAS and TH.CLUSTERS messages to ReceiveTamrMessagesTest --- .../parsers/tamr/ReceiveTamrMessagesTest.java | 32 +++++++++++++++---- .../tamr-messages/clusters_message.json | 1 + .../tamr-messages/deltas_message.json | 1 + 3 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/clusters_message.json create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/deltas_message.json diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index 36f92da3e3..8bc7021909 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -23,7 +23,9 @@ public class ReceiveTamrMessagesTest implements ParserTestHelper { private static final String HISTORY_QUERY_RESPONSE = "/tamr-messages/history_query_response.json"; private static final String DEROG_QUERY_RESPONSE = "/tamr-messages/derog_query_response.json"; private static final String HISTORY_UPDATE_RESPONSE = "/tamr-messages/history_update_response.json"; - private static final String DEROG_REPLACE_RESPONSE = "/tamr-messages/derog_replace_response.json"; + private static final String DEROG_REPLACE_RESPONSE = "/tamr-messages/derog_replace_response.json"; + private static final String CLUSTERS_MESSAGE = "/tamr-messages/clusters_message.json"; + private static final String DELTAS_MESSAGE = "/tamr-messages/deltas_message.json"; private static final String ERROR_MESSAGE = "/tamr-messages/error_message.json"; private TamrMessageReceiver receiver; @@ -93,15 +95,31 @@ public void testDerogReplaceResponse() throws JMSException, IOException, URISynt } @Test - @Ignore("Waiting on test data") - public void testClustersMessage() { - fail("not implemented"); + public void testClustersMessage() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("TH.CLUSTERS"); + given(message.getText()).willReturn(getMessageText(CLUSTERS_MESSAGE)); + + receiver.receive(message); + + verify(handler).handleTamrIdUpdate(any(TamrMessage.class)); + verify(handler, never()).handleQueryResponse(any()); + verify(handler, never()).handleAcknowledgeResponse(any()); + verify(handler, never()).handleErrorResponse(any()); } @Test - @Ignore("Waiting on test data") - public void testDeltasMessage() { - fail("not implemented"); + public void testDeltasMessage() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("TH.DELTAS"); + given(message.getText()).willReturn(getMessageText(DELTAS_MESSAGE)); + + receiver.receive(message); + + verify(handler).handleTamrIdUpdate(any(TamrMessage.class)); + verify(handler, never()).handleQueryResponse(any()); + verify(handler, never()).handleAcknowledgeResponse(any()); + verify(handler, never()).handleErrorResponse(any()); } @Test diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/clusters_message.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/clusters_message.json new file mode 100644 index 0000000000..4fff910f3a --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/clusters_message.json @@ -0,0 +1 @@ +{"historyClusters":[{"gtasId":"12549298","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"18660127","tamrId":"7a02fa2b-230a-3b5c-af32-69304d7b64b4","version":313,"action":"UPDATE"},{"gtasId":"15224405","tamrId":"794e3aab-3f78-35bf-879b-bfcd694e669b","version":313,"action":"UPDATE"},{"gtasId":"7213981","tamrId":"c71094ca-b222-336c-80c4-f3b36580ff74","version":313,"action":"UPDATE"},{"gtasId":"3174921","tamrId":"0e0bd458-939e-3e34-baf6-cda7c595fc7e","version":313,"action":"UPDATE"},{"gtasId":"12886537","tamrId":"05827c4b-f14d-35db-892d-af1ecb2eafb7","version":313,"action":"UPDATE"},{"gtasId":"12289452","tamrId":"0488df36-9a1d-3d82-8598-60d1e9497df3","version":313,"action":"UPDATE"},{"gtasId":"9344150","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"25062507","tamrId":"2df9de19-96a2-3f68-8e84-9164395b28a9","version":313,"action":"UPDATE"},{"gtasId":"19071797","tamrId":"c1b85be2-297c-38cd-866e-90f00de2dafa","version":313,"action":"UPDATE"},{"gtasId":"14986444","tamrId":"be12cba3-390d-32b7-ae5a-321a2312fc87","version":313,"action":"UPDATE"},{"gtasId":"20356589","tamrId":"e59088de-fec9-3703-8965-ead8ea30e4e8","version":313,"action":"UPDATE"},{"gtasId":"20333468","tamrId":"55f97f90-7ef7-3c06-9a06-def5fe844d76","version":313,"action":"UPDATE"},{"gtasId":"7829219","tamrId":"c11dc27e-0137-3a21-a026-1ddee44171df","version":313,"action":"UPDATE"},{"gtasId":"3976922","tamrId":"80b79c1e-188f-33a7-9890-d031b3644e80","version":313,"action":"UPDATE"},{"gtasId":"1606206","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"6538458","tamrId":"a104c089-d217-34ea-afda-06ca1dca0c12","version":313,"action":"UPDATE"},{"gtasId":"56417","tamrId":"cf079c4d-52de-36d8-aada-0d0c610b5915","version":313,"action":"UPDATE"},{"gtasId":"16469657","tamrId":"3c5807aa-d389-3c93-a137-1bd95244fea0","version":313,"action":"UPDATE"},{"gtasId":"15726578","tamrId":"93c308f8-1db4-331a-80c1-02e65146b02a","version":313,"action":"UPDATE"},{"gtasId":"23532539","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"2314673","tamrId":"8666d74c-a319-30c6-ab27-6a0be5d5b154","version":313,"action":"UPDATE"},{"gtasId":"8992195","tamrId":"6bfc963e-1061-37b5-9ac9-ff13edcf9e44","version":313,"action":"UPDATE"},{"gtasId":"18945260","tamrId":"e06abc77-d006-3d72-8d7e-a5c2433d3803","version":313,"action":"UPDATE"},{"gtasId":"8089348","tamrId":"cd8800d9-4b47-366f-a995-c03cedbbb8ee","version":313,"action":"UPDATE"},{"gtasId":"721873","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"11569005","tamrId":"7a7ab21f-a313-37b7-8b47-0f5d787e6fba","version":313,"action":"UPDATE"},{"gtasId":"11525899","tamrId":"8bc83c96-8d09-3fb9-82c1-100fd7a5352a","version":313,"action":"UPDATE"},{"gtasId":"9070163","tamrId":"acc258e8-c2dd-37dd-9017-31e8c9250281","version":313,"action":"UPDATE"},{"gtasId":"7200206","tamrId":"ee4701ac-195d-3cf8-a135-c01668fb1948","version":313,"action":"UPDATE"},{"gtasId":"10026134","tamrId":"77518720-0cdb-3ddb-add7-e586c0c3cd38","version":313,"action":"UPDATE"},{"gtasId":"24193696","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"8968064","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"733846","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"10071147","tamrId":"f78d2585-c4d0-3532-9ef1-7d9fd3b35d9c","version":313,"action":"UPDATE"},{"gtasId":"10841549","tamrId":"d9f19a42-3bd1-3bfb-b365-480ba09ba723","version":313,"action":"UPDATE"},{"gtasId":"6839621","tamrId":"d56edf87-bc4c-38e2-9a3e-e19312031e2b","version":313,"action":"UPDATE"},{"gtasId":"11562879","tamrId":"29327399-422e-3676-8aee-abddef8ad4ec","version":313,"action":"UPDATE"},{"gtasId":"9407831","tamrId":"63d6c9f0-98e8-3030-806f-696ba8cfbefe","version":313,"action":"UPDATE"},{"gtasId":"6003855","tamrId":"b7df8009-2392-34d1-9cf6-15b988d4d021","version":313,"action":"UPDATE"},{"gtasId":"12050741","tamrId":"d310a85c-c7ff-389f-9489-e00dd5261970","version":313,"action":"UPDATE"},{"gtasId":"18628841","tamrId":"ffd607ff-2f58-369b-9d0f-a36bc86cf87f","version":313,"action":"UPDATE"},{"gtasId":"23811929","tamrId":"8d1aebf5-c78c-3167-a155-7e79ce9059c1","version":313,"action":"UPDATE"},{"gtasId":"13560715","tamrId":"c4e86097-e47e-3bf6-b8db-ba1de118b572","version":313,"action":"UPDATE"},{"gtasId":"8355862","tamrId":"a0c04fd2-055c-30bf-b25f-93ab6b8d32c0","version":313,"action":"UPDATE"},{"gtasId":"21233020","tamrId":"3aec5c80-44c4-3379-a207-15cd7482ad14","version":313,"action":"UPDATE"},{"gtasId":"24992181","tamrId":"929a0203-9684-3e4b-9eac-f39cf5f207d8","version":313,"action":"UPDATE"},{"gtasId":"2196057","tamrId":"136fb2a4-19c7-3564-98ce-3635e2c3c3bc","version":313,"action":"UPDATE"},{"gtasId":"9140575","tamrId":"b0f0f8ba-1f76-3021-815b-9d05b6b4b11a","version":313,"action":"UPDATE"},{"gtasId":"1151757","tamrId":"04c8c1be-7288-3cf5-bc9b-46e61d54aa5d","version":313,"action":"UPDATE"},{"gtasId":"16994152","tamrId":"503896a8-3e38-3793-893b-e6c325b03aca","version":313,"action":"UPDATE"},{"gtasId":"17189600","tamrId":"7ddb1eb7-2530-3d79-acb8-cc41aa554285","version":313,"action":"UPDATE"},{"gtasId":"458860","tamrId":"1d3a7681-732e-314d-bcb2-7017067da09a","version":313,"action":"UPDATE"},{"gtasId":"4326728","tamrId":"3bb64d0d-0352-300e-aaa4-dfe107de8764","version":313,"action":"UPDATE"},{"gtasId":"22764388","tamrId":"15b0ef91-a072-304d-8233-5ec3e4d66fd3","version":313,"action":"UPDATE"},{"gtasId":"15992100","tamrId":"4e176714-4478-3c57-9ba2-ceffa57cb92d","version":313,"action":"UPDATE"},{"gtasId":"18442285","tamrId":"34698452-9ff1-3bee-8b6a-95c96ddc4b3c","version":313,"action":"UPDATE"},{"gtasId":"18299964","tamrId":"b28d28ac-958a-3c1f-80af-96c24fe904e7","version":313,"action":"UPDATE"},{"gtasId":"729327","tamrId":"5ef86244-7e2c-374f-8ffd-81c3b0cc18c8","version":313,"action":"UPDATE"},{"gtasId":"12761825","tamrId":"2e5ecfc6-c3f4-336d-9cca-0695f66d05b9","version":313,"action":"UPDATE"},{"gtasId":"21049378","tamrId":"2d12daa5-b336-37b0-b4da-d7245cdb677d","version":313,"action":"UPDATE"},{"gtasId":"10931179","tamrId":"da8a1273-36d6-33b2-b6d1-c2d24e703c00","version":313,"action":"UPDATE"},{"gtasId":"2085124","tamrId":"edac58e6-8d50-3d12-b5be-5c57408d7136","version":313,"action":"UPDATE"},{"gtasId":"8947575","tamrId":"9c396183-b22d-30f9-b404-28ab8cdefdee","version":313,"action":"UPDATE"},{"gtasId":"14931784","tamrId":"5178be24-4f4f-344b-a93a-b90b6d7b9f1e","version":313,"action":"UPDATE"},{"gtasId":"19688787","tamrId":"eea1da62-933f-38f7-9593-05aea5ae1144","version":313,"action":"UPDATE"},{"gtasId":"10534920","tamrId":"c2fb36e7-3698-3436-be85-278ab3de8c2f","version":313,"action":"UPDATE"},{"gtasId":"15351837","tamrId":"f33f4960-83ba-3a6a-93a3-4945b0e73c7f","version":313,"action":"UPDATE"},{"gtasId":"19526205","tamrId":"e3a643f5-662b-371b-83f9-d08590268cd7","version":313,"action":"UPDATE"},{"gtasId":"7622158","tamrId":"87457191-e46f-3743-b8b8-32ed7509a2d7","version":313,"action":"UPDATE"},{"gtasId":"25288389","tamrId":"dd6b5745-3373-3199-8a04-dfe0c5e26ee5","version":313,"action":"UPDATE"},{"gtasId":"5519477","tamrId":"cd3bfd06-3794-3803-8180-23f7686a5669","version":313,"action":"UPDATE"},{"gtasId":"11789589","tamrId":"93992c04-84ac-3636-a945-b74d98903324","version":313,"action":"UPDATE"},{"gtasId":"17406307","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"13926543","tamrId":"7e8bfa24-388c-33c8-aaf8-da119d806f07","version":313,"action":"UPDATE"},{"gtasId":"15839293","tamrId":"b2ecd403-c14f-3867-913c-cb1534edb081","version":313,"action":"UPDATE"},{"gtasId":"4863683","tamrId":"779ba76f-bc22-341c-8a04-1c8c8834f848","version":313,"action":"UPDATE"},{"gtasId":"7222891","tamrId":"fb81effe-261f-3a94-b9dc-ae74193933df","version":313,"action":"UPDATE"},{"gtasId":"7614533","tamrId":"90fae2ad-e0a1-3cc0-90ac-b15a0cb6fc28","version":313,"action":"UPDATE"},{"gtasId":"6091558","tamrId":"1866d1ab-735a-376d-bd99-b50908b87e8a","version":313,"action":"UPDATE"},{"gtasId":"1874802","tamrId":"ff79af98-235f-333f-a62a-16d27e0d6c1b","version":313,"action":"UPDATE"},{"gtasId":"2833727","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"8980170","tamrId":"0be7f96f-c861-3d69-9c80-66d9e5570d4b","version":313,"action":"UPDATE"},{"gtasId":"20805771","tamrId":"08bc567c-74d2-3bdb-9770-cefbabe99f98","version":313,"action":"UPDATE"},{"gtasId":"13295520","tamrId":"62653411-fdbd-36f6-85e1-bba5495b5e52","version":313,"action":"UPDATE"},{"gtasId":"4872145","tamrId":"fc58d87e-2804-318b-ad7e-2e4b787fab03","version":313,"action":"UPDATE"},{"gtasId":"12199829","tamrId":"d6757c64-de4d-3517-b6ce-192e30635b38","version":313,"action":"UPDATE"},{"gtasId":"24458760","tamrId":"bc5f033c-17c3-3919-a31a-836789abd94d","version":313,"action":"UPDATE"},{"gtasId":"3669900","tamrId":"19f6978c-8e3f-36d2-9635-a38596a1bc94","version":313,"action":"UPDATE"},{"gtasId":"2498962","tamrId":"202086a4-b62d-3ef5-97db-517fc2b8e8e0","version":313,"action":"UPDATE"},{"gtasId":"21228984","tamrId":"c467635e-83a9-3a39-8b3c-2fa64104efee","version":313,"action":"UPDATE"},{"gtasId":"7244223","tamrId":"96a357fe-7ab6-36c5-9121-418428868a20","version":313,"action":"UPDATE"},{"gtasId":"14978848","tamrId":"24c35f31-d6c1-3727-a157-f9de42360c92","version":313,"action":"UPDATE"},{"gtasId":"7646559","tamrId":"314e720e-687c-3407-8ea6-0372ff76ddea","version":313,"action":"UPDATE"},{"gtasId":"12798735","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"4217573","tamrId":"2c414457-ecc0-3e54-8706-b0a6e72fa33d","version":313,"action":"UPDATE"},{"gtasId":"11323614","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"14255794","tamrId":"10e9547d-8616-397c-863d-eefae0c9d527","version":313,"action":"UPDATE"},{"gtasId":"15522592","tamrId":"5f03a14c-9bbc-3d34-b4db-3ff1b79d12cd","version":313,"action":"UPDATE"},{"gtasId":"10886063","tamrId":"1feee6a4-65c6-3bd8-a920-e048e7147b6f","version":313,"action":"UPDATE"},{"gtasId":"22477383","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"9358343","tamrId":"1e37d9dd-8d16-31a3-a970-31c6196d696a","version":313,"action":"UPDATE"},{"gtasId":"9950186","tamrId":"27bb67b8-80e6-3858-bef4-a0dd15c9d15b","version":313,"action":"UPDATE"},{"gtasId":"626419","tamrId":"be75cb2a-5976-378e-979f-617d290be9e9","version":313,"action":"UPDATE"},{"gtasId":"10700365","tamrId":"e97714ae-f253-3324-8ec3-dedc28cedf1d","version":313,"action":"UPDATE"},{"gtasId":"14138569","tamrId":"bbb93dbf-cf07-389e-a586-f11fd654f796","version":313,"action":"UPDATE"},{"gtasId":"19443812","tamrId":"b6dac838-ba33-31f1-b658-c6dea24c0f64","version":313,"action":"UPDATE"},{"gtasId":"16100079","tamrId":"35c3a94b-1cc7-379d-bd80-0e609ecbceac","version":313,"action":"UPDATE"},{"gtasId":"19336877","tamrId":"04c8c1be-7288-3cf5-bc9b-46e61d54aa5d","version":313,"action":"UPDATE"},{"gtasId":"10910222","tamrId":"a5c3366b-3595-30a6-ba93-23f50cc3cee3","version":313,"action":"UPDATE"},{"gtasId":"2217918","tamrId":"deb7388a-1f9b-3899-b695-9554483ab009","version":313,"action":"UPDATE"},{"gtasId":"19001039","tamrId":"6c597c96-a403-39e7-8fc8-c3907d70c921","version":313,"action":"UPDATE"},{"gtasId":"8250795","tamrId":"6d4f3573-ea37-324b-b5d3-26371ff73cb7","version":313,"action":"UPDATE"},{"gtasId":"13455985","tamrId":"e572531f-2852-3b5b-bddf-299382039037","version":313,"action":"UPDATE"},{"gtasId":"14277553","tamrId":"41cdb995-8f90-33c2-82f7-2fadd2497433","version":313,"action":"UPDATE"},{"gtasId":"4966111","tamrId":"50de1fcb-d4e5-3524-b7ec-3ebff691ec08","version":313,"action":"UPDATE"},{"gtasId":"24802445","tamrId":"d6a38f1e-8909-3feb-8ea2-fbb7479c684b","version":313,"action":"UPDATE"},{"gtasId":"2017844","tamrId":"892c0fbf-8277-3443-a937-83afa45b60b6","version":313,"action":"UPDATE"},{"gtasId":"21531175","tamrId":"8c381282-9fe5-3c3e-ab58-7d930c8d2f3d","version":313,"action":"UPDATE"},{"gtasId":"11072713","tamrId":"1c77a385-1de3-3c98-8bfe-07ff1d1dcf64","version":313,"action":"UPDATE"},{"gtasId":"18456457","tamrId":"9819342d-6712-3c0a-b75a-cece54d6b664","version":313,"action":"UPDATE"},{"gtasId":"11491173","tamrId":"a0c04fd2-055c-30bf-b25f-93ab6b8d32c0","version":313,"action":"UPDATE"},{"gtasId":"18801444","tamrId":"c34433fd-e91e-37d7-a64f-bebad15f2017","version":313,"action":"UPDATE"},{"gtasId":"21202378","tamrId":"0f60498e-a19c-362e-86ea-d584718e16fa","version":313,"action":"UPDATE"},{"gtasId":"12633151","tamrId":"17af9580-0a9b-35dd-ae6f-a2ec95616bbe","version":313,"action":"UPDATE"},{"gtasId":"18897026","tamrId":"ef454710-2234-35d9-8f66-65f360e98617","version":313,"action":"UPDATE"},{"gtasId":"25408296","tamrId":"4d27d01e-e9b4-3bb7-820e-ecc00ea75bd6","version":313,"action":"UPDATE"},{"gtasId":"10579005","tamrId":"447ef941-7273-315d-b85b-f55b4eec249a","version":313,"action":"UPDATE"},{"gtasId":"21973536","tamrId":"04c8c1be-7288-3cf5-bc9b-46e61d54aa5d","version":313,"action":"UPDATE"},{"gtasId":"22994693","tamrId":"cfc89075-6e29-3e01-a26b-8b125ff8c093","version":313,"action":"UPDATE"},{"gtasId":"639725","tamrId":"426e1ef0-9781-3304-b640-e93dd65fafce","version":313,"action":"UPDATE"},{"gtasId":"18775865","tamrId":"848ecc60-43b9-399a-aebe-63401e76ad84","version":313,"action":"UPDATE"},{"gtasId":"16676800","tamrId":"3b5d495e-46dd-3fd6-9df9-e7ee55a3b67d","version":313,"action":"UPDATE"},{"gtasId":"21871501","tamrId":"fb42774c-cd03-3724-9ac3-3833a2761f5e","version":313,"action":"UPDATE"},{"gtasId":"8943620","tamrId":"96e4fe0b-f0ae-3a8e-b4f3-eabef2155ae4","version":313,"action":"UPDATE"},{"gtasId":"20799811","tamrId":"228f2abb-f45e-36f2-915f-698569a5efd7","version":313,"action":"UPDATE"},{"gtasId":"1739826","tamrId":"c46b5983-39ed-30aa-84dc-76c14b162998","version":313,"action":"UPDATE"},{"gtasId":"217476","tamrId":"e97dc382-1388-3c2f-9cf2-02357fa99d50","version":313,"action":"UPDATE"},{"gtasId":"2886611","tamrId":"ee28b374-cc41-3f2a-a16e-bb6440be6377","version":313,"action":"UPDATE"},{"gtasId":"10221746","tamrId":"38108d3f-6190-3b3c-923d-32731a8f356c","version":313,"action":"UPDATE"},{"gtasId":"21691456","tamrId":"43bb19b5-8acd-34e4-8300-eddcbd4bfdf4","version":313,"action":"UPDATE"},{"gtasId":"23715250","tamrId":"d2e71e94-ccba-3e32-b7b3-5eba5649e6aa","version":313,"action":"UPDATE"},{"gtasId":"11860108","tamrId":"a0638854-c6fd-3383-bb0a-e0eec60c5a1e","version":313,"action":"UPDATE"},{"gtasId":"6197904","tamrId":"a68f6e6b-bab5-378b-a7db-2df8b5c9fe7c","version":313,"action":"UPDATE"},{"gtasId":"2850208","tamrId":"fa51816b-0fa7-3ff6-8f0f-ca3d2c9e7f45","version":313,"action":"UPDATE"},{"gtasId":"7787346","tamrId":"04c8c1be-7288-3cf5-bc9b-46e61d54aa5d","version":313,"action":"UPDATE"},{"gtasId":"9226038","tamrId":"0d50a6b3-12d0-31d5-b344-07b5316f3b34","version":313,"action":"UPDATE"},{"gtasId":"23541883","tamrId":"599e94f5-b090-3699-9967-01ee6909ab5b","version":313,"action":"UPDATE"},{"gtasId":"21575154","tamrId":"a1c9474a-a23a-3f16-80b8-5ced45f36de2","version":313,"action":"UPDATE"},{"gtasId":"4642637","tamrId":"52689bd0-efce-38ea-be62-5481a3d093c8","version":313,"action":"UPDATE"},{"gtasId":"7672008","tamrId":"1feee6a4-65c6-3bd8-a920-e048e7147b6f","version":313,"action":"UPDATE"},{"gtasId":"1410676","tamrId":"c2232cc2-1b61-3aa4-88d5-0abc6c270ce1","version":313,"action":"UPDATE"},{"gtasId":"2675977","tamrId":"f1431bd4-0c2f-3c81-ac30-7e34d80fa23e","version":313,"action":"UPDATE"},{"gtasId":"23859902","tamrId":"d8b26e1c-07d8-3a2f-8d3c-016190c20243","version":313,"action":"UPDATE"},{"gtasId":"1252025","tamrId":"bd999dff-fa0e-3d98-be2b-83e088033466","version":313,"action":"UPDATE"},{"gtasId":"9927324","tamrId":"f244280a-8e2e-31ce-b0e8-f0e8a4358cb1","version":313,"action":"UPDATE"},{"gtasId":"10159271","tamrId":"b460ccd8-09fb-398d-9b0d-a93062b2ac6d","version":313,"action":"UPDATE"},{"gtasId":"5391164","tamrId":"41749384-9e94-33fb-8be0-08ecc3106152","version":313,"action":"UPDATE"},{"gtasId":"6017149","tamrId":"335021ff-2642-3746-ac54-9aeba1c2f056","version":313,"action":"UPDATE"},{"gtasId":"9191306","tamrId":"45e623f7-adb3-3305-a6ef-10a60a4204ad","version":313,"action":"UPDATE"},{"gtasId":"12399477","tamrId":"29bc11b3-60af-3181-a43e-addcef2b1423","version":313,"action":"UPDATE"},{"gtasId":"22846738","tamrId":"aedee352-9060-34ec-99c0-3a1e75ab0e3e","version":313,"action":"UPDATE"},{"gtasId":"6751029","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"2162238","tamrId":"5cf99062-adfb-3550-bffd-6ed948da113a","version":313,"action":"UPDATE"},{"gtasId":"3351401","tamrId":"e3ff6c53-088e-3a97-b9b8-8eff24d2ed21","version":313,"action":"UPDATE"},{"gtasId":"18444035","tamrId":"d92bc869-63c8-3c63-8d47-302c8e16e0f2","version":313,"action":"UPDATE"},{"gtasId":"10023955","tamrId":"0bac62d5-1ffe-3e61-81dd-cf258e2c1f04","version":313,"action":"UPDATE"},{"gtasId":"6172609","tamrId":"f1eb0f03-4b18-37a9-91e5-796ca860c345","version":313,"action":"UPDATE"},{"gtasId":"1711017","tamrId":"3ef76fd9-b10c-3d38-9eab-edc76ba24992","version":313,"action":"UPDATE"},{"gtasId":"74269","tamrId":"8ace16a7-1b66-3eb0-9731-ec97242710c2","version":313,"action":"UPDATE"},{"gtasId":"8085363","tamrId":"c7548b60-405a-3b9c-b0f1-3cd601b97f12","version":313,"action":"UPDATE"},{"gtasId":"22062164","tamrId":"7c20abeb-2d7d-32a4-a813-4537be99d9b9","version":313,"action":"UPDATE"},{"gtasId":"1724793","tamrId":"28666a87-af3f-302b-98db-06c4230926fb","version":313,"action":"UPDATE"},{"gtasId":"16435476","tamrId":"f021a348-d47e-32d9-b646-1750294de4c9","version":313,"action":"UPDATE"},{"gtasId":"1503734","tamrId":"e1348c22-2efa-3bbc-80ca-3c66c56dfdb5","version":313,"action":"UPDATE"},{"gtasId":"20681414","tamrId":"a63565f0-5e7e-344f-821f-1dc1642a7377","version":313,"action":"UPDATE"},{"gtasId":"9137327","tamrId":"88f7d6d6-d339-385d-9bc9-c95fba250d3f","version":313,"action":"UPDATE"},{"gtasId":"12262338","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"12530250","tamrId":"2f685485-4e63-3b8d-9c0f-5c4a3fca15ff","version":313,"action":"UPDATE"},{"gtasId":"13416779","tamrId":"8a1ffedb-0320-3a8c-8df3-e7eae9c9f5f2","version":313,"action":"UPDATE"},{"gtasId":"3702637","tamrId":"f5f20726-3b22-36c3-aad7-cc46588695fc","version":313,"action":"UPDATE"},{"gtasId":"3830951","tamrId":"ebe0983e-17cb-39e4-96fb-f14d44bf9672","version":313,"action":"UPDATE"},{"gtasId":"10733738","tamrId":"473ce8f6-c1ae-3fff-b90e-336a196b2491","version":313,"action":"UPDATE"},{"gtasId":"15771194","tamrId":"5f09a824-5194-3315-80db-a275c10d9f0d","version":313,"action":"UPDATE"},{"gtasId":"863921","tamrId":"b6d1df09-73a5-3bdf-904a-684153f7b3bd","version":313,"action":"UPDATE"},{"gtasId":"3087195","tamrId":"389cb62d-166a-30fc-9a0a-803331229cf4","version":313,"action":"UPDATE"},{"gtasId":"11558719","tamrId":"6ca66b52-e124-3528-8fb6-b2a21c0179c9","version":313,"action":"UPDATE"},{"gtasId":"9265602","tamrId":"74ad342e-46b3-3bac-9c8f-41efbbfa9532","version":313,"action":"UPDATE"},{"gtasId":"5272293","tamrId":"183e6b12-5b16-3443-9e3c-572f14027ebc","version":313,"action":"UPDATE"},{"gtasId":"18544623","tamrId":"85c86dfe-8111-371f-8c8c-e992e1cc50ec","version":313,"action":"UPDATE"},{"gtasId":"21765414","tamrId":"7783e476-4247-32dc-82d0-be163456ccd4","version":313,"action":"UPDATE"},{"gtasId":"10659287","tamrId":"6fc6a7b0-1d9a-31b1-bd38-684cbafb08e4","version":313,"action":"UPDATE"},{"gtasId":"10566136","tamrId":"0fbda675-3b8b-3e6b-95db-8adb47bf5f97","version":313,"action":"UPDATE"},{"gtasId":"7407302","tamrId":"056eee6c-dbb0-3cf3-bf39-bb75ace4af47","version":313,"action":"UPDATE"},{"gtasId":"14597008","tamrId":"8a3ad67d-7c6e-376f-82df-f98d2cf6269f","version":313,"action":"UPDATE"},{"gtasId":"24053731","tamrId":"e201c8b7-d827-3d78-8d3f-f042f1dd40d0","version":313,"action":"UPDATE"},{"gtasId":"11194754","tamrId":"0338412c-d6a6-384b-bdf3-303979685485","version":313,"action":"UPDATE"},{"gtasId":"5464676","tamrId":"35b79449-6eac-36bb-bc0f-30b06dd7df93","version":313,"action":"UPDATE"},{"gtasId":"11786474","tamrId":"99b5bccc-0e35-3d56-a2e8-cdc1030b9ef8","version":313,"action":"UPDATE"},{"gtasId":"10462322","tamrId":"02a333b8-958c-3a5d-9fac-975cdb030570","version":313,"action":"UPDATE"},{"gtasId":"15911903","tamrId":"69e5da34-b42e-3540-9685-57aa4ec578e1","version":313,"action":"UPDATE"},{"gtasId":"8135375","tamrId":"4b73138a-d288-35f0-93d6-dadc3eae0b56","version":313,"action":"UPDATE"},{"gtasId":"18656460","tamrId":"9b9ff288-e0d8-3a13-b838-c1bd27869b78","version":313,"action":"UPDATE"},{"gtasId":"18010938","tamrId":"ea16f832-5ec6-352b-87b0-fdc2b3cb22d0","version":313,"action":"UPDATE"},{"gtasId":"9008597","tamrId":"381601ce-48de-365d-aab3-b7d6bbacb62e","version":313,"action":"UPDATE"},{"gtasId":"11273254","tamrId":"641f7d54-4842-324f-8508-63bdcbe1425b","version":313,"action":"UPDATE"},{"gtasId":"15110059","tamrId":"b510a825-a497-3c73-8f20-f4af28605082","version":313,"action":"UPDATE"},{"gtasId":"7649669","tamrId":"68ede613-6e0d-31fb-9817-51fcd687deee","version":313,"action":"UPDATE"},{"gtasId":"10535882","tamrId":"d5497cff-ce5f-3fd5-b6ea-4448fd2b7432","version":313,"action":"UPDATE"},{"gtasId":"15984580","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"6521113","tamrId":"a25d5fd9-61ab-376e-af8e-29515519dff6","version":313,"action":"UPDATE"},{"gtasId":"21330190","tamrId":"fd343321-a7c3-353b-89b6-e7c65e140289","version":313,"action":"UPDATE"},{"gtasId":"23369712","tamrId":"313f9d52-dcff-3de6-997e-f74f8f8c203f","version":313,"action":"UPDATE"},{"gtasId":"14475854","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"5614014","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"25269262","tamrId":"3872c1a1-53bf-3baf-8042-a728ca766312","version":313,"action":"UPDATE"},{"gtasId":"17135416","tamrId":"44107106-2ad1-3e8f-9810-1b1f889e58cf","version":313,"action":"UPDATE"},{"gtasId":"11997691","tamrId":"3a9e9e00-3db5-35b2-a1b3-62c66ae0131d","version":313,"action":"UPDATE"},{"gtasId":"19026395","tamrId":"bc321ef8-0192-3a21-89e4-be1be8df4602","version":313,"action":"UPDATE"},{"gtasId":"4392201","tamrId":"94115f24-a46e-30c6-9e1d-3d6a6b1abfb8","version":313,"action":"UPDATE"},{"gtasId":"2724981","tamrId":"b8b3b4fe-4d13-3ffb-983e-d04e010a7286","version":313,"action":"UPDATE"},{"gtasId":"5684319","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"18763894","tamrId":"8595ff01-b084-3928-9ede-ff86e6d71263","version":313,"action":"UPDATE"},{"gtasId":"6059801","tamrId":"5d3d0732-c1a8-3b3c-a47f-2d5fbd26cbb0","version":313,"action":"UPDATE"},{"gtasId":"19295783","tamrId":"20633ec6-c545-3577-97f5-1f4da4fe98cd","version":313,"action":"UPDATE"},{"gtasId":"1618660","tamrId":"180a054f-eacb-3388-8502-f7ab741b6864","version":313,"action":"UPDATE"},{"gtasId":"8232501","tamrId":"d9a1de7e-fd4e-3f52-9f9e-fd4ad2cac691","version":313,"action":"UPDATE"},{"gtasId":"10929220","tamrId":"9ed632be-8b86-3232-a8fe-b9f88e70e0ea","version":313,"action":"UPDATE"},{"gtasId":"16437217","tamrId":"a090f53b-c032-34f2-9209-f2d30ec5cda0","version":313,"action":"UPDATE"},{"gtasId":"250084","tamrId":"72c2bf7c-fe57-37ec-b273-82a97fa99ef9","version":313,"action":"UPDATE"},{"gtasId":"7376073","tamrId":"2897da0d-5c07-37f3-88a6-3bdd038359ce","version":313,"action":"UPDATE"},{"gtasId":"13880210","tamrId":"ef090ff3-bc28-3664-885f-d28531e74b95","version":313,"action":"UPDATE"},{"gtasId":"13497743","tamrId":"02941121-146d-37c5-851b-54dc1b068a69","version":313,"action":"UPDATE"},{"gtasId":"14678187","tamrId":"08d214a7-faf1-37a1-9aa5-31af26c12936","version":313,"action":"UPDATE"},{"gtasId":"5728075","tamrId":"80c49700-c3f3-35d0-bcb6-20de67b5e5b8","version":313,"action":"UPDATE"},{"gtasId":"9585178","tamrId":"7bbbc0d8-8ba9-3af7-8169-18ff75de3694","version":313,"action":"UPDATE"},{"gtasId":"20321482","tamrId":"838f8d03-bbb5-3a7a-9080-3993fe000fbe","version":313,"action":"UPDATE"},{"gtasId":"20381972","tamrId":"b0582983-f7b2-3ea4-8c6f-c93e56429737","version":313,"action":"UPDATE"},{"gtasId":"15842071","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"15618791","tamrId":"a3755200-2c85-3e98-b399-a4c5e3f3c2b9","version":313,"action":"UPDATE"},{"gtasId":"4092711","tamrId":"109db6ed-9823-3bfd-abbc-7165a52530c3","version":313,"action":"UPDATE"},{"gtasId":"14579571","tamrId":"ef4df511-60e9-3103-bb57-938de5a7a8b1","version":313,"action":"UPDATE"},{"gtasId":"5130969","tamrId":"fe23d46b-bb16-312d-b5b3-df34ccc53a1c","version":313,"action":"UPDATE"},{"gtasId":"23250593","tamrId":"050b8f8a-7786-3863-9dd2-44b0baad9e02","version":313,"action":"UPDATE"},{"gtasId":"4177052","tamrId":"139e5fc2-a38b-387a-b410-8e1a43ce5b72","version":313,"action":"UPDATE"},{"gtasId":"10161521","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"24175336","tamrId":"29d8f67a-d13b-3cbe-bdd2-84e548bc34e3","version":313,"action":"UPDATE"},{"gtasId":"17304389","tamrId":"e15b51f5-a9d8-3e07-8a8b-fcf7793add98","version":313,"action":"UPDATE"},{"gtasId":"9479433","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"1003011","tamrId":"95877398-ee0e-35bb-a431-9a64ff96ca84","version":313,"action":"UPDATE"},{"gtasId":"20859929","tamrId":"836268c2-e3e5-3c6e-96d1-c3c7ceee91f6","version":313,"action":"UPDATE"},{"gtasId":"12123446","tamrId":"0cff0e99-9320-3ae2-899e-013c23d23265","version":313,"action":"UPDATE"},{"gtasId":"11232216","tamrId":"a9195633-d0c8-3fc2-84b5-61f229fa8e6f","version":313,"action":"UPDATE"},{"gtasId":"5963219","tamrId":"e48b4096-a6f6-335a-adcd-f03211cbf671","version":313,"action":"UPDATE"},{"gtasId":"8727409","tamrId":"7133f595-21e3-3912-9592-6ab9daa9dbb5","version":313,"action":"UPDATE"},{"gtasId":"16806667","tamrId":"f086c862-4fa0-357f-9b27-6dec2fb034b2","version":313,"action":"UPDATE"},{"gtasId":"11753923","tamrId":"26e8d31c-aec2-3622-a4b8-d609b27810d0","version":313,"action":"UPDATE"},{"gtasId":"1673856","tamrId":"d2297900-7ac6-33d3-b499-5aad888f75f7","version":313,"action":"UPDATE"},{"gtasId":"8771125","tamrId":"30a853c9-6819-3e3f-afe0-82f851a4e2c7","version":313,"action":"UPDATE"},{"gtasId":"12572509","tamrId":"a13143c1-45b1-3956-a212-da343f82f527","version":313,"action":"UPDATE"},{"gtasId":"16680575","tamrId":"a3a7791c-86ca-3f34-a92e-cdc155749377","version":313,"action":"UPDATE"},{"gtasId":"19778714","tamrId":"0e60c9ec-70e0-3d6e-84bd-67828b212f09","version":313,"action":"UPDATE"},{"gtasId":"20567256","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"15358830","tamrId":"50ed6344-c178-3cf0-b377-c44ab3cf4134","version":313,"action":"UPDATE"},{"gtasId":"5288676","tamrId":"9884a75c-667e-38ac-9853-96823c24f8b0","version":313,"action":"UPDATE"},{"gtasId":"6851289","tamrId":"9dc981df-b132-32b8-9b29-d64a071630a5","version":313,"action":"UPDATE"},{"gtasId":"21851508","tamrId":"85b0722f-0fb1-319f-b36e-4f13ae98ee5b","version":313,"action":"UPDATE"},{"gtasId":"11649703","tamrId":"ca0e148c-e22e-355a-907a-850280bca89a","version":313,"action":"UPDATE"},{"gtasId":"1038119","tamrId":"d0159eb8-fc10-3156-919f-a133d2cacac9","version":313,"action":"UPDATE"},{"gtasId":"4843256","tamrId":"fbefc6bc-385d-31e8-8a2b-c38478db7659","version":313,"action":"UPDATE"},{"gtasId":"16906395","tamrId":"af4bb469-2c50-3924-85db-b8e7fbd66631","version":313,"action":"UPDATE"},{"gtasId":"22358018","tamrId":"7b29d230-1188-35ca-a6d6-caf5a527fc85","version":313,"action":"UPDATE"},{"gtasId":"3701204","tamrId":"92abd7e0-d4d6-3c3f-8387-234d0c5ad602","version":313,"action":"UPDATE"},{"gtasId":"20580693","tamrId":"dc9b5f08-de1f-35d1-85ce-2a3a1b6146eb","version":313,"action":"UPDATE"},{"gtasId":"8154990","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"13447016","tamrId":"50de1fcb-d4e5-3524-b7ec-3ebff691ec08","version":313,"action":"UPDATE"},{"gtasId":"20639534","tamrId":"2068964a-469c-39b9-8ddb-5173f41521b1","version":313,"action":"UPDATE"},{"gtasId":"11679568","tamrId":"81460da5-018f-3344-96f3-ef32fec214df","version":313,"action":"UPDATE"},{"gtasId":"23861704","tamrId":"df4abf7c-d725-39a6-b2a2-58cd5bb5680d","version":313,"action":"UPDATE"},{"gtasId":"23916996","tamrId":"a2b65d59-d85b-31f0-a434-5c25a49c61fd","version":313,"action":"UPDATE"},{"gtasId":"19054755","tamrId":"54d5c5b3-0a1c-378f-8075-ab7a76de456a","version":313,"action":"UPDATE"},{"gtasId":"9418015","tamrId":"2bbd8eb3-2295-3c6a-bd73-fc55e4be472b","version":313,"action":"UPDATE"},{"gtasId":"11142798","tamrId":"08127f02-475f-3b6b-ad95-d196ff50cfdb","version":313,"action":"UPDATE"},{"gtasId":"10344630","tamrId":"58645722-e465-30fe-883b-1988d47696a9","version":313,"action":"UPDATE"},{"gtasId":"10262358","tamrId":"6d39ec1d-f697-349a-9862-9f8180717d42","version":313,"action":"UPDATE"},{"gtasId":"7381849","tamrId":"dee856ac-4fec-385c-9895-41fc8f0b486f","version":313,"action":"UPDATE"},{"gtasId":"15757659","tamrId":"44dfce68-0080-3d55-8f34-29191f69514a","version":313,"action":"UPDATE"},{"gtasId":"11884598","tamrId":"d9d448ae-bcf9-3c06-9d2c-d2827672afd4","version":313,"action":"UPDATE"},{"gtasId":"13812031","tamrId":"eaa10df8-795c-3816-bcff-fe08662c8c0c","version":313,"action":"UPDATE"},{"gtasId":"15482430","tamrId":"d3b78506-8663-3c93-a2cf-43637cb5f818","version":313,"action":"UPDATE"},{"gtasId":"2974510","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"7437634","tamrId":"0b360023-0731-3ed0-9c4e-56eb59f23027","version":313,"action":"UPDATE"},{"gtasId":"2930962","tamrId":"fd815642-8b50-38f8-945a-48e275cb777b","version":313,"action":"UPDATE"},{"gtasId":"13104432","tamrId":"433c03de-a992-3599-adda-be82782d5148","version":313,"action":"UPDATE"},{"gtasId":"3999103","tamrId":"d035ff66-1fb7-30f4-8d05-423d509ebdd4","version":313,"action":"UPDATE"},{"gtasId":"19458948","tamrId":"c664d499-9eab-3905-9ce2-a55ffa88e8f1","version":313,"action":"UPDATE"},{"gtasId":"21620343","tamrId":"6d4e1535-d8bb-34f5-813a-907b4409dcac","version":313,"action":"UPDATE"},{"gtasId":"13496852","tamrId":"249bbd44-47d0-3176-b071-8f38e156b5fd","version":313,"action":"UPDATE"},{"gtasId":"6728779","tamrId":"6c597c96-a403-39e7-8fc8-c3907d70c921","version":313,"action":"UPDATE"},{"gtasId":"10071959","tamrId":"b67ccc04-24b5-3dca-ae45-54592e195c3e","version":313,"action":"UPDATE"},{"gtasId":"2088189","tamrId":"059eabd5-3fa8-3d23-9445-fef008d76405","version":313,"action":"UPDATE"},{"gtasId":"10641537","tamrId":"caeec5e3-b702-305f-803e-29f9a60e3c40","version":313,"action":"UPDATE"},{"gtasId":"13412333","tamrId":"e7d62efb-1c99-3359-ab18-b9de92fce9b3","version":313,"action":"UPDATE"},{"gtasId":"18060895","tamrId":"a20147e1-37f4-3217-abb5-179d554a4420","version":313,"action":"UPDATE"},{"gtasId":"6786624","tamrId":"a8427d51-3898-3ec3-9efc-90789bcc1043","version":313,"action":"UPDATE"},{"gtasId":"2403854","tamrId":"5b81e4e5-271b-32de-ae40-da0e04793b81","version":313,"action":"UPDATE"},{"gtasId":"12113672","tamrId":"13b98c40-4761-3514-bc6a-28eb96cb4d65","version":313,"action":"UPDATE"},{"gtasId":"1004301","tamrId":"987c8b4f-2c7c-36d4-97b6-3680230606ab","version":313,"action":"UPDATE"},{"gtasId":"7269185","tamrId":"4adebe27-e08f-38d3-8482-e2fc4326e4ba","version":313,"action":"UPDATE"},{"gtasId":"17800738","tamrId":"c05dd4a9-76e5-365a-92aa-bb3c706a7329","version":313,"action":"UPDATE"},{"gtasId":"8716787","tamrId":"b80c439d-0913-39b1-9f60-8d01564ffd48","version":313,"action":"UPDATE"},{"gtasId":"6810705","tamrId":"b20ac828-a372-3e29-bc32-5754ab9c7aac","version":313,"action":"UPDATE"},{"gtasId":"7126975","tamrId":"3a39a6d3-ea3c-391e-9560-6a69b1460563","version":313,"action":"UPDATE"},{"gtasId":"10607683","tamrId":"9c741772-7b46-3b38-af90-075a498e9084","version":313,"action":"UPDATE"},{"gtasId":"8035099","tamrId":"4723a817-71b2-34db-8c64-8d859dbeaeae","version":313,"action":"UPDATE"},{"gtasId":"24797806","tamrId":"633a9132-8e6c-37c5-abdf-c4986150ef06","version":313,"action":"UPDATE"},{"gtasId":"20340596","tamrId":"340d501c-5c0c-3213-9449-bbd6abe762ea","version":313,"action":"UPDATE"},{"gtasId":"1566554","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"5269975","tamrId":"c3029031-0b4c-3e6d-bcca-313dfd0c1e92","version":313,"action":"UPDATE"},{"gtasId":"16567315","tamrId":"ea036ff4-09ae-3578-bde1-b6fe1675a646","version":313,"action":"UPDATE"},{"gtasId":"24633422","tamrId":"4108698e-4236-3189-9f5c-f25942e5b158","version":313,"action":"UPDATE"},{"gtasId":"8278207","tamrId":"1febeeab-dc5f-38c5-b200-106212d4a24b","version":313,"action":"UPDATE"},{"gtasId":"19917911","tamrId":"9638b366-6e43-3900-9e45-c37336908bb7","version":313,"action":"UPDATE"},{"gtasId":"12782812","tamrId":"24b15021-9ef9-3617-a4a3-b249bff64f84","version":313,"action":"UPDATE"},{"gtasId":"3821614","tamrId":"871de99b-f8af-3918-a4f4-1bac29650a1f","version":313,"action":"UPDATE"},{"gtasId":"6964047","tamrId":"6fdd8bd2-c261-3e74-83c0-d1b68ef6644d","version":313,"action":"UPDATE"},{"gtasId":"9459870","tamrId":"b4346186-2329-38b9-887f-75940f91e5fe","version":313,"action":"UPDATE"},{"gtasId":"14472393","tamrId":"e1b48d7f-8127-3da2-87e3-324777590d9e","version":313,"action":"UPDATE"},{"gtasId":"17877189","tamrId":"a5835292-79fb-3c63-adfe-70f11b9d59f6","version":313,"action":"UPDATE"},{"gtasId":"9642615","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"21942778","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"13139570","tamrId":"00179446-1c63-3fae-8b76-9e1dd68f39f3","version":313,"action":"UPDATE"},{"gtasId":"14133689","tamrId":"6a434aa9-3155-3e45-a995-155cd255e332","version":313,"action":"UPDATE"},{"gtasId":"18095528","tamrId":"271662b0-eaf9-3d94-89dc-616b94dffaec","version":313,"action":"UPDATE"},{"gtasId":"13647989","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"4973205","tamrId":"49887e20-b38d-3e4b-960f-ea2661d89a9e","version":313,"action":"UPDATE"},{"gtasId":"17552508","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"5769891","tamrId":"ad0831f9-6808-33e4-bfd2-352c0960a8fb","version":313,"action":"UPDATE"},{"gtasId":"1165895","tamrId":"964928a9-ec00-31cb-9dce-c117de7b8cb9","version":313,"action":"UPDATE"},{"gtasId":"2895920","tamrId":"edeaf175-7bdb-3945-9cd1-38ac0dbe4f6c","version":313,"action":"UPDATE"},{"gtasId":"24101923","tamrId":"6908334c-4cef-3ca5-a664-63021f555458","version":313,"action":"UPDATE"},{"gtasId":"23506761","tamrId":"53811d28-e6b9-3e77-857a-d121327f4dc0","version":313,"action":"UPDATE"},{"gtasId":"24864680","tamrId":"d390507b-ccd1-3c0e-a8b5-f36625422c43","version":313,"action":"UPDATE"},{"gtasId":"164777","tamrId":"0aa47a5c-73aa-3454-b974-3554115673df","version":313,"action":"UPDATE"},{"gtasId":"5166955","tamrId":"891528ac-e1b5-3a53-ad16-a3e483b2919d","version":313,"action":"UPDATE"},{"gtasId":"22169921","tamrId":"9286a2b2-420b-3b1d-97fe-7503defbd806","version":313,"action":"UPDATE"},{"gtasId":"24190964","tamrId":"4331356b-be1f-307a-b395-37c718094a19","version":313,"action":"UPDATE"},{"gtasId":"25285214","tamrId":"3bae8959-962f-35f1-9bf3-0e5139dd2557","version":313,"action":"UPDATE"},{"gtasId":"22272869","tamrId":"74ea7e0b-d8f0-34bc-9ac5-88f02a114404","version":313,"action":"UPDATE"},{"gtasId":"5392954","tamrId":"983323e8-6d2d-391e-a603-141ac97f4f5a","version":313,"action":"UPDATE"},{"gtasId":"22865553","tamrId":"1fe8be59-2c61-3d10-9fb2-66c242376733","version":313,"action":"UPDATE"},{"gtasId":"8167448","tamrId":"47676c55-7e43-3dcd-b267-fb428841ede5","version":313,"action":"UPDATE"},{"gtasId":"22638681","tamrId":"3f6ea7b0-f63b-35da-a112-052336c98017","version":313,"action":"UPDATE"},{"gtasId":"4867226","tamrId":"31d0d769-26a0-38ce-8a6e-8d6d0b2ff661","version":313,"action":"UPDATE"},{"gtasId":"19066304","tamrId":"9a9c33ec-2bbc-3187-bcba-65d2f8c5576d","version":313,"action":"UPDATE"},{"gtasId":"23344946","tamrId":"33c08b0a-36ef-3530-913d-fcb4a1e53e18","version":313,"action":"UPDATE"},{"gtasId":"7412709","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"6049284","tamrId":"e6061588-c50c-3088-8c99-99fec8ae971b","version":313,"action":"UPDATE"},{"gtasId":"23570422","tamrId":"46adde02-9b0e-36ee-9194-466ff0674e82","version":313,"action":"UPDATE"},{"gtasId":"6186348","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"20070515","tamrId":"e68585b0-9ae3-36e8-8caf-94d502246a05","version":313,"action":"UPDATE"},{"gtasId":"18358385","tamrId":"c2266161-2c2c-3ffb-8dd6-170b18978f40","version":313,"action":"UPDATE"},{"gtasId":"12977393","tamrId":"3199b779-08ce-31d4-95f9-d2a9aa1dd877","version":313,"action":"UPDATE"},{"gtasId":"1021761","tamrId":"9e25325e-99fd-3189-b717-19518d4a05f7","version":313,"action":"UPDATE"},{"gtasId":"6076811","tamrId":"5d3d0732-c1a8-3b3c-a47f-2d5fbd26cbb0","version":313,"action":"UPDATE"},{"gtasId":"16028921","tamrId":"0dd2f2d5-ead8-322b-997a-44ad65f5f8b8","version":313,"action":"UPDATE"},{"gtasId":"11725042","tamrId":"beb16ac4-eb3b-3793-94a7-0f64f004e989","version":313,"action":"UPDATE"},{"gtasId":"12713277","tamrId":"d25e8ece-ab64-3f33-b287-c7f83a9b6bd0","version":313,"action":"UPDATE"},{"gtasId":"21164440","tamrId":"42137e99-61cf-3ec2-b6d0-785ad715b413","version":313,"action":"UPDATE"},{"gtasId":"8912436","tamrId":"ad55b577-7ae8-3fda-b632-6d2972991b96","version":313,"action":"UPDATE"},{"gtasId":"6353567","tamrId":"0866a58f-5109-350c-9df5-8f965208bce2","version":313,"action":"UPDATE"},{"gtasId":"23592220","tamrId":"52e34299-5500-3f8c-ade6-2e2dca16f2a1","version":313,"action":"UPDATE"},{"gtasId":"14900280","tamrId":"0f60498e-a19c-362e-86ea-d584718e16fa","version":313,"action":"UPDATE"},{"gtasId":"6200067","tamrId":"fa1c6566-53ea-3cf4-9044-4c78a1646437","version":313,"action":"UPDATE"},{"gtasId":"21601621","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"13156977","tamrId":"e1107254-90b9-31e9-b521-2e3622d76cfd","version":313,"action":"UPDATE"},{"gtasId":"16016945","tamrId":"50de1fcb-d4e5-3524-b7ec-3ebff691ec08","version":313,"action":"UPDATE"},{"gtasId":"10295676","tamrId":"77d63a30-0e0b-3dbb-901c-a6ad9a9192d7","version":313,"action":"UPDATE"},{"gtasId":"3411248","tamrId":"4be2311b-dab6-3fa5-b559-9591eb6d1828","version":313,"action":"UPDATE"},{"gtasId":"12657904","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"14581475","tamrId":"0ec9b3d6-dacc-33c5-af71-9badaba64009","version":313,"action":"UPDATE"},{"gtasId":"21466471","tamrId":"7b88d3d8-2e2e-3779-be59-4e360539e2b9","version":313,"action":"UPDATE"},{"gtasId":"13761783","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"21176413","tamrId":"9dfc86b3-31e8-3b58-b01f-3a74327014cc","version":313,"action":"UPDATE"},{"gtasId":"7102945","tamrId":"26ee7a20-787e-3063-bd64-fd95a60424df","version":313,"action":"UPDATE"},{"gtasId":"9660086","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"9816058","tamrId":"c7b7f0df-d1dd-3b07-bdf0-70af58f76080","version":313,"action":"UPDATE"},{"gtasId":"13071135","tamrId":"0db96f5c-aa42-3c5b-b2db-6e1407780585","version":313,"action":"UPDATE"},{"gtasId":"699334","tamrId":"b876a316-5e95-3e1b-b3d8-3f19884e752a","version":313,"action":"UPDATE"},{"gtasId":"9210488","tamrId":"ff1ccbd1-30da-35dd-a329-70c0ec0f90e1","version":313,"action":"UPDATE"},{"gtasId":"1303704","tamrId":"8ff4a74c-dab9-3f75-be4e-935d4316efe0","version":313,"action":"UPDATE"},{"gtasId":"20617353","tamrId":"bee52e61-565e-3488-bf85-c59376bb4a25","version":313,"action":"UPDATE"},{"gtasId":"12222242","tamrId":"26f38249-9718-3c0e-8090-dce615555e1e","version":313,"action":"UPDATE"},{"gtasId":"4191784","tamrId":"2283d285-1859-39e0-ab1f-540ae24beeb4","version":313,"action":"UPDATE"},{"gtasId":"21412657","tamrId":"c7041f60-ab66-3eaf-be60-ca67721802dd","version":313,"action":"UPDATE"},{"gtasId":"6936464","tamrId":"46f50e6d-44a5-32f7-a72c-c05f9fde2de5","version":313,"action":"UPDATE"},{"gtasId":"3767906","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"388833","tamrId":"c7041f60-ab66-3eaf-be60-ca67721802dd","version":313,"action":"UPDATE"},{"gtasId":"13321509","tamrId":"b2965e7d-699d-354f-908b-04edf32c9839","version":313,"action":"UPDATE"},{"gtasId":"18212446","tamrId":"1ccd0d34-76af-3bb8-b881-adf903766c48","version":313,"action":"UPDATE"},{"gtasId":"1235137","tamrId":"9133a2da-d945-3309-b201-41cc75d3b88a","version":313,"action":"UPDATE"},{"gtasId":"17970741","tamrId":"0f60498e-a19c-362e-86ea-d584718e16fa","version":313,"action":"UPDATE"},{"gtasId":"214419","tamrId":"116469da-adca-3449-970c-eef938aa102e","version":313,"action":"UPDATE"},{"gtasId":"5087730","tamrId":"1186c773-240e-3def-891e-2fe3e0b865ab","version":313,"action":"UPDATE"},{"gtasId":"7597814","tamrId":"db17d2a7-a4a0-30a2-8ecf-6d330aed947b","version":313,"action":"UPDATE"},{"gtasId":"9315233","tamrId":"2a1a89a5-d10f-3021-b218-54c9e5f98ab9","version":313,"action":"UPDATE"},{"gtasId":"18031080","tamrId":"96906e57-ec89-364f-91c4-e68bf1cf0f9e","version":313,"action":"UPDATE"},{"gtasId":"7902455","tamrId":"8d871ebf-1e45-3c88-9c5b-6c31d7bf6dad","version":313,"action":"UPDATE"},{"gtasId":"15861278","tamrId":"b6cb8e49-cdd2-35d9-b9f2-886e4d84bf52","version":313,"action":"UPDATE"},{"gtasId":"4687123","tamrId":"1219ba8e-d111-31e1-91d7-62308c526741","version":313,"action":"UPDATE"},{"gtasId":"10611781","tamrId":"faf01de8-3ee6-3c81-865a-29c3d8baae68","version":313,"action":"UPDATE"},{"gtasId":"1572390","tamrId":"0596ed4e-2d25-3489-9ec7-8db89176bc8b","version":313,"action":"UPDATE"},{"gtasId":"14852347","tamrId":"abae2472-2bf6-3079-9f67-c186579a9089","version":313,"action":"UPDATE"},{"gtasId":"2082008","tamrId":"b927e82e-0351-36c5-a253-5553f73ddf14","version":313,"action":"UPDATE"},{"gtasId":"7750403","tamrId":"d6f7d27f-bc32-303f-9c89-64b3d41ff6ce","version":313,"action":"UPDATE"},{"gtasId":"18002993","tamrId":"eb55dd70-848a-30f9-b93a-a8cd38a1174d","version":313,"action":"UPDATE"},{"gtasId":"10295622","tamrId":"6cb41fad-676b-3316-ad30-aa23b82707c0","version":313,"action":"UPDATE"},{"gtasId":"3136733","tamrId":"928a4280-bf82-3680-b69c-916524a8a01c","version":313,"action":"UPDATE"},{"gtasId":"5387563","tamrId":"a68f6e6b-bab5-378b-a7db-2df8b5c9fe7c","version":313,"action":"UPDATE"},{"gtasId":"11272715","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"17117124","tamrId":"2338b62c-c4bc-3cc6-90bc-c71ffcccc089","version":313,"action":"UPDATE"},{"gtasId":"11681852","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"4571063","tamrId":"260063e5-d0bb-344a-81d8-ce327ab00509","version":313,"action":"UPDATE"},{"gtasId":"14550316","tamrId":"20633ec6-c545-3577-97f5-1f4da4fe98cd","version":313,"action":"UPDATE"},{"gtasId":"25175743","tamrId":"0dd2f2d5-ead8-322b-997a-44ad65f5f8b8","version":313,"action":"UPDATE"},{"gtasId":"6467256","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"25148113","tamrId":"81f2492e-f9e5-3d23-a799-b12698fe96fc","version":313,"action":"UPDATE"},{"gtasId":"11098821","tamrId":"ac444107-2686-31f1-aa29-66ef9f021992","version":313,"action":"UPDATE"},{"gtasId":"23242133","tamrId":"b5a1fa49-70f0-3849-b264-ecc46f74221a","version":313,"action":"UPDATE"},{"gtasId":"18954683","tamrId":"d407d25d-e805-3548-8bf1-ed8eb84c8bdc","version":313,"action":"UPDATE"},{"gtasId":"5714344","tamrId":"c1453ff1-c0c0-3d04-a3fd-611d1bb9dc2b","version":313,"action":"UPDATE"},{"gtasId":"15817578","tamrId":"8487a91d-30a7-397b-afb1-b17a2f0c3b90","version":313,"action":"UPDATE"},{"gtasId":"15944000","tamrId":"d985beb9-4eae-32cf-800d-ac233f1c6bf4","version":313,"action":"UPDATE"},{"gtasId":"14777069","tamrId":"e66365ae-2975-32e3-9e5a-06bde63c2cda","version":313,"action":"UPDATE"},{"gtasId":"23546372","tamrId":"ab2cf597-5a87-39ff-9e9c-fd9f846e73a9","version":313,"action":"UPDATE"},{"gtasId":"14950914","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"7584548","tamrId":"fb7bf513-106f-365c-a12a-0f6b1c55b6e2","version":313,"action":"UPDATE"},{"gtasId":"11318581","tamrId":"86a65257-66ad-3b3d-a4aa-effc2171091f","version":313,"action":"UPDATE"},{"gtasId":"13689745","tamrId":"f14c57f0-789f-31c9-8a9f-a2cf96a4d047","version":313,"action":"UPDATE"},{"gtasId":"12293405","tamrId":"9ab28025-a1be-340b-9407-18fb36f8dd40","version":313,"action":"UPDATE"},{"gtasId":"10979139","tamrId":"1cdd7c04-05bd-31ac-aaf5-a29daa9a11f5","version":313,"action":"UPDATE"},{"gtasId":"2171934","tamrId":"52329957-9338-3614-8b2c-7bb6dc500f70","version":313,"action":"UPDATE"},{"gtasId":"17456971","tamrId":"22c40075-e6f5-3bb8-a7c5-a3c731235a08","version":313,"action":"UPDATE"},{"gtasId":"15787082","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"18677732","tamrId":"03762943-c2dc-317e-a15e-226fb1bb3e54","version":313,"action":"UPDATE"},{"gtasId":"2609021","tamrId":"683a62c9-2a8e-3403-9e3b-fa1890c571d7","version":313,"action":"UPDATE"},{"gtasId":"9480869","tamrId":"664395e4-26fe-36f7-9b21-ea9e42dae09f","version":313,"action":"UPDATE"},{"gtasId":"16336163","tamrId":"aed6c5de-b995-39d2-b24d-103a782a04f4","version":313,"action":"UPDATE"},{"gtasId":"12174139","tamrId":"ae304be1-0135-3c89-ac14-408d8366d90d","version":313,"action":"UPDATE"},{"gtasId":"14213550","tamrId":"f2e9e0de-46de-3195-9e34-2fea91a4971c","version":313,"action":"UPDATE"},{"gtasId":"10541631","tamrId":"0d0f1f0d-8590-3606-9372-9ed87f085536","version":313,"action":"UPDATE"},{"gtasId":"12584545","tamrId":"6cbed878-f291-304f-b1fd-3f7ec43d2606","version":313,"action":"UPDATE"},{"gtasId":"19591222","tamrId":"70916dab-872e-386d-a3e4-1dc1e88cc246","version":313,"action":"UPDATE"},{"gtasId":"2876353","tamrId":"f3c91a83-6624-3e86-9dea-868283a231c1","version":313,"action":"UPDATE"},{"gtasId":"17977342","tamrId":"9327a685-c3db-3a38-bfd7-16596905a7e9","version":313,"action":"UPDATE"},{"gtasId":"917947","tamrId":"52a35224-3960-3834-b15d-5781735b3042","version":313,"action":"UPDATE"},{"gtasId":"19617213","tamrId":"83e7dd9c-0961-3ccc-9d04-a43843dbcfbe","version":313,"action":"UPDATE"},{"gtasId":"7344822","tamrId":"1866d1ab-735a-376d-bd99-b50908b87e8a","version":313,"action":"UPDATE"},{"gtasId":"10140175","tamrId":"93f153bf-06b4-3966-b135-b50350d530a8","version":313,"action":"UPDATE"},{"gtasId":"10598968","tamrId":"61fdb851-1b26-3344-abcc-b6c7847a0625","version":313,"action":"UPDATE"},{"gtasId":"16429161","tamrId":"4650cae4-9c36-3930-909f-06784d59a67e","version":313,"action":"UPDATE"},{"gtasId":"7667524","tamrId":"a75a5a91-3fe4-3447-b49b-cf2d7a8c6031","version":313,"action":"UPDATE"},{"gtasId":"12689530","tamrId":"5f3e25d4-b8ed-3724-be49-c432e9c9e6a3","version":313,"action":"UPDATE"},{"gtasId":"13501187","tamrId":"3fc2e47d-56c3-30e2-95d4-74f3803eff0a","version":313,"action":"UPDATE"},{"gtasId":"14711313","tamrId":"6bbca796-f9e7-3a03-a0f5-ccf28f0b1224","version":313,"action":"UPDATE"},{"gtasId":"13787797","tamrId":"d8369dcf-b73f-383a-8e1f-355d7a09b272","version":313,"action":"UPDATE"},{"gtasId":"20130868","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"6781895","tamrId":"34f95f80-eb10-35ee-8085-9225b9d7bb98","version":313,"action":"UPDATE"},{"gtasId":"11672145","tamrId":"c38717c4-132c-38b8-851d-6adcebab4ffa","version":313,"action":"UPDATE"},{"gtasId":"4786805","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"3143067","tamrId":"c41b9e51-51e9-382a-976f-c03cc2841346","version":313,"action":"UPDATE"},{"gtasId":"8536202","tamrId":"58d66131-9d03-3fcc-bd75-dde9740795a5","version":313,"action":"UPDATE"},{"gtasId":"6054056","tamrId":"fe4ff392-5f0f-3ef5-9adc-95b51cf25444","version":313,"action":"UPDATE"},{"gtasId":"13383278","tamrId":"310c9a8a-8d66-35eb-931f-ecbc46e05190","version":313,"action":"UPDATE"},{"gtasId":"20693727","tamrId":"e580a7d4-3dd5-3cc9-9d40-6debb2a9b20f","version":313,"action":"UPDATE"},{"gtasId":"4700111","tamrId":"4d0dd6f8-2b2d-3a78-a43b-4e87fd25e40e","version":313,"action":"UPDATE"},{"gtasId":"12745263","tamrId":"bcaf15a9-3515-3caf-9e95-3e1a6c2f6b7a","version":313,"action":"UPDATE"},{"gtasId":"15408958","tamrId":"69f92bae-ab68-30c8-92ea-fbaee7286195","version":313,"action":"UPDATE"},{"gtasId":"4190703","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"973892","tamrId":"549b2d14-f0b4-3326-a503-2adcd050ccb4","version":313,"action":"UPDATE"},{"gtasId":"238462","tamrId":"b1c41c18-acc8-3d6e-8973-e35b604f12b8","version":313,"action":"UPDATE"},{"gtasId":"6381725","tamrId":"41bf3d3c-c8aa-3e80-ab35-42cb4b9f1fb0","version":313,"action":"UPDATE"},{"gtasId":"15666295","tamrId":"bb4d3b08-2afa-3692-a5c4-4d2b523e9967","version":313,"action":"UPDATE"},{"gtasId":"6971046","tamrId":"b0a16af1-12dc-3686-8e88-c2368ea780cd","version":313,"action":"UPDATE"},{"gtasId":"24233096","tamrId":"1f5662a9-5e88-333c-870c-6092fc9da04d","version":313,"action":"UPDATE"},{"gtasId":"19835130","tamrId":"8d228b51-5efb-3793-8ab4-d0e504fd962d","version":313,"action":"UPDATE"},{"gtasId":"14480256","tamrId":"f2e9e0de-46de-3195-9e34-2fea91a4971c","version":313,"action":"UPDATE"},{"gtasId":"8733891","tamrId":"61bc3a6f-8175-31be-974c-bf50fd277696","version":313,"action":"UPDATE"},{"gtasId":"1253874","tamrId":"9638b366-6e43-3900-9e45-c37336908bb7","version":313,"action":"UPDATE"},{"gtasId":"18752684","tamrId":"e44e9b24-b3af-30db-a059-146a02066cdf","version":313,"action":"UPDATE"},{"gtasId":"6170385","tamrId":"ff79af98-235f-333f-a62a-16d27e0d6c1b","version":313,"action":"UPDATE"},{"gtasId":"17371681","tamrId":"4a3d33c5-d8c4-39c5-b718-0547120e1764","version":313,"action":"UPDATE"},{"gtasId":"4004721","tamrId":"22362cbc-91d2-3c54-8d66-f5f5cef049a1","version":313,"action":"UPDATE"},{"gtasId":"12930470","tamrId":"1eb500e6-4319-35da-af6f-68dd4a265be0","version":313,"action":"UPDATE"},{"gtasId":"13502506","tamrId":"6f8f048c-ceb7-3e28-a160-acda5d0447ad","version":313,"action":"UPDATE"},{"gtasId":"20394717","tamrId":"03fd6b8d-93c1-3921-ae61-b2098e42067f","version":313,"action":"UPDATE"},{"gtasId":"9614932","tamrId":"540a5343-3e25-3acc-a336-5d55257365e2","version":313,"action":"UPDATE"},{"gtasId":"7750312","tamrId":"af9cb3fe-727d-316b-8d5b-6444a9ba6183","version":313,"action":"UPDATE"},{"gtasId":"15782157","tamrId":"ca8e07a7-70fa-3fb5-be51-96de400fcaa7","version":313,"action":"UPDATE"},{"gtasId":"7691010","tamrId":"93c308f8-1db4-331a-80c1-02e65146b02a","version":313,"action":"UPDATE"},{"gtasId":"7394240","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"7414134","tamrId":"31376f37-02a6-3769-999d-4bdf5c33329c","version":313,"action":"UPDATE"},{"gtasId":"9710387","tamrId":"5d95a78b-abd6-3888-bdcf-f31f81a2b7d1","version":313,"action":"UPDATE"},{"gtasId":"12565205","tamrId":"f59901a2-58a5-32fe-9979-aaeb84ca35a0","version":313,"action":"UPDATE"},{"gtasId":"1164930","tamrId":"772dd509-cbac-3012-a530-b09240a3e01b","version":313,"action":"UPDATE"},{"gtasId":"6644871","tamrId":"dfc65f62-adbf-3941-910e-e6043a873338","version":313,"action":"UPDATE"},{"gtasId":"477223","tamrId":"c30fbd95-5f6f-32f7-990b-73ddcb30f5a4","version":313,"action":"UPDATE"},{"gtasId":"18959516","tamrId":"7c4d59fa-952f-33db-b29e-166be3cb9c04","version":313,"action":"UPDATE"},{"gtasId":"5570456","tamrId":"73825d8b-d6db-3239-a7bf-fdaee5aa932e","version":313,"action":"UPDATE"},{"gtasId":"8286850","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"8695475","tamrId":"709811ec-ae68-3e47-907a-5a899ba93b7d","version":313,"action":"UPDATE"},{"gtasId":"4711288","tamrId":"48171ee6-4c8a-327c-bb73-7df649d1866d","version":313,"action":"UPDATE"},{"gtasId":"8448878","tamrId":"d5f69d25-c111-347e-972a-f523821fbd35","version":313,"action":"UPDATE"},{"gtasId":"18017296","tamrId":"a6d7f16b-c480-34ef-97db-a5be1bbaee8d","version":313,"action":"UPDATE"},{"gtasId":"15583603","tamrId":"1fe430fe-3552-313b-8138-72c5dbb550ab","version":313,"action":"UPDATE"},{"gtasId":"8367302","tamrId":"f227857f-b450-36ad-9949-08ffa93204a8","version":313,"action":"UPDATE"},{"gtasId":"19812467","tamrId":"50ed6344-c178-3cf0-b377-c44ab3cf4134","version":313,"action":"UPDATE"},{"gtasId":"645912","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"6929962","tamrId":"fc9e00ff-f456-3bea-aa8d-c4b4f518c2fb","version":313,"action":"UPDATE"},{"gtasId":"397072","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"21129256","tamrId":"a8a0d74c-44bd-3dc5-9b25-8fb0f36e6dd5","version":313,"action":"UPDATE"},{"gtasId":"1268934","tamrId":"0d895a24-5ba4-335c-9dde-2778acb881f5","version":313,"action":"UPDATE"},{"gtasId":"14565750","tamrId":"4b25b611-92e1-382c-b0ba-82c166ba9eaa","version":313,"action":"UPDATE"},{"gtasId":"18348091","tamrId":"40fe0447-4b12-3902-aa88-baac6b439741","version":313,"action":"UPDATE"},{"gtasId":"7567731","tamrId":"f4c08468-7f2c-3497-a0fa-c41ff3614b91","version":313,"action":"UPDATE"},{"gtasId":"24091970","tamrId":"9605765c-64f6-328b-92cb-dade0356ba2c","version":313,"action":"UPDATE"},{"gtasId":"9160499","tamrId":"d8f611a0-5a3d-30d5-947e-2b486cb9b412","version":313,"action":"UPDATE"},{"gtasId":"6471583","tamrId":"ce0e5a57-9c5c-39ee-b2b2-d556e165c3eb","version":313,"action":"UPDATE"},{"gtasId":"22289637","tamrId":"0e779ea0-75a2-3d25-8a4b-df9982ba2fc5","version":313,"action":"UPDATE"},{"gtasId":"13749017","tamrId":"89adc80d-2d46-3840-8e7c-043ada40d2e0","version":313,"action":"UPDATE"},{"gtasId":"11241762","tamrId":"2ef854ae-1b0b-3277-98ad-9b3c4fb17219","version":313,"action":"UPDATE"},{"gtasId":"14363275","tamrId":"add18529-7895-3fed-9379-caae9a2d91ff","version":313,"action":"UPDATE"},{"gtasId":"10340625","tamrId":"1a5b5650-4635-315b-a972-940ec5acc2bf","version":313,"action":"UPDATE"},{"gtasId":"14345863","tamrId":"8ea277e8-e6e7-3887-b52b-1312ede36a3f","version":313,"action":"UPDATE"},{"gtasId":"15270212","tamrId":"22ebcdda-cfe3-3c85-9baa-59d108dc2e82","version":313,"action":"UPDATE"},{"gtasId":"12808707","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"11810579","tamrId":"061a637f-b066-3982-b7b3-ad1690697f58","version":313,"action":"UPDATE"},{"gtasId":"878241","tamrId":"73d996d3-246e-34e6-8007-ebdb16978909","version":313,"action":"UPDATE"},{"gtasId":"23082113","tamrId":"38108d3f-6190-3b3c-923d-32731a8f356c","version":313,"action":"UPDATE"},{"gtasId":"2864774","tamrId":"2b748862-4602-38d9-9cb6-db85556dfd73","version":313,"action":"UPDATE"},{"gtasId":"25183196","tamrId":"0e707c7a-8e07-3762-bf98-f351f14a2250","version":313,"action":"UPDATE"},{"gtasId":"11355570","tamrId":"2cc1e9a4-4eeb-3ef8-87ca-4470f5efe63d","version":313,"action":"UPDATE"},{"gtasId":"22459631","tamrId":"9ccabafa-3969-3d2a-8919-a7735866b9bb","version":313,"action":"UPDATE"},{"gtasId":"12351611","tamrId":"32845050-1b1d-3266-a826-3992bd19d131","version":313,"action":"UPDATE"},{"gtasId":"10120759","tamrId":"45966616-1a4d-3429-83e0-6fefe52dfaa2","version":313,"action":"UPDATE"},{"gtasId":"7362621","tamrId":"5c62252c-c1b7-3902-a2ed-30a245cb498c","version":313,"action":"UPDATE"},{"gtasId":"14344988","tamrId":"947d481f-bb95-370e-b29f-5a1df2ec72bd","version":313,"action":"UPDATE"},{"gtasId":"22101396","tamrId":"dd6b5745-3373-3199-8a04-dfe0c5e26ee5","version":313,"action":"UPDATE"},{"gtasId":"15251964","tamrId":"754746f8-1280-3475-bcea-cccd261f2a2e","version":313,"action":"UPDATE"},{"gtasId":"3515794","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"18587935","tamrId":"e59f1d0a-21b5-3af4-a305-4a41932e1127","version":313,"action":"UPDATE"},{"gtasId":"19680969","tamrId":"49926237-f2e3-38f5-8f2b-0ef67e02fe6b","version":313,"action":"UPDATE"},{"gtasId":"515439","tamrId":"80666a5e-b18e-33d2-84cb-08b8d463cfb3","version":313,"action":"UPDATE"},{"gtasId":"14871219","tamrId":"08dc6944-5543-32f1-a574-b6a4156cec44","version":313,"action":"UPDATE"},{"gtasId":"2568629","tamrId":"35cc57bc-07e7-3a37-a37c-af1fe6312bad","version":313,"action":"UPDATE"},{"gtasId":"6838465","tamrId":"cef5d143-9d48-3c4d-947c-87996127a311","version":313,"action":"UPDATE"},{"gtasId":"698429","tamrId":"1b2f1413-82b2-3ba4-b0c8-f728cc8a47d2","version":313,"action":"UPDATE"},{"gtasId":"14785199","tamrId":"93c308f8-1db4-331a-80c1-02e65146b02a","version":313,"action":"UPDATE"},{"gtasId":"2772501","tamrId":"4cf04ca6-7c39-302a-b6f4-e558ea6059d1","version":313,"action":"UPDATE"},{"gtasId":"2651853","tamrId":"0ae87d1e-bdcd-3fb8-89a1-30cc6180c0d7","version":313,"action":"UPDATE"},{"gtasId":"6866912","tamrId":"27bdec68-0e17-3254-9ee5-581b0a1fcb6b","version":313,"action":"UPDATE"},{"gtasId":"15305846","tamrId":"45dc2bc8-274f-39ff-8193-ba9fef52f6c7","version":313,"action":"UPDATE"},{"gtasId":"19507845","tamrId":"9773ceeb-fbbc-3657-ba9f-2c61217ee804","version":313,"action":"UPDATE"},{"gtasId":"21499290","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"10192658","tamrId":"bbb93dbf-cf07-389e-a586-f11fd654f796","version":313,"action":"UPDATE"},{"gtasId":"5727024","tamrId":"ab7de270-82d0-3654-b6e9-5a02075e992c","version":313,"action":"UPDATE"},{"gtasId":"17430530","tamrId":"7e97bf20-9f50-308c-b1f5-19d13247626b","version":313,"action":"UPDATE"},{"gtasId":"11631643","tamrId":"ea75010e-ef24-3bc3-95bb-350154902055","version":313,"action":"UPDATE"},{"gtasId":"9462381","tamrId":"a53f7ba4-6f91-39df-a170-07a4ca4b7d6c","version":313,"action":"UPDATE"},{"gtasId":"13731715","tamrId":"dad10d85-b4d4-33a9-9569-050db3e6f2fd","version":313,"action":"UPDATE"},{"gtasId":"2098116","tamrId":"1f1fa162-35bb-3f35-b643-3a882d96b195","version":313,"action":"UPDATE"},{"gtasId":"17984940","tamrId":"33976c1f-55a4-3f29-ab02-efdd8e391645","version":313,"action":"UPDATE"},{"gtasId":"19682761","tamrId":"0a4cb5e5-ad79-33a6-8d95-ec05e6611729","version":313,"action":"UPDATE"},{"gtasId":"817704","tamrId":"818d0ff5-ca47-3932-9047-64d1dd65a6ad","version":313,"action":"UPDATE"},{"gtasId":"17812368","tamrId":"020b0ad2-896d-3acc-9cd4-46b741dd37c1","version":313,"action":"UPDATE"},{"gtasId":"10334322","tamrId":"14288c9b-1286-3792-92d9-59e8a57a692a","version":313,"action":"UPDATE"},{"gtasId":"6221430","tamrId":"c9cd6df1-2025-3b46-8fb4-876775d1a71a","version":313,"action":"UPDATE"},{"gtasId":"147392","tamrId":"863ac6e8-e798-30ea-addc-92fc3cba8583","version":313,"action":"UPDATE"},{"gtasId":"2932737","tamrId":"cca0874c-d720-33e9-87a8-2934dbed4d1a","version":313,"action":"UPDATE"},{"gtasId":"3801479","tamrId":"f4b92ed3-f0a9-320a-ac8d-0fb8d9be0b2b","version":313,"action":"UPDATE"},{"gtasId":"12914389","tamrId":"889a58cc-4f68-356c-9463-159882ba59e9","version":313,"action":"UPDATE"},{"gtasId":"14009673","tamrId":"02279fc0-7542-309c-ba94-704c4f90df15","version":313,"action":"UPDATE"},{"gtasId":"2980815","tamrId":"d62fa282-3a59-3da8-a1c2-d2e30aaa5a52","version":313,"action":"UPDATE"},{"gtasId":"16668073","tamrId":"0cff0e99-9320-3ae2-899e-013c23d23265","version":313,"action":"UPDATE"},{"gtasId":"10997023","tamrId":"cf980a46-d029-3ec9-b08d-e105018ec34f","version":313,"action":"UPDATE"},{"gtasId":"9192975","tamrId":"a6fbb641-064b-3ec4-9dff-621d336cf8ae","version":313,"action":"UPDATE"},{"gtasId":"25196085","tamrId":"5c93b341-a3a3-3789-abe6-2537416cac6b","version":313,"action":"UPDATE"},{"gtasId":"24100976","tamrId":"89c65330-afb5-339f-87be-4b13bca7b345","version":313,"action":"UPDATE"},{"gtasId":"13692698","tamrId":"0949fc93-5314-3602-9e78-dac3f86cd64d","version":313,"action":"UPDATE"},{"gtasId":"7314963","tamrId":"07ccbb0b-df95-3417-b31b-e9dcb859d03e","version":313,"action":"UPDATE"},{"gtasId":"7368353","tamrId":"bebea6b9-e1b7-31a8-91c2-33abc16740f9","version":313,"action":"UPDATE"},{"gtasId":"4233105","tamrId":"9a605746-c2b0-3cd8-a0d4-4e29b7e09ec4","version":313,"action":"UPDATE"},{"gtasId":"2802487","tamrId":"a1c8f4f0-3151-3fb5-b052-273267925e4c","version":313,"action":"UPDATE"},{"gtasId":"7026077","tamrId":"72e0820d-5188-3d58-bb6e-7604802ace59","version":313,"action":"UPDATE"},{"gtasId":"20953702","tamrId":"b63a30df-92f1-344c-bbf8-22b4aa1ee0ce","version":313,"action":"UPDATE"},{"gtasId":"7139550","tamrId":"153e67d9-5e9b-3d53-bd2a-3705346ab743","version":313,"action":"UPDATE"},{"gtasId":"18553254","tamrId":"6e5f6415-ffd6-3997-bdfe-607728d420bb","version":313,"action":"UPDATE"},{"gtasId":"2489300","tamrId":"a68f6e6b-bab5-378b-a7db-2df8b5c9fe7c","version":313,"action":"UPDATE"},{"gtasId":"16865262","tamrId":"31f83e96-86fd-39a6-ab3a-3320f8be5a2e","version":313,"action":"UPDATE"},{"gtasId":"13567874","tamrId":"ef7cb481-b38d-31d7-b6d2-6e1b912fd672","version":313,"action":"UPDATE"},{"gtasId":"10604887","tamrId":"b8f52d58-b811-38ec-82e5-534b910411db","version":313,"action":"UPDATE"},{"gtasId":"10321486","tamrId":"3b0c3c62-1915-3bc8-97f7-c50840fa1a3a","version":313,"action":"UPDATE"},{"gtasId":"15441938","tamrId":"585e6e44-f127-310d-8848-5895c57d2ac2","version":313,"action":"UPDATE"},{"gtasId":"10420660","tamrId":"86a906e0-0eb4-38ee-b649-817ed7b29d6c","version":313,"action":"UPDATE"},{"gtasId":"8218783","tamrId":"54d5c5b3-0a1c-378f-8075-ab7a76de456a","version":313,"action":"UPDATE"},{"gtasId":"5542366","tamrId":"354c1fa7-d674-3646-a060-c0744dbfb962","version":313,"action":"UPDATE"},{"gtasId":"8615741","tamrId":"d62faca0-4e93-350c-9115-93b6698d8665","version":313,"action":"UPDATE"},{"gtasId":"10495332","tamrId":"2b2ad71d-78d7-39d1-a7a7-f7bbd7dbc487","version":313,"action":"UPDATE"},{"gtasId":"3947099","tamrId":"429d2c2e-4f24-3c0e-8a10-14f6084ddb89","version":313,"action":"UPDATE"},{"gtasId":"1082928","tamrId":"f97a7701-b97e-3356-87ab-1baca1232f91","version":313,"action":"UPDATE"},{"gtasId":"14056404","tamrId":"35c4bb2c-bb4f-37ff-a54c-c7c4b689a703","version":313,"action":"UPDATE"},{"gtasId":"19615916","tamrId":"420273e1-b222-374e-bd4c-c6cefb48ab05","version":313,"action":"UPDATE"},{"gtasId":"13538082","tamrId":"de504c4d-439a-31e4-8b06-63e93a91e327","version":313,"action":"UPDATE"},{"gtasId":"10841833","tamrId":"127e8d06-8fc4-3b89-9aff-6f0360ec2ace","version":313,"action":"UPDATE"},{"gtasId":"5253147","tamrId":"2b7bfbd0-6f32-3ebb-9963-02bfe76773d8","version":313,"action":"UPDATE"},{"gtasId":"12730161","tamrId":"0ad3c913-87fc-3170-bcec-afe9528f5af1","version":313,"action":"UPDATE"},{"gtasId":"14834676","tamrId":"615c8aaf-2534-3afc-ba94-bf00873d44b3","version":313,"action":"UPDATE"},{"gtasId":"17773145","tamrId":"e59fd614-2e7d-3b90-a384-40d20513f375","version":313,"action":"UPDATE"},{"gtasId":"672658","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"2800288","tamrId":"0ac5cdb1-036c-3dad-932b-2368ff935b48","version":313,"action":"UPDATE"},{"gtasId":"10652931","tamrId":"f98ec671-15c3-3fae-b39c-308ad24ffa9b","version":313,"action":"UPDATE"},{"gtasId":"12970047","tamrId":"195b81ac-5b46-356e-ab31-3d3c381c4bb0","version":313,"action":"UPDATE"},{"gtasId":"14285658","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"20826529","tamrId":"3062738f-5065-3c88-9539-25964beb7a5b","version":313,"action":"UPDATE"},{"gtasId":"18917799","tamrId":"983c908c-82b6-394a-b5ce-64959a2ed4b6","version":313,"action":"UPDATE"},{"gtasId":"21793152","tamrId":"64a538a2-cf94-331e-b9db-36eb43195031","version":313,"action":"UPDATE"},{"gtasId":"3222840","tamrId":"9638b366-6e43-3900-9e45-c37336908bb7","version":313,"action":"UPDATE"},{"gtasId":"692251","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"9939006","tamrId":"405b2309-4e85-399e-958a-63eb03eb663a","version":313,"action":"UPDATE"},{"gtasId":"10469075","tamrId":"36286277-c8f3-3cde-ab7b-30f533180ecb","version":313,"action":"UPDATE"},{"gtasId":"7369631","tamrId":"81d3f830-09c8-372d-9bd6-009824bb4689","version":313,"action":"UPDATE"},{"gtasId":"11396932","tamrId":"1c2720c4-d65d-38bc-a21b-1db1b4af219b","version":313,"action":"UPDATE"},{"gtasId":"22405429","tamrId":"7162b00b-4fd2-337b-8744-cd91c13bb91f","version":313,"action":"UPDATE"},{"gtasId":"10615109","tamrId":"7ac6323e-3590-3de7-933a-c1581cf52887","version":313,"action":"UPDATE"},{"gtasId":"10956905","tamrId":"e62358c6-d55f-3811-ac46-b21fbc26f50c","version":313,"action":"UPDATE"},{"gtasId":"1898953","tamrId":"222b8781-0620-3b2a-a93f-9f861a7a6788","version":313,"action":"UPDATE"},{"gtasId":"14577352","tamrId":"d0ed8481-8d4c-3c2b-9e0d-0cd10d70b00e","version":313,"action":"UPDATE"},{"gtasId":"9894930","tamrId":"35ef11e7-d1df-3b72-b77b-66c1cb182541","version":313,"action":"UPDATE"},{"gtasId":"7383941","tamrId":"e1c248f4-53eb-3db0-8878-f0c0b99590da","version":313,"action":"UPDATE"},{"gtasId":"21458275","tamrId":"aa4c103e-0a9b-376c-bc75-c8806bc37c7c","version":313,"action":"UPDATE"},{"gtasId":"11481288","tamrId":"06cbe998-31f5-305d-8fa3-756e35b708bc","version":313,"action":"UPDATE"},{"gtasId":"21182754","tamrId":"476bef3a-f381-3753-929b-02aa2a143b14","version":313,"action":"UPDATE"},{"gtasId":"16856324","tamrId":"9a86ef0c-bdab-3ca1-90d4-99f5422c4ec1","version":313,"action":"UPDATE"},{"gtasId":"23043842","tamrId":"2f97c1ec-17aa-357c-83d0-9ec8fd2a4104","version":313,"action":"UPDATE"},{"gtasId":"20217467","tamrId":"cf51d822-fe5c-3f0b-9ffd-e14f75d32cff","version":313,"action":"UPDATE"},{"gtasId":"11453527","tamrId":"8ca3f823-3302-3670-b928-2aa3991aaeb6","version":313,"action":"UPDATE"},{"gtasId":"20364041","tamrId":"f1b6ee58-5b03-3e7d-b269-ef3411968e51","version":313,"action":"UPDATE"},{"gtasId":"18082288","tamrId":"b64f9916-b6e0-3b32-8d03-e1b0c5a46a4c","version":313,"action":"UPDATE"},{"gtasId":"6025950","tamrId":"69cb65ca-2293-3fc7-acca-3a14ee1d6dfa","version":313,"action":"UPDATE"},{"gtasId":"7239126","tamrId":"4dd6de8c-4ec6-384b-9e4f-b74ac69831a9","version":313,"action":"UPDATE"},{"gtasId":"6208891","tamrId":"2552a798-61c3-3b18-8b0e-ae5a348eedfd","version":313,"action":"UPDATE"},{"gtasId":"16800360","tamrId":"30d2835d-05a0-30e1-9f22-7bd6a1698ce3","version":313,"action":"UPDATE"},{"gtasId":"24510879","tamrId":"0139d0ec-84e3-327b-a4df-da04b6331b24","version":313,"action":"UPDATE"},{"gtasId":"16950471","tamrId":"ae0c7eff-ef79-3e2d-9d8a-da9fbd2767fe","version":313,"action":"UPDATE"},{"gtasId":"6634184","tamrId":"b632bde6-a13e-3ec4-88e7-7afc98c4246e","version":313,"action":"UPDATE"},{"gtasId":"4305941","tamrId":"e50da3b7-6f35-33e6-b17a-3380fd445ce2","version":313,"action":"UPDATE"},{"gtasId":"8447158","tamrId":"cff4e69d-3170-339f-be17-bb82f772d1d5","version":313,"action":"UPDATE"},{"gtasId":"16334630","tamrId":"793fbede-07c9-30a7-b88b-82131cc7bd81","version":313,"action":"UPDATE"},{"gtasId":"3682164","tamrId":"08f51ce1-3003-3a6f-a33d-b16744615ae3","version":313,"action":"UPDATE"},{"gtasId":"1815357","tamrId":"ac7f5402-ff4a-32aa-8337-bb625954f8df","version":313,"action":"UPDATE"},{"gtasId":"2180180","tamrId":"0ed83ace-0341-3720-9eac-4e513fe75b74","version":313,"action":"UPDATE"},{"gtasId":"7681245","tamrId":"a3a7791c-86ca-3f34-a92e-cdc155749377","version":313,"action":"UPDATE"},{"gtasId":"18007427","tamrId":"057aab1a-a679-301b-85f6-5175abc2c8cf","version":313,"action":"UPDATE"},{"gtasId":"6211611","tamrId":"062318c8-f25d-3a36-9586-4637bd9c3569","version":313,"action":"UPDATE"},{"gtasId":"25367998","tamrId":"720b4dec-8b13-36cf-9c38-3be4e6b2e7fa","version":313,"action":"UPDATE"},{"gtasId":"20986616","tamrId":"1cbb0845-feab-300c-8ebf-66b3def76bf8","version":313,"action":"UPDATE"},{"gtasId":"12721640","tamrId":"efc83c69-f47b-3ae2-a0b4-bd7558fff1b4","version":313,"action":"UPDATE"},{"gtasId":"4463693","tamrId":"b00c5b16-3afd-3db3-a49f-5f483ea279db","version":313,"action":"UPDATE"},{"gtasId":"9967907","tamrId":"c1a7ee58-7d21-3250-8b3d-6a731a095c2f","version":313,"action":"UPDATE"},{"gtasId":"1965215","tamrId":"d16bf59b-d051-3904-8a59-c62100c6d6e1","version":313,"action":"UPDATE"},{"gtasId":"15542225","tamrId":"e8149040-4b90-31b8-921e-a8fa59de92a2","version":313,"action":"UPDATE"},{"gtasId":"6652850","tamrId":"3ecc7cff-6a14-3dd3-a622-b492205ee30e","version":313,"action":"UPDATE"},{"gtasId":"11729140","tamrId":"909a3ed9-c69e-3176-b1c5-6ebefbba2a83","version":313,"action":"UPDATE"},{"gtasId":"23808277","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"9916720","tamrId":"cac0848d-092d-3ab7-85d5-566f9047b98a","version":313,"action":"UPDATE"},{"gtasId":"12546101","tamrId":"1b9cd86c-3275-366a-b371-efa410e95740","version":313,"action":"UPDATE"},{"gtasId":"14342708","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"8049574","tamrId":"2a9a6f20-aeca-3d1e-bcd1-8f298e2dd3a9","version":313,"action":"UPDATE"},{"gtasId":"7982291","tamrId":"c6391cc4-66a9-361a-a3c5-02b2195c540f","version":313,"action":"UPDATE"},{"gtasId":"8412083","tamrId":"52a35224-3960-3834-b15d-5781735b3042","version":313,"action":"UPDATE"},{"gtasId":"1702256","tamrId":"d4828111-cfd8-3243-9077-777fc5df326f","version":313,"action":"UPDATE"},{"gtasId":"10709541","tamrId":"52a35224-3960-3834-b15d-5781735b3042","version":313,"action":"UPDATE"},{"gtasId":"6337594","tamrId":"13c688dd-49ec-37fc-8a6e-1fd3bc943aa8","version":313,"action":"UPDATE"},{"gtasId":"4626574","tamrId":"2b3f26da-1ea1-3bdb-88c2-c7edde4c696d","version":313,"action":"UPDATE"},{"gtasId":"12432687","tamrId":"a0c04fd2-055c-30bf-b25f-93ab6b8d32c0","version":313,"action":"UPDATE"},{"gtasId":"12536780","tamrId":"228f2abb-f45e-36f2-915f-698569a5efd7","version":313,"action":"UPDATE"},{"gtasId":"4923008","tamrId":"b99cd284-91cf-37e9-b968-526035ddbb34","version":313,"action":"UPDATE"},{"gtasId":"25448908","tamrId":"58dfb3f4-50d8-356e-ae33-7cd138c0fc64","version":313,"action":"UPDATE"},{"gtasId":"24036370","tamrId":"ba271e2b-4f1f-3d6b-907e-baf7638a82f8","version":313,"action":"UPDATE"},{"gtasId":"7526328","tamrId":"399abbc1-6b53-308c-9317-ac8b1dc2b7b5","version":313,"action":"UPDATE"},{"gtasId":"20888382","tamrId":"ca67679e-ee0e-3181-8690-5526cb5d00db","version":313,"action":"UPDATE"},{"gtasId":"16382340","tamrId":"39f83ccf-cc73-35db-99af-bef2b1ab0a2a","version":313,"action":"UPDATE"},{"gtasId":"22014167","tamrId":"e0aa7133-3b8b-31e7-b8f5-cf608e802eb6","version":313,"action":"UPDATE"},{"gtasId":"11097889","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"384988","tamrId":"d420532a-6ccf-3372-a46d-22c4bd66f333","version":313,"action":"UPDATE"},{"gtasId":"3472599","tamrId":"935b2155-0b40-3a05-b62e-eadda51a5de6","version":313,"action":"UPDATE"},{"gtasId":"8840222","tamrId":"9005a6d6-85af-3168-935e-05037e227574","version":313,"action":"UPDATE"},{"gtasId":"5815677","tamrId":"51c4b8a0-c0ea-31dc-a72d-d885b966f5c4","version":313,"action":"UPDATE"},{"gtasId":"2699418","tamrId":"5eec8a54-b026-338f-868c-3c79b8abd055","version":313,"action":"UPDATE"},{"gtasId":"7653671","tamrId":"0331f9dc-a03e-3761-bdf1-05fbac0cd552","version":313,"action":"UPDATE"},{"gtasId":"15951203","tamrId":"a87da9a9-20bc-30d7-aa86-7295135420bd","version":313,"action":"UPDATE"},{"gtasId":"12006241","tamrId":"4a408df1-9edd-352c-b2e9-0c005e2b3ed7","version":313,"action":"UPDATE"},{"gtasId":"8438120","tamrId":"668856fb-13d6-32f6-a129-86a1fe8f576c","version":313,"action":"UPDATE"},{"gtasId":"18312434","tamrId":"6fa68f69-7d18-310f-b499-296bd1b8566a","version":313,"action":"UPDATE"},{"gtasId":"19535872","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"6354928","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"8335363","tamrId":"0c0e8843-1c3d-35bd-a29e-6b136a89260b","version":313,"action":"UPDATE"},{"gtasId":"23082607","tamrId":"695e2d7f-6ff4-3fe8-bbf1-4a73c514b41d","version":313,"action":"UPDATE"},{"gtasId":"18229132","tamrId":"80b79c1e-188f-33a7-9890-d031b3644e80","version":313,"action":"UPDATE"},{"gtasId":"9650571","tamrId":"4f180398-86f5-372f-949b-59a7bd000364","version":313,"action":"UPDATE"},{"gtasId":"15365484","tamrId":"52a35224-3960-3834-b15d-5781735b3042","version":313,"action":"UPDATE"},{"gtasId":"6442208","tamrId":"96dc3889-bc69-373e-bb7a-23aeab807dc2","version":313,"action":"UPDATE"},{"gtasId":"18015534","tamrId":"fc9bb004-6917-368d-ac2d-8536feaf56ec","version":313,"action":"UPDATE"},{"gtasId":"8946501","tamrId":"4be2311b-dab6-3fa5-b559-9591eb6d1828","version":313,"action":"UPDATE"},{"gtasId":"586283","tamrId":"ece1e0d5-1d4e-3d4c-8fd6-1f19e8a1fea4","version":313,"action":"UPDATE"},{"gtasId":"1922575","tamrId":"0571f45e-ccdd-3a87-95ca-8b94e95b7ff9","version":313,"action":"UPDATE"},{"gtasId":"3714684","tamrId":"33c08b0a-36ef-3530-913d-fcb4a1e53e18","version":313,"action":"UPDATE"},{"gtasId":"4440048","tamrId":"2d5516d5-e9cc-3120-8998-c29e96454fb3","version":313,"action":"UPDATE"},{"gtasId":"8234798","tamrId":"35c3a94b-1cc7-379d-bd80-0e609ecbceac","version":313,"action":"UPDATE"},{"gtasId":"3887781","tamrId":"bc166067-e142-38ee-8dda-61be33834502","version":313,"action":"UPDATE"},{"gtasId":"18592813","tamrId":"74c3ccf0-9a8c-32b0-81b7-e3ed4b5b13c4","version":313,"action":"UPDATE"},{"gtasId":"10866294","tamrId":"55e94110-e099-3b26-9289-17128303e3cf","version":313,"action":"UPDATE"},{"gtasId":"4435930","tamrId":"ec84f4f9-c27f-34a6-9c73-0e21790aa24b","version":313,"action":"UPDATE"},{"gtasId":"1361229","tamrId":"df8a4c3f-d75f-3ae9-b268-c20863eef05c","version":313,"action":"UPDATE"},{"gtasId":"10731388","tamrId":"f03d0ee0-db5a-3a08-8053-321e7f3a5098","version":313,"action":"UPDATE"},{"gtasId":"24750891","tamrId":"f2e03531-6beb-350d-b609-ceb0a376900b","version":313,"action":"UPDATE"},{"gtasId":"6886498","tamrId":"6f9d0725-86eb-3742-a86c-02047d7a00c7","version":313,"action":"UPDATE"},{"gtasId":"919594","tamrId":"2f9b84a7-2ff6-394e-9efa-32cf0c94526e","version":313,"action":"UPDATE"},{"gtasId":"12366749","tamrId":"5e2351b4-12d2-3e9e-908d-84a8a4063f3d","version":313,"action":"UPDATE"},{"gtasId":"9089552","tamrId":"502f82fa-4a85-39b6-be90-00301cfab0a2","version":313,"action":"UPDATE"},{"gtasId":"10685043","tamrId":"71ab6a9b-0824-324a-9900-a040a6254df7","version":313,"action":"UPDATE"},{"gtasId":"130467","tamrId":"86929939-627f-30e9-a5f8-05850d5e85a6","version":313,"action":"UPDATE"},{"gtasId":"7995570","tamrId":"a1461e0b-0b48-3f1c-b691-4f51ef8a2eb3","version":313,"action":"UPDATE"},{"gtasId":"2972455","tamrId":"4c3fed93-c1ce-365f-bb8c-23c8df9664a4","version":313,"action":"UPDATE"},{"gtasId":"14946348","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"8888660","tamrId":"8da150b3-4448-3fbf-af40-ba2d932a64cb","version":313,"action":"UPDATE"},{"gtasId":"11656578","tamrId":"5baf259b-b280-3150-820b-5eff763c33f7","version":313,"action":"UPDATE"},{"gtasId":"3884288","tamrId":"dd6b5745-3373-3199-8a04-dfe0c5e26ee5","version":313,"action":"UPDATE"},{"gtasId":"9894888","tamrId":"91382ad5-b75f-3079-a16d-efe0d81dc784","version":313,"action":"UPDATE"},{"gtasId":"11678339","tamrId":"7b8c497c-8ba8-3ebe-8469-e474fc6b0125","version":313,"action":"UPDATE"},{"gtasId":"14018208","tamrId":"2bfa9f55-628d-37ec-9b2f-946ab61fff76","version":313,"action":"UPDATE"},{"gtasId":"18541307","tamrId":"3cbb7f7d-8d64-383b-a9ab-262494d0b30e","version":313,"action":"UPDATE"},{"gtasId":"2892344","tamrId":"d4ed2860-98a1-37a2-be21-1a3b8f115c90","version":313,"action":"UPDATE"},{"gtasId":"1289073","tamrId":"c3cddd01-f731-3625-8436-9db6879bcbeb","version":313,"action":"UPDATE"},{"gtasId":"10419285","tamrId":"4110f236-15b1-3b06-bbbc-fcb8241ad38d","version":313,"action":"UPDATE"},{"gtasId":"25213552","tamrId":"0c147da8-e5d1-3ef5-a06d-7bf577574420","version":313,"action":"UPDATE"},{"gtasId":"4339787","tamrId":"2919e78b-a2a6-31c7-a3c4-0a56b0de25bb","version":313,"action":"UPDATE"},{"gtasId":"14675610","tamrId":"34cdc63e-3583-33d7-8d43-0d85567e934d","version":313,"action":"UPDATE"},{"gtasId":"163315","tamrId":"a0638854-c6fd-3383-bb0a-e0eec60c5a1e","version":313,"action":"UPDATE"},{"gtasId":"1054921","tamrId":"89c65330-afb5-339f-87be-4b13bca7b345","version":313,"action":"UPDATE"},{"gtasId":"17479359","tamrId":"02791ace-5f35-3184-8d7b-dab06d5a5406","version":313,"action":"UPDATE"},{"gtasId":"24165453","tamrId":"29871d90-f451-3e9d-a6d1-40a36a26ddae","version":313,"action":"UPDATE"},{"gtasId":"10136643","tamrId":"c661038b-2139-3da6-af1a-9d116f4443ab","version":313,"action":"UPDATE"},{"gtasId":"10355218","tamrId":"0ac5cdb1-036c-3dad-932b-2368ff935b48","version":313,"action":"UPDATE"},{"gtasId":"11897777","tamrId":"9c122cec-fe0e-35e8-97a4-eb9e6597b116","version":313,"action":"UPDATE"},{"gtasId":"1016655","tamrId":"5d8e8dbc-907e-3445-9f60-5e55b6e84d7b","version":313,"action":"UPDATE"},{"gtasId":"23044770","tamrId":"374fa004-d6ac-380a-a64f-9f87e35ec90d","version":313,"action":"UPDATE"},{"gtasId":"406419","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"4305537","tamrId":"3d42593f-3be4-3d4b-a7f7-a3cefa289708","version":313,"action":"UPDATE"},{"gtasId":"8949195","tamrId":"6e3597b5-4fd8-30f2-a4bd-ac7a13ae88d7","version":313,"action":"UPDATE"},{"gtasId":"16523904","tamrId":"b883e829-939f-380f-97b8-98da705a43ac","version":313,"action":"UPDATE"},{"gtasId":"7695039","tamrId":"db31132e-f1f0-394d-a377-683608001cdf","version":313,"action":"UPDATE"},{"gtasId":"4521081","tamrId":"355f8617-cee2-32a7-9f6d-6efe0b80fa98","version":313,"action":"UPDATE"},{"gtasId":"5676315","tamrId":"9711e23e-f8a2-361c-94f9-d929af60f4f7","version":313,"action":"UPDATE"},{"gtasId":"12940634","tamrId":"48a3eeb2-24b2-32ca-9f50-e0843e0a4a0c","version":313,"action":"UPDATE"},{"gtasId":"25197806","tamrId":"228f2abb-f45e-36f2-915f-698569a5efd7","version":313,"action":"UPDATE"},{"gtasId":"7322557","tamrId":"7bbbc9b0-dc72-3da2-8b3b-e5a74e4cb510","version":313,"action":"UPDATE"},{"gtasId":"8979864","tamrId":"527dcc59-76d3-3e4d-b6bc-4b6640c5d4eb","version":313,"action":"UPDATE"},{"gtasId":"9459994","tamrId":"85b0722f-0fb1-319f-b36e-4f13ae98ee5b","version":313,"action":"UPDATE"},{"gtasId":"18029704","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"24745024","tamrId":"df8dda68-ae84-3424-b4b5-742a3bfdaadf","version":313,"action":"UPDATE"},{"gtasId":"174436","tamrId":"ee87b1b5-b5be-3047-9258-1491d473cdf7","version":313,"action":"UPDATE"},{"gtasId":"3822821","tamrId":"a43247c1-c9b2-3721-a82d-bd5d43351671","version":313,"action":"UPDATE"},{"gtasId":"22359429","tamrId":"c938d37b-012f-32b2-a792-16f1a0f7b02b","version":313,"action":"UPDATE"},{"gtasId":"11074313","tamrId":"52a35224-3960-3834-b15d-5781735b3042","version":313,"action":"UPDATE"},{"gtasId":"10297779","tamrId":"5ecaba9c-b016-3d44-887a-bf018411f105","version":313,"action":"UPDATE"},{"gtasId":"16357338","tamrId":"9fe83c61-5f59-32d3-91a2-437fcc68d316","version":313,"action":"UPDATE"},{"gtasId":"6178250","tamrId":"13c688dd-49ec-37fc-8a6e-1fd3bc943aa8","version":313,"action":"UPDATE"},{"gtasId":"14430472","tamrId":"50de1fcb-d4e5-3524-b7ec-3ebff691ec08","version":313,"action":"UPDATE"},{"gtasId":"11129429","tamrId":"1ec71663-2bd8-3bc3-8f47-817188d197bf","version":313,"action":"UPDATE"},{"gtasId":"17883984","tamrId":"28666a87-af3f-302b-98db-06c4230926fb","version":313,"action":"UPDATE"},{"gtasId":"23707147","tamrId":"f3c91a83-6624-3e86-9dea-868283a231c1","version":313,"action":"UPDATE"},{"gtasId":"8371427","tamrId":"eaf52192-6f71-3722-9ee5-b851c412cef3","version":313,"action":"UPDATE"},{"gtasId":"75665","tamrId":"6085ca1d-9fbe-3b2f-a273-184c027e8739","version":313,"action":"UPDATE"},{"gtasId":"10913049","tamrId":"76b44f21-fcb9-3ac5-adfa-ffe98bda3fa8","version":313,"action":"UPDATE"},{"gtasId":"2762396","tamrId":"0ac5cdb1-036c-3dad-932b-2368ff935b48","version":313,"action":"UPDATE"},{"gtasId":"12154041","tamrId":"2d728ce3-945a-38fe-8afa-23904657e0fa","version":313,"action":"UPDATE"},{"gtasId":"25442389","tamrId":"72568d63-cda7-37ee-b11b-f5d03b627a8c","version":313,"action":"UPDATE"},{"gtasId":"18784758","tamrId":"73d996d3-246e-34e6-8007-ebdb16978909","version":313,"action":"UPDATE"},{"gtasId":"4537431","tamrId":"fc3fb4bd-5f27-3a56-b4bc-a8445ccf9f30","version":313,"action":"UPDATE"},{"gtasId":"9479130","tamrId":"9b980adc-cb1d-340e-9080-11d7b85c9f23","version":313,"action":"UPDATE"},{"gtasId":"10896414","tamrId":"a13b5c26-b18d-3024-8ada-7ff386ef8af4","version":313,"action":"UPDATE"},{"gtasId":"3818328","tamrId":"543995e1-d365-3975-85ad-c9aa57b8b582","version":313,"action":"UPDATE"},{"gtasId":"8152402","tamrId":"66c726c7-6907-384c-bc16-d0d409006c89","version":313,"action":"UPDATE"},{"gtasId":"13316073","tamrId":"e06e763b-00fd-3cf9-a176-d9f2f57dc21d","version":313,"action":"UPDATE"},{"gtasId":"16703342","tamrId":"6c52345e-86dc-32df-b632-a727c93e671a","version":313,"action":"UPDATE"},{"gtasId":"22890610","tamrId":"5814c1e0-7bed-358a-b0b2-acf946704cb3","version":313,"action":"UPDATE"},{"gtasId":"9745782","tamrId":"db9e0625-2ee5-3064-8b94-e0e6a10b43a0","version":313,"action":"UPDATE"},{"gtasId":"7676759","tamrId":"a7898076-602d-3c50-ac74-3dcaa4635706","version":313,"action":"UPDATE"},{"gtasId":"1922127","tamrId":"3bae8959-962f-35f1-9bf3-0e5139dd2557","version":313,"action":"UPDATE"},{"gtasId":"6871821","tamrId":"8c113020-bbab-3f54-b3e3-1026e3e6b4b4","version":313,"action":"UPDATE"},{"gtasId":"11095258","tamrId":"9f5b1beb-3181-30d3-b494-cf6f15c3f396","version":313,"action":"UPDATE"},{"gtasId":"19721521","tamrId":"d33f72d8-23e0-3764-852a-2bdba88a5428","version":313,"action":"UPDATE"},{"gtasId":"5277012","tamrId":"d60ab619-1400-3276-8e12-d1475054048a","version":313,"action":"UPDATE"},{"gtasId":"9960436","tamrId":"e02ba294-5f93-3fd3-bf77-b06a5b283ae4","version":313,"action":"UPDATE"},{"gtasId":"18389372","tamrId":"7da718a6-ef7d-3169-a390-bbdfad12ce4a","version":313,"action":"UPDATE"},{"gtasId":"25470848","tamrId":"3c5a17fa-83bd-3174-ae2b-26f586726755","version":313,"action":"UPDATE"},{"gtasId":"17233298","tamrId":"0f3c47aa-b6b5-373f-8637-d96dfa07ecea","version":313,"action":"UPDATE"},{"gtasId":"2939459","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"2804604","tamrId":"f11f1a52-a539-3f63-b54b-50bb28316bca","version":313,"action":"UPDATE"},{"gtasId":"18369785","tamrId":"42723538-bfe0-3f9a-b266-9a760e7973f3","version":313,"action":"UPDATE"},{"gtasId":"16802115","tamrId":"0aaddc67-b5db-307c-86e8-afb84de6b8a5","version":313,"action":"UPDATE"},{"gtasId":"11895565","tamrId":"809753f2-0acb-36c4-a6c1-a88c492d095c","version":313,"action":"UPDATE"},{"gtasId":"20647059","tamrId":"31e0a2a2-24a6-3859-a3c5-9c867bb284d1","version":313,"action":"UPDATE"},{"gtasId":"13358245","tamrId":"1c0af88b-45db-3d73-b850-0681bf66f0a8","version":313,"action":"UPDATE"},{"gtasId":"22015461","tamrId":"6215caea-bc74-3aeb-80fc-e340f67794b2","version":313,"action":"UPDATE"},{"gtasId":"16291143","tamrId":"e921deea-801d-386c-8916-4cd8fbffe789","version":313,"action":"UPDATE"},{"gtasId":"5289461","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"4525473","tamrId":"0f60498e-a19c-362e-86ea-d584718e16fa","version":313,"action":"UPDATE"},{"gtasId":"16292824","tamrId":"8ca1457d-8aa3-34d5-b50e-15658ea5282f","version":313,"action":"UPDATE"},{"gtasId":"5516179","tamrId":"c7794bf0-ca48-3d6d-9445-820d44f9873a","version":313,"action":"UPDATE"},{"gtasId":"16926724","tamrId":"b6ff05fd-a056-3c64-811e-103eb01984b6","version":313,"action":"UPDATE"},{"gtasId":"9186617","tamrId":"0c0e8843-1c3d-35bd-a29e-6b136a89260b","version":313,"action":"UPDATE"},{"gtasId":"18540868","tamrId":"4decfa2e-8000-3ec8-be84-4d2466a29076","version":313,"action":"UPDATE"},{"gtasId":"5016651","tamrId":"a4b3084a-ccfe-3964-bc09-f7a852eaae6b","version":313,"action":"UPDATE"},{"gtasId":"13514566","tamrId":"44a35110-af58-3a8c-b906-81d70a91a5d4","version":313,"action":"UPDATE"},{"gtasId":"24592784","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"13381023","tamrId":"db17d2a7-a4a0-30a2-8ecf-6d330aed947b","version":313,"action":"UPDATE"},{"gtasId":"6670628","tamrId":"588e3e09-1641-3ab2-b514-ace828b7445f","version":313,"action":"UPDATE"},{"gtasId":"9152050","tamrId":"65e89f4b-cafe-31fc-8d84-f2cb3cf582c5","version":313,"action":"UPDATE"},{"gtasId":"9903817","tamrId":"55894354-b600-379c-8559-fa6c8ae3ba1d","version":313,"action":"UPDATE"},{"gtasId":"13958731","tamrId":"edf0e91b-65cd-325a-add1-ac5f955bcb75","version":313,"action":"UPDATE"},{"gtasId":"17772713","tamrId":"3092bfa6-4642-37fa-a146-f772172842b7","version":313,"action":"UPDATE"},{"gtasId":"19141572","tamrId":"181d2474-03d3-39fd-b6f4-a1766b81601c","version":313,"action":"UPDATE"},{"gtasId":"8158600","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"14039507","tamrId":"3dced97d-fc41-3e0b-ab06-7408c51c8a03","version":313,"action":"UPDATE"},{"gtasId":"6711135","tamrId":"e8ae9caa-63f1-3750-bc3e-5a295b40af4b","version":313,"action":"UPDATE"},{"gtasId":"9778224","tamrId":"764d6bff-b782-3fd6-b1d9-7c3bc45b1256","version":313,"action":"UPDATE"},{"gtasId":"7407908","tamrId":"a0e858e3-5e93-3369-a6aa-4acd30b1d7cd","version":313,"action":"UPDATE"},{"gtasId":"21741939","tamrId":"df2b6ff9-8272-338e-b0f5-c8d81b45b6eb","version":313,"action":"UPDATE"},{"gtasId":"19518","tamrId":"a3a61ce3-8363-3125-a114-2210bd326977","version":313,"action":"UPDATE"},{"gtasId":"9054050","tamrId":"121f7d07-5b1a-3b53-abfe-ac4b0b411b64","version":313,"action":"UPDATE"},{"gtasId":"14060579","tamrId":"58d66131-9d03-3fcc-bd75-dde9740795a5","version":313,"action":"UPDATE"},{"gtasId":"14106342","tamrId":"f0e4255e-5bad-3b97-ab43-59f3ca6bf376","version":313,"action":"UPDATE"},{"gtasId":"15117448","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"8957241","tamrId":"693628fb-7e70-33cf-a62e-ced55c9b669c","version":313,"action":"UPDATE"},{"gtasId":"19815044","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"23340890","tamrId":"b5a582bb-0b95-3644-bf06-b083ebedee7a","version":313,"action":"UPDATE"},{"gtasId":"12433158","tamrId":"24cdfaaf-3758-3000-8bd7-261b06c43091","version":313,"action":"UPDATE"},{"gtasId":"21142317","tamrId":"3c848e3a-01e6-343a-8b3f-cbe77ca5c035","version":313,"action":"UPDATE"},{"gtasId":"15257629","tamrId":"1cdd7c04-05bd-31ac-aaf5-a29daa9a11f5","version":313,"action":"UPDATE"},{"gtasId":"20587814","tamrId":"d9bf2be7-3428-367a-9f53-eb58fb7155c8","version":313,"action":"UPDATE"},{"gtasId":"12907199","tamrId":"02a333b8-958c-3a5d-9fac-975cdb030570","version":313,"action":"UPDATE"},{"gtasId":"24813135","tamrId":"2ab9b9bd-a75d-3fe3-b4d4-c152ea3c84b9","version":313,"action":"UPDATE"},{"gtasId":"21166760","tamrId":"1866d1ab-735a-376d-bd99-b50908b87e8a","version":313,"action":"UPDATE"},{"gtasId":"1069170","tamrId":"a5347399-d966-3d29-ae48-869ab01d2bf2","version":313,"action":"UPDATE"},{"gtasId":"7943090","tamrId":"9751b1a9-e3ee-3f41-9db3-0b137fc04afa","version":313,"action":"UPDATE"},{"gtasId":"3869970","tamrId":"b80c439d-0913-39b1-9f60-8d01564ffd48","version":313,"action":"UPDATE"},{"gtasId":"13352976","tamrId":"8eca8e71-a61f-3e2e-aa50-c0343b143dd5","version":313,"action":"UPDATE"},{"gtasId":"8014425","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"1136419","tamrId":"f0ecde55-1a07-301c-964b-8361da7ff218","version":313,"action":"UPDATE"},{"gtasId":"18842634","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"9222338","tamrId":"3eaf5b28-71a5-3e39-b50f-39309d444d43","version":313,"action":"UPDATE"},{"gtasId":"14198469","tamrId":"758befc7-d928-34c0-924d-502aff3ddd4e","version":313,"action":"UPDATE"},{"gtasId":"343687","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"25123177","tamrId":"6ba8082c-379e-3bb7-9de9-78be660a7975","version":313,"action":"UPDATE"},{"gtasId":"8527236","tamrId":"fe3e7594-b5a9-32a5-b0af-020ece4cf459","version":313,"action":"UPDATE"},{"gtasId":"20422785","tamrId":"a16e5699-7e8e-3723-93d4-c68049844916","version":313,"action":"UPDATE"},{"gtasId":"24292722","tamrId":"0bf4651e-5c2b-35b0-ae69-56f7d38bbcaf","version":313,"action":"UPDATE"},{"gtasId":"5606057","tamrId":"995c15a8-0a15-3ad6-8e3f-ebd69522fd12","version":313,"action":"UPDATE"},{"gtasId":"8865557","tamrId":"a3241d42-0184-351c-bbe7-6e879d11aae8","version":313,"action":"UPDATE"},{"gtasId":"5168869","tamrId":"a096f5de-eab1-30e7-b7aa-d91898da73f0","version":313,"action":"UPDATE"},{"gtasId":"5538320","tamrId":"3b153963-1c97-35f2-82ef-653858dcfe2e","version":313,"action":"UPDATE"},{"gtasId":"4124830","tamrId":"0ddf06fc-fd81-3b03-bb78-d904edbdecc1","version":313,"action":"UPDATE"},{"gtasId":"2190316","tamrId":"2f4b9f0d-d421-3c9b-aa7c-02a469534b68","version":313,"action":"UPDATE"},{"gtasId":"11658717","tamrId":"2216f83a-4d1c-3235-ba0b-f48a3792cc7c","version":313,"action":"UPDATE"},{"gtasId":"983778","tamrId":"10540c67-c09c-370d-895b-d8aa922c351f","version":313,"action":"UPDATE"},{"gtasId":"12520828","tamrId":"1866d1ab-735a-376d-bd99-b50908b87e8a","version":313,"action":"UPDATE"},{"gtasId":"3618098","tamrId":"1c8750e1-d232-3985-8703-5fe1740897c2","version":313,"action":"UPDATE"},{"gtasId":"20776197","tamrId":"11dadb2e-c125-32f9-92f3-a7d23665aa4a","version":313,"action":"UPDATE"},{"gtasId":"1401345","tamrId":"1866d1ab-735a-376d-bd99-b50908b87e8a","version":313,"action":"UPDATE"},{"gtasId":"16409444","tamrId":"58d69fb6-986a-339a-9e6d-9a71eae17805","version":313,"action":"UPDATE"},{"gtasId":"1041693","tamrId":"b27a3ee1-aa1f-3f8b-8b35-aed1946c322b","version":313,"action":"UPDATE"},{"gtasId":"19661464","tamrId":"0d04771d-6d64-3740-ac81-96e04dc6501e","version":313,"action":"UPDATE"},{"gtasId":"4307319","tamrId":"a74bfb07-c277-31d6-b849-d1017b700013","version":313,"action":"UPDATE"},{"gtasId":"15019911","tamrId":"b51ddcf3-2f58-3a3d-9e2a-35870cfc4518","version":313,"action":"UPDATE"},{"gtasId":"21202845","tamrId":"3b87bfd9-b48b-3704-9677-dd8232078f8e","version":313,"action":"UPDATE"},{"gtasId":"7921250","tamrId":"395041e4-e0a5-3004-ace4-a466d5736265","version":313,"action":"UPDATE"},{"gtasId":"971784","tamrId":"7269e51b-cde2-3b65-b399-9531952c88ff","version":313,"action":"UPDATE"},{"gtasId":"133992","tamrId":"b367f687-09e8-30f0-b6dc-2c18c50794ab","version":313,"action":"UPDATE"},{"gtasId":"13454481","tamrId":"4be6d444-5341-3d60-b2a1-ad0b024f4ba7","version":313,"action":"UPDATE"},{"gtasId":"10028867","tamrId":"c1e65735-cd44-3cc3-94b7-23ab1e225c43","version":313,"action":"UPDATE"},{"gtasId":"15079157","tamrId":"fbf98a3f-d557-3329-9eef-25cff0bcc393","version":313,"action":"UPDATE"},{"gtasId":"17452284","tamrId":"26d5b24c-5310-3bf6-9553-3cefb79fa020","version":313,"action":"UPDATE"},{"gtasId":"10226566","tamrId":"89352644-0d20-320b-beb7-03cea586d3aa","version":313,"action":"UPDATE"},{"gtasId":"14361495","tamrId":"55b0f7cb-b86b-3d3d-b19a-a6fcc40d8ff5","version":313,"action":"UPDATE"},{"gtasId":"14766087","tamrId":"83cc522b-c342-3ab0-8231-bb92ee9b0edf","version":313,"action":"UPDATE"},{"gtasId":"13457509","tamrId":"ac980c48-cfd4-37cc-bfe5-4c5f4cc357c8","version":313,"action":"UPDATE"},{"gtasId":"823987","tamrId":"80666a5e-b18e-33d2-84cb-08b8d463cfb3","version":313,"action":"UPDATE"},{"gtasId":"18263098","tamrId":"69cb65ca-2293-3fc7-acca-3a14ee1d6dfa","version":313,"action":"UPDATE"},{"gtasId":"16723368","tamrId":"6ea2d28e-8abe-39c0-8f12-5e0115f905a8","version":313,"action":"UPDATE"},{"gtasId":"15782503","tamrId":"9bb3e156-5b91-33d4-aad5-bfe07f5e48b9","version":313,"action":"UPDATE"},{"gtasId":"19139684","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"16762909","tamrId":"52a35224-3960-3834-b15d-5781735b3042","version":313,"action":"UPDATE"},{"gtasId":"1541100","tamrId":"596a9085-c038-3db7-a861-d3bfdb73dfe0","version":313,"action":"UPDATE"},{"gtasId":"478010","tamrId":"6cfaf736-49ef-3657-996a-676fa502db2e","version":313,"action":"UPDATE"},{"gtasId":"6594493","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"1833544","tamrId":"8d1a66dc-aa8f-30dd-a595-378161b6aede","version":313,"action":"UPDATE"},{"gtasId":"11561346","tamrId":"bf53f35a-6d3d-3ca3-8daa-8c34c665270f","version":313,"action":"UPDATE"},{"gtasId":"8184051","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"14523079","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"8767154","tamrId":"c684a642-7ac2-38f2-98ca-bdb330743979","version":313,"action":"UPDATE"},{"gtasId":"11691729","tamrId":"f1843e1c-42b7-3019-864a-ed6ba769ce87","version":313,"action":"UPDATE"},{"gtasId":"18735787","tamrId":"2bc9ced7-1dca-31c5-9422-7975592addbe","version":313,"action":"UPDATE"},{"gtasId":"1254802","tamrId":"694fc030-dc87-3735-b16a-bac35585ae33","version":313,"action":"UPDATE"},{"gtasId":"24159167","tamrId":"4ff3087b-297e-3e19-ab3b-fe5ebec1a6cb","version":313,"action":"UPDATE"},{"gtasId":"2180502","tamrId":"d5d936bd-1bb6-3b1e-9063-a6809f6a2908","version":313,"action":"UPDATE"},{"gtasId":"8339341","tamrId":"96217e21-0e94-34fe-b1ae-4d32540e96df","version":313,"action":"UPDATE"},{"gtasId":"8822819","tamrId":"f4334d25-b4d0-3a2a-ab88-35ef11e78aab","version":313,"action":"UPDATE"},{"gtasId":"8784958","tamrId":"3e5c2c2d-0dd5-39ed-bd02-c082b47abe21","version":313,"action":"UPDATE"},{"gtasId":"17198866","tamrId":"335e0e36-3381-32b6-b251-8d0af4b8ebcf","version":313,"action":"UPDATE"},{"gtasId":"6644790","tamrId":"25e96757-66de-3ad4-af3e-7fb00e31e44d","version":313,"action":"UPDATE"},{"gtasId":"9156813","tamrId":"723c08c9-530a-320e-94c0-5ed42bbf6cb1","version":313,"action":"UPDATE"},{"gtasId":"17259828","tamrId":"523981b1-6987-38ce-9610-ac7ee5ec2efd","version":313,"action":"UPDATE"},{"gtasId":"12503021","tamrId":"295ae3ef-177d-382f-81aa-69c583281dc4","version":313,"action":"UPDATE"},{"gtasId":"19987221","tamrId":"f2e9e0de-46de-3195-9e34-2fea91a4971c","version":313,"action":"UPDATE"},{"gtasId":"6281576","tamrId":"8bc70477-e99e-3c27-877b-a08095928216","version":313,"action":"UPDATE"},{"gtasId":"361059","tamrId":"a75ea634-654b-36fb-83b8-e50689e50551","version":313,"action":"UPDATE"},{"gtasId":"16526544","tamrId":"f4bd1974-4248-3d7e-b5b3-21aade0ec152","version":313,"action":"UPDATE"},{"gtasId":"18945879","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"22660076","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"5464094","tamrId":"e95b41b1-a807-3af9-93ca-4f69e2e064cd","version":313,"action":"UPDATE"},{"gtasId":"23463260","tamrId":"b05d2ee9-3744-356d-8a51-d4c3fd482c40","version":313,"action":"UPDATE"},{"gtasId":"5561590","tamrId":"30ed40ba-6a1c-3d74-a81e-48e274418a46","version":313,"action":"UPDATE"},{"gtasId":"1459553","tamrId":"603fa494-ff22-325f-a0bb-2893ffbbd76e","version":313,"action":"UPDATE"},{"gtasId":"1755223","tamrId":"992d4875-8e78-3c67-a05f-2087eff474c7","version":313,"action":"UPDATE"},{"gtasId":"7987183","tamrId":"5d984ec0-fdcf-3c2d-b218-053b0bae62ac","version":313,"action":"UPDATE"},{"gtasId":"15209492","tamrId":"31ec0039-de8b-3b5f-945a-46f27eebf006","version":313,"action":"UPDATE"},{"gtasId":"15922437","tamrId":"219a5434-04db-3b8d-af12-d6c944392dd2","version":313,"action":"UPDATE"},{"gtasId":"22450956","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"8094942","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"20793440","tamrId":"4b829bb1-49b2-37d9-8f57-81381907e8f5","version":313,"action":"UPDATE"},{"gtasId":"14240483","tamrId":"e572531f-2852-3b5b-bddf-299382039037","version":313,"action":"UPDATE"},{"gtasId":"97196","tamrId":"c01cdbc7-eadb-35a8-b552-3f1300422cf5","version":313,"action":"UPDATE"},{"gtasId":"12533943","tamrId":"9f00e611-dad0-3d5f-a9fb-2501a7a75d7c","version":313,"action":"UPDATE"},{"gtasId":"6594391","tamrId":"414bc60a-933b-3436-ab82-51eb0cf3a532","version":313,"action":"UPDATE"},{"gtasId":"10783357","tamrId":"1356f31a-2de9-3708-ae46-20442bd42e63","version":313,"action":"UPDATE"},{"gtasId":"9544854","tamrId":"808ca685-6078-3e33-bddb-44c8ca19f015","version":313,"action":"UPDATE"},{"gtasId":"25083683","tamrId":"3ff60b7a-e7a4-388a-8841-f9181326977d","version":313,"action":"UPDATE"},{"gtasId":"11907911","tamrId":"54ae66bb-b033-3108-a9d5-9a5ad0c896fc","version":313,"action":"UPDATE"},{"gtasId":"23727413","tamrId":"719d7a64-690a-350e-bfec-bc389514b09b","version":313,"action":"UPDATE"},{"gtasId":"2051552","tamrId":"8cceab42-a099-351e-8ae2-03333c314708","version":313,"action":"UPDATE"},{"gtasId":"21890426","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"13096174","tamrId":"081f5e1f-3df8-3f32-8f61-d74b387b7e75","version":313,"action":"UPDATE"},{"gtasId":"1140839","tamrId":"795ccb26-ca76-3c08-ad7d-f915a14ed33d","version":313,"action":"UPDATE"},{"gtasId":"9503054","tamrId":"8784baba-70e0-37c6-8ddd-b9f557b7132b","version":313,"action":"UPDATE"},{"gtasId":"15410942","tamrId":"3fa2dd47-de0c-357b-80c8-194277ab48ca","version":313,"action":"UPDATE"},{"gtasId":"11454378","tamrId":"ed90f4a3-5045-3741-a8f5-48d55cafb359","version":313,"action":"UPDATE"},{"gtasId":"18811895","tamrId":"02fa84c2-54c3-353b-a8e7-ee429c4f2512","version":313,"action":"UPDATE"},{"gtasId":"24120061","tamrId":"49c135d1-f67c-3ebd-838c-15a82797ed61","version":313,"action":"UPDATE"},{"gtasId":"11936006","tamrId":"ee44b989-364f-3d60-a490-bbc99946b70f","version":313,"action":"UPDATE"},{"gtasId":"21899252","tamrId":"a30b299a-8a9f-3abc-b7ed-d67c67fe476e","version":313,"action":"UPDATE"},{"gtasId":"6194243","tamrId":"5f3a4328-4a1a-3a96-ad3f-5385ce020b77","version":313,"action":"UPDATE"},{"gtasId":"3787359","tamrId":"362b13f6-f999-336e-8329-42764bd348d2","version":313,"action":"UPDATE"},{"gtasId":"5398404","tamrId":"c01cdbc7-eadb-35a8-b552-3f1300422cf5","version":313,"action":"UPDATE"},{"gtasId":"20037754","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"22480373","tamrId":"3090d6e0-6376-3e7c-90b6-56c1efd3d2d0","version":313,"action":"UPDATE"},{"gtasId":"2645473","tamrId":"9fd80787-d1b1-379a-89f9-d1f64828b989","version":313,"action":"UPDATE"},{"gtasId":"15774400","tamrId":"89085081-88f5-3fe9-a605-bdf111393061","version":313,"action":"UPDATE"},{"gtasId":"13098361","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"7667266","tamrId":"61c6052a-1981-3cc5-8953-09175cc85dfd","version":313,"action":"UPDATE"},{"gtasId":"283591","tamrId":"040b2d86-fe9a-364b-8470-3f6455300431","version":313,"action":"UPDATE"},{"gtasId":"18682134","tamrId":"5ec2b750-0b58-38d4-9364-aa3c6a4ff9d6","version":313,"action":"UPDATE"},{"gtasId":"6998445","tamrId":"04fd541f-6d61-3ed5-927b-ad5033b88bfb","version":313,"action":"UPDATE"},{"gtasId":"7925710","tamrId":"a8f30300-3a42-35b9-9cdf-d4113025912d","version":313,"action":"UPDATE"},{"gtasId":"8252781","tamrId":"8640fe97-314d-3f72-873c-dd7be440f6eb","version":313,"action":"UPDATE"},{"gtasId":"12474622","tamrId":"da0a4695-aff0-3363-af86-1bc1df88523d","version":313,"action":"UPDATE"},{"gtasId":"10255390","tamrId":"f5966f98-61ce-39e7-8d65-5569a356ee50","version":313,"action":"UPDATE"},{"gtasId":"21524","tamrId":"b7bdb934-f676-3b69-bc7e-8c35ec8414bd","version":313,"action":"UPDATE"},{"gtasId":"20379448","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"4623721","tamrId":"a248dd21-82a7-3ba9-8be1-15f731b0ec73","version":313,"action":"UPDATE"},{"gtasId":"22515105","tamrId":"6759e6ea-f8aa-3618-a5bf-ce0aed225587","version":313,"action":"UPDATE"},{"gtasId":"6447305","tamrId":"5b7e5d80-43af-340d-bc37-534257352a6d","version":313,"action":"UPDATE"},{"gtasId":"18516811","tamrId":"d933fc89-c800-3783-a829-4bc1ea0828c0","version":313,"action":"UPDATE"},{"gtasId":"6123074","tamrId":"35c3a94b-1cc7-379d-bd80-0e609ecbceac","version":313,"action":"UPDATE"},{"gtasId":"846337","tamrId":"00508bb4-d1a8-3dbb-ad5d-5c62ea2ce7e7","version":313,"action":"UPDATE"},{"gtasId":"8167199","tamrId":"342304b0-5249-3037-b232-a3c9ee1fecbb","version":313,"action":"UPDATE"},{"gtasId":"16949315","tamrId":"3c5807aa-d389-3c93-a137-1bd95244fea0","version":313,"action":"UPDATE"},{"gtasId":"10196089","tamrId":"b53c2ea2-4bd1-3484-a757-091bf623b5ca","version":313,"action":"UPDATE"},{"gtasId":"14323762","tamrId":"f6ebbe39-975d-33b6-a4b9-74971af7e759","version":313,"action":"UPDATE"},{"gtasId":"3042016","tamrId":"e02ba294-5f93-3fd3-bf77-b06a5b283ae4","version":313,"action":"UPDATE"},{"gtasId":"13871940","tamrId":"1baba50b-6d05-3ef7-b68e-36d80983f6fc","version":313,"action":"UPDATE"},{"gtasId":"13088581","tamrId":"953ded56-8134-3d7d-bfe8-aae2a8f35294","version":313,"action":"UPDATE"},{"gtasId":"16061802","tamrId":"43e14470-8b98-38a9-8464-440f9da37b46","version":313,"action":"UPDATE"},{"gtasId":"14997388","tamrId":"34ac3202-ed1f-3ce2-9d8c-1c3157128169","version":313,"action":"UPDATE"},{"gtasId":"13986838","tamrId":"c4448dbe-70fe-305c-a372-63fb146b0984","version":313,"action":"UPDATE"},{"gtasId":"18489131","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"9186138","tamrId":"4195ad21-fa2a-3360-9992-95b518451f12","version":313,"action":"UPDATE"},{"gtasId":"23530176","tamrId":"76c84a89-be32-3bd7-9366-60916037e817","version":313,"action":"UPDATE"},{"gtasId":"77156","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"7486385","tamrId":"5d15c9fc-385e-36f1-b801-2ef0fd828fa0","version":313,"action":"UPDATE"},{"gtasId":"16011565","tamrId":"dddcbd60-6734-39cc-95a4-ad02b53646cc","version":313,"action":"UPDATE"},{"gtasId":"177038","tamrId":"3fb29f22-a5e5-388b-92f6-c3cfbd3177c1","version":313,"action":"UPDATE"},{"gtasId":"2796466","tamrId":"5354c03d-15ce-3707-adae-339f34a4b2f6","version":313,"action":"UPDATE"},{"gtasId":"3857356","tamrId":"fc05deb1-5124-3ecf-ac30-ea5fe8a9181e","version":313,"action":"UPDATE"},{"gtasId":"668916","tamrId":"3db71e19-6ee4-3d6f-bc23-4b4ff3b4a8ba","version":313,"action":"UPDATE"},{"gtasId":"19666757","tamrId":"eb4a62a0-1a3b-3c4b-9fd8-01fa242acf1f","version":313,"action":"UPDATE"},{"gtasId":"21283988","tamrId":"6c08f4b2-078e-321a-9b94-9929cbbf0ddb","version":313,"action":"UPDATE"},{"gtasId":"21476887","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"10693747","tamrId":"19301af3-d7a5-3b4d-a963-5421d963fdb4","version":313,"action":"UPDATE"},{"gtasId":"2841108","tamrId":"5867bfb9-7720-3b84-84f7-c9d539a3f9e5","version":313,"action":"UPDATE"},{"gtasId":"783936","tamrId":"ffc4367b-c53f-304d-806c-3098c02ab5b5","version":313,"action":"UPDATE"},{"gtasId":"16995257","tamrId":"49c5c2c3-0993-34f2-b6be-49bce89304a8","version":313,"action":"UPDATE"},{"gtasId":"20762752","tamrId":"b24307e3-7006-3f43-a10e-fa860559f57c","version":313,"action":"UPDATE"},{"gtasId":"9741837","tamrId":"30d2835d-05a0-30e1-9f22-7bd6a1698ce3","version":313,"action":"UPDATE"},{"gtasId":"3673388","tamrId":"5e7cec44-fd1f-39a6-8c76-1c58fa0fe86d","version":313,"action":"UPDATE"},{"gtasId":"19963537","tamrId":"d35c9e24-9863-37ed-957e-c166e0299848","version":313,"action":"UPDATE"},{"gtasId":"2079933","tamrId":"59aa170a-095b-318d-be4d-4b0764931457","version":313,"action":"UPDATE"},{"gtasId":"23334011","tamrId":"ed914e22-58d9-3787-b624-b301da4af4ee","version":313,"action":"UPDATE"},{"gtasId":"4303805","tamrId":"c55cccf6-93be-3918-b3bd-85115d412e50","version":313,"action":"UPDATE"},{"gtasId":"20096527","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"1180002","tamrId":"363e0d3a-76ee-3845-ada0-748053599614","version":313,"action":"UPDATE"},{"gtasId":"5846784","tamrId":"fe28ead1-749c-30b1-93a5-fe2fc3ef1a5c","version":313,"action":"UPDATE"},{"gtasId":"9152747","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"1083307","tamrId":"e86d51ef-a9d1-35b4-8a3f-7add20263a1c","version":313,"action":"UPDATE"},{"gtasId":"8420322","tamrId":"56cc4330-8f52-34a1-8bae-d8c953512116","version":313,"action":"UPDATE"},{"gtasId":"14298247","tamrId":"b9017e3f-b07b-3bc3-a7a8-e76212cd29af","version":313,"action":"UPDATE"},{"gtasId":"3066873","tamrId":"886255e8-e725-3078-bc80-e47051b3ea09","version":313,"action":"UPDATE"},{"gtasId":"8711799","tamrId":"cc0af156-ad25-3cfa-931b-b545131e4c8d","version":313,"action":"UPDATE"},{"gtasId":"24659471","tamrId":"b5ad4d0b-4483-392d-ad08-201e06ad6c39","version":313,"action":"UPDATE"},{"gtasId":"9289885","tamrId":"61e6c237-9dd4-34d9-ae82-0a46e8e6160b","version":313,"action":"UPDATE"},{"gtasId":"4416537","tamrId":"eed5338d-a9ac-3e9f-969f-79b520a88b71","version":313,"action":"UPDATE"},{"gtasId":"12766019","tamrId":"4be2311b-dab6-3fa5-b559-9591eb6d1828","version":313,"action":"UPDATE"},{"gtasId":"11917767","tamrId":"e7213872-7479-3615-97df-b3d9bdba9b2b","version":313,"action":"UPDATE"},{"gtasId":"4462880","tamrId":"1cac1904-0123-3c08-91bf-6a77c9a3858d","version":313,"action":"UPDATE"},{"gtasId":"11317520","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"4988127","tamrId":"ed1e51b4-441d-37b6-a1d9-06d838849871","version":313,"action":"UPDATE"},{"gtasId":"11940505","tamrId":"7645a68b-1165-3e3d-8b76-17dba3985541","version":313,"action":"UPDATE"},{"gtasId":"6535594","tamrId":"51febfef-c6e8-356a-b8ed-cbb445366b39","version":313,"action":"UPDATE"},{"gtasId":"12436340","tamrId":"387abb9e-09f3-35c4-9d4d-9dbb44a86099","version":313,"action":"UPDATE"},{"gtasId":"22230468","tamrId":"ea0c37ae-58ca-3996-85a2-d2b0f5e99bcb","version":313,"action":"UPDATE"},{"gtasId":"21651655","tamrId":"de3caca0-cd24-36cf-b07a-08e59a44d1bb","version":313,"action":"UPDATE"},{"gtasId":"13776942","tamrId":"480f6fe1-3187-30dd-ad4e-4a47cdf4ff78","version":313,"action":"UPDATE"},{"gtasId":"7116584","tamrId":"7e3d6537-3fe1-31de-8626-9598e1df3b42","version":313,"action":"UPDATE"},{"gtasId":"15609137","tamrId":"31fcefbb-8401-3523-a569-2fe85f24e1a8","version":313,"action":"UPDATE"},{"gtasId":"25251237","tamrId":"08786df6-b1e1-31d1-9372-94476a2f908b","version":313,"action":"UPDATE"},{"gtasId":"9050352","tamrId":"acac0ccc-b5a0-342e-9e6c-cdeac5dd1bde","version":313,"action":"UPDATE"},{"gtasId":"9975232","tamrId":"00738a54-e024-3dcf-9df0-6a982022c8ea","version":313,"action":"UPDATE"},{"gtasId":"3923313","tamrId":"028a29a1-2461-3b4a-904b-6282c796ea98","version":313,"action":"UPDATE"},{"gtasId":"5920377","tamrId":"54e9c803-f6e6-315d-92fd-1d14d584a044","version":313,"action":"UPDATE"},{"gtasId":"9760122","tamrId":"a09c05f7-ab40-3999-9c58-d890c811204a","version":313,"action":"UPDATE"},{"gtasId":"3672079","tamrId":"2ef854ae-1b0b-3277-98ad-9b3c4fb17219","version":313,"action":"UPDATE"},{"gtasId":"17715798","tamrId":"c5fe3ddb-1dbb-36e6-b3f3-7765d12317fa","version":313,"action":"UPDATE"},{"gtasId":"14828515","tamrId":"f3108168-3ee9-33ce-bf95-97ea2f70c8c4","version":313,"action":"UPDATE"},{"gtasId":"366465","tamrId":"42735589-d60b-3525-9946-1bbd1336fe60","version":313,"action":"UPDATE"},{"gtasId":"21421724","tamrId":"3ea72252-043f-3211-977a-1ee60a214206","version":313,"action":"UPDATE"},{"gtasId":"1905005","tamrId":"38108d3f-6190-3b3c-923d-32731a8f356c","version":313,"action":"UPDATE"},{"gtasId":"9712888","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"9302916","tamrId":"f7517cb6-ef1d-384b-ae6b-0c18313b5e9a","version":313,"action":"UPDATE"},{"gtasId":"19003461","tamrId":"dd4a1489-dc9e-3efe-8235-0182f7bb8841","version":313,"action":"UPDATE"},{"gtasId":"7919898","tamrId":"d9bf2be7-3428-367a-9f53-eb58fb7155c8","version":313,"action":"UPDATE"},{"gtasId":"16510113","tamrId":"0c0e8843-1c3d-35bd-a29e-6b136a89260b","version":313,"action":"UPDATE"},{"gtasId":"16543950","tamrId":"024f1659-4b54-3a5f-9660-61baae36e592","version":313,"action":"UPDATE"},{"gtasId":"11287210","tamrId":"26c349d9-cca9-3378-ae5e-8b1468467a38","version":313,"action":"UPDATE"},{"gtasId":"16846843","tamrId":"4e384699-be93-3d3e-863b-61a9fc593923","version":313,"action":"UPDATE"},{"gtasId":"4071615","tamrId":"7b1a58ed-080a-3abc-981e-736173f65869","version":313,"action":"UPDATE"},{"gtasId":"22564570","tamrId":"8d954af0-e96e-3cc4-90ef-7c3e0c65795b","version":313,"action":"UPDATE"},{"gtasId":"2567483","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"1014799","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"11929308","tamrId":"dc1688d5-b7c3-384a-8424-a2bc08166335","version":313,"action":"UPDATE"},{"gtasId":"1705804","tamrId":"d83b1cc3-435f-3351-9edb-5fa3197eaa2d","version":313,"action":"UPDATE"},{"gtasId":"5838709","tamrId":"f46caaff-9f79-3a75-9c85-1ad1b8c7badc","version":313,"action":"UPDATE"},{"gtasId":"87311","tamrId":"29bd225c-fc59-365c-a23b-f2c56fd9fdff","version":313,"action":"UPDATE"},{"gtasId":"14922616","tamrId":"a771e5be-42b4-3236-9b1a-e0f1c150d558","version":313,"action":"UPDATE"},{"gtasId":"23319281","tamrId":"cb1dcec5-c29f-3af1-994f-3d76de5756d1","version":313,"action":"UPDATE"},{"gtasId":"18612678","tamrId":"a89f528e-54c5-34ad-8b6b-77dd9a27d7cf","version":313,"action":"UPDATE"},{"gtasId":"7694028","tamrId":"8aec8602-6114-3475-bfa1-3efb246e80c7","version":313,"action":"UPDATE"},{"gtasId":"11153607","tamrId":"655f149e-400a-37d1-a6cb-27091405470e","version":313,"action":"UPDATE"},{"gtasId":"17974571","tamrId":"ac2339d6-a0f6-3431-b530-8f6b7cb21e2f","version":313,"action":"UPDATE"},{"gtasId":"11953402","tamrId":"2438497e-ec67-311e-8802-c1770edc7f91","version":313,"action":"UPDATE"},{"gtasId":"18141263","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"6067678","tamrId":"aed59421-49c2-37f9-9fbd-afc0cf1f713d","version":313,"action":"UPDATE"},{"gtasId":"12280808","tamrId":"5a1ab105-c2b4-3725-b8c6-d63b9efed604","version":313,"action":"UPDATE"},{"gtasId":"15373817","tamrId":"cd6fa355-5705-3398-866b-22b525df03b4","version":313,"action":"UPDATE"},{"gtasId":"1510278","tamrId":"dd6b5745-3373-3199-8a04-dfe0c5e26ee5","version":313,"action":"UPDATE"},{"gtasId":"10061184","tamrId":"8a89f7a1-3bb2-3ec0-92ce-ea9c26df95d2","version":313,"action":"UPDATE"},{"gtasId":"10158195","tamrId":"4ae42539-89b4-3ed6-bb62-fe84245d79f2","version":313,"action":"UPDATE"},{"gtasId":"13488603","tamrId":"ca219b99-5191-365c-bf6a-d060b180cfc8","version":313,"action":"UPDATE"},{"gtasId":"20668698","tamrId":"804c6d5c-cbbf-3ceb-9f27-6eb3bf59a8a2","version":313,"action":"UPDATE"},{"gtasId":"11334553","tamrId":"607e03a1-c815-313b-ad44-ad9ed48aad21","version":313,"action":"UPDATE"},{"gtasId":"890087","tamrId":"fc665a91-c5b1-3275-845b-0dd67e881073","version":313,"action":"UPDATE"},{"gtasId":"11231636","tamrId":"a5ab597c-e2e7-3fc4-b698-6acd0ba51cf0","version":313,"action":"UPDATE"},{"gtasId":"3068211","tamrId":"8d604ab1-a255-3790-a2d9-ca2008504f33","version":313,"action":"UPDATE"},{"gtasId":"5020344","tamrId":"94a29ef7-edaa-31c2-abf9-fc5f143ae356","version":313,"action":"UPDATE"},{"gtasId":"21398455","tamrId":"4282866e-d4fb-360a-bd04-d977cbfafedf","version":313,"action":"UPDATE"},{"gtasId":"1117643","tamrId":"7b448df6-3bc0-32bb-b525-6c71ba3369c9","version":313,"action":"UPDATE"},{"gtasId":"4334191","tamrId":"06648384-a039-3dd0-92dc-52447d6b1061","version":313,"action":"UPDATE"},{"gtasId":"2250292","tamrId":"f566203b-0855-3134-824e-cb2039d2938a","version":313,"action":"UPDATE"},{"gtasId":"9918616","tamrId":"4b029fe7-d779-3934-9974-46e422b8549f","version":313,"action":"UPDATE"},{"gtasId":"10616761","tamrId":"82e246d4-64cb-3886-9c77-6ad8c4f5fb4d","version":313,"action":"UPDATE"},{"gtasId":"7423191","tamrId":"468c0ba9-4bd6-36d5-92f0-950ab1eff526","version":313,"action":"UPDATE"},{"gtasId":"12730043","tamrId":"adc841e1-3700-3670-a960-5969b47d60a3","version":313,"action":"UPDATE"},{"gtasId":"18480347","tamrId":"9a19a3f1-3000-3daa-8b71-d2b3063f0f49","version":313,"action":"UPDATE"},{"gtasId":"5554470","tamrId":"86c511bf-a24a-3b66-8613-bcfbb3d589a7","version":313,"action":"UPDATE"},{"gtasId":"12839501","tamrId":"5d3d0732-c1a8-3b3c-a47f-2d5fbd26cbb0","version":313,"action":"UPDATE"},{"gtasId":"10604780","tamrId":"51834596-9c1c-3ec8-8f65-b95b4cac7a88","version":313,"action":"UPDATE"},{"gtasId":"23548292","tamrId":"dd7b2663-2865-3c71-a474-316ae66149d7","version":313,"action":"UPDATE"},{"gtasId":"8462631","tamrId":"7cf6dca2-ef13-3ee2-9ad2-a54a78b17374","version":313,"action":"UPDATE"},{"gtasId":"5369001","tamrId":"8d9429ba-d29f-353b-8645-c614520aaabf","version":313,"action":"UPDATE"},{"gtasId":"23958222","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"7894941","tamrId":"bf53f35a-6d3d-3ca3-8daa-8c34c665270f","version":313,"action":"UPDATE"},{"gtasId":"6663897","tamrId":"eafa9660-eff5-3e69-89cb-c31617bfff04","version":313,"action":"UPDATE"},{"gtasId":"18250452","tamrId":"de01c922-d472-3be5-809a-e7badf3ab4cc","version":313,"action":"UPDATE"},{"gtasId":"1394323","tamrId":"20633ec6-c545-3577-97f5-1f4da4fe98cd","version":313,"action":"UPDATE"},{"gtasId":"9449013","tamrId":"8c113020-bbab-3f54-b3e3-1026e3e6b4b4","version":313,"action":"UPDATE"},{"gtasId":"4678098","tamrId":"c8ebe819-1787-3576-8329-68dc482f7c01","version":313,"action":"UPDATE"},{"gtasId":"7477820","tamrId":"e6d0bcbf-ecda-368e-8cf0-560208d93f61","version":313,"action":"UPDATE"},{"gtasId":"25134521","tamrId":"3bf40cac-f1e4-3db7-9d6b-6c61b563e5c1","version":313,"action":"UPDATE"},{"gtasId":"10091894","tamrId":"2541bb07-f598-386c-a678-760e20ab37b6","version":313,"action":"UPDATE"},{"gtasId":"11303310","tamrId":"068856ab-c2b6-3798-8f8f-3635b2193f08","version":313,"action":"UPDATE"},{"gtasId":"10029038","tamrId":"7a19126b-97a8-3f71-8981-06933f32f81a","version":313,"action":"UPDATE"},{"gtasId":"5701614","tamrId":"740927c4-0e72-3f72-852a-9fea13354cd4","version":313,"action":"UPDATE"},{"gtasId":"895760","tamrId":"a418fa91-21ba-3bcc-bccf-598c8a042ac7","version":313,"action":"UPDATE"},{"gtasId":"2637491","tamrId":"9f348c9f-eeb1-32fd-9959-71ea7bbee7c0","version":313,"action":"UPDATE"},{"gtasId":"3495059","tamrId":"8bc83c96-8d09-3fb9-82c1-100fd7a5352a","version":313,"action":"UPDATE"},{"gtasId":"14813411","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"8006382","tamrId":"bc36646c-9998-3e13-b5f0-d8fc6256a90c","version":313,"action":"UPDATE"},{"gtasId":"8007230","tamrId":"27ea7e5f-d59b-3949-a6f0-dba5a22a06ac","version":313,"action":"UPDATE"},{"gtasId":"6658496","tamrId":"89946df9-6b64-3dcb-a22b-e3b73073b59c","version":313,"action":"UPDATE"},{"gtasId":"8208673","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"16647668","tamrId":"c26a1f53-96c3-39e2-853d-6dc149f6b88b","version":313,"action":"UPDATE"},{"gtasId":"2251182","tamrId":"1bcd4560-5b30-3a9e-8890-3b07bda9440c","version":313,"action":"UPDATE"},{"gtasId":"10536972","tamrId":"79e14adc-ba5b-3efb-8c0b-e9079a5ee17e","version":313,"action":"UPDATE"},{"gtasId":"6157287","tamrId":"a8d676a5-d76c-34f5-a322-46a2cc31b7eb","version":313,"action":"UPDATE"},{"gtasId":"24158625","tamrId":"9cfaadb9-180c-3357-b918-9553370771ea","version":313,"action":"UPDATE"},{"gtasId":"6566344","tamrId":"39399cdc-011a-3992-8633-76fe688495d4","version":313,"action":"UPDATE"},{"gtasId":"1862669","tamrId":"02f20247-c65e-3e57-8066-0fb70cfd7814","version":313,"action":"UPDATE"},{"gtasId":"23551489","tamrId":"eaeb0bb7-d459-38f8-84f8-5708fe1798ce","version":313,"action":"UPDATE"},{"gtasId":"11789772","tamrId":"02d3320b-a16f-3673-834a-501b4667d90a","version":313,"action":"UPDATE"},{"gtasId":"14000719","tamrId":"3961c8ef-4b9c-3f7d-80ef-9f5437c4f17f","version":313,"action":"UPDATE"},{"gtasId":"22645241","tamrId":"b5d4b118-55dc-3107-9963-f857687be2e6","version":313,"action":"UPDATE"},{"gtasId":"1034348","tamrId":"04b547ab-1371-32d2-a712-176d9a45997e","version":313,"action":"UPDATE"},{"gtasId":"8638544","tamrId":"a61f9d59-6299-3a4d-b027-f1e7bf98cbdf","version":313,"action":"UPDATE"},{"gtasId":"5672586","tamrId":"04c8c1be-7288-3cf5-bc9b-46e61d54aa5d","version":313,"action":"UPDATE"},{"gtasId":"15019215","tamrId":"8595e176-9587-36fc-89af-00b3afc6b0a9","version":313,"action":"UPDATE"},{"gtasId":"18377790","tamrId":"4ae7c913-e72c-378e-af2a-6ebcb2fc0388","version":313,"action":"UPDATE"},{"gtasId":"19623688","tamrId":"9e740d61-27c5-3c68-ac48-dceb2063a40c","version":313,"action":"UPDATE"},{"gtasId":"14191362","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"9656291","tamrId":"3052a64e-52f9-3321-8143-5e8d989863da","version":313,"action":"UPDATE"},{"gtasId":"6019132","tamrId":"4bab481c-7d34-3e40-acc7-0cc1c919825e","version":313,"action":"UPDATE"},{"gtasId":"13123015","tamrId":"6e63bbae-1756-3659-8781-ed050cd2f394","version":313,"action":"UPDATE"},{"gtasId":"11134048","tamrId":"a74e950f-d8ac-342e-999a-1b5b17f99f93","version":313,"action":"UPDATE"},{"gtasId":"487999","tamrId":"b861227c-a50d-3fe5-b7cb-7b2fd708e78e","version":313,"action":"UPDATE"},{"gtasId":"5312125","tamrId":"5cb40e7d-a1d5-32fd-839f-231485bf3861","version":313,"action":"UPDATE"},{"gtasId":"15158669","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"12301443","tamrId":"5d8a690d-db5f-3a7e-b9cc-166954edc59d","version":313,"action":"UPDATE"},{"gtasId":"7092935","tamrId":"4cd5a84e-d8e1-3a9c-81c8-4253b6f0ae76","version":313,"action":"UPDATE"},{"gtasId":"19564798","tamrId":"9125ad5c-0b67-383e-8ac0-8a113543250c","version":313,"action":"UPDATE"},{"gtasId":"15143184","tamrId":"ffd67c67-0574-3bc7-a048-467e63adaab4","version":313,"action":"UPDATE"},{"gtasId":"16198081","tamrId":"ff79af98-235f-333f-a62a-16d27e0d6c1b","version":313,"action":"UPDATE"},{"gtasId":"13671445","tamrId":"e872795a-b034-3ce3-b5f6-3b2b1cb4fe99","version":313,"action":"UPDATE"},{"gtasId":"15986508","tamrId":"0503a33d-114b-342e-9d3e-3c79a82c14ef","version":313,"action":"UPDATE"},{"gtasId":"24557905","tamrId":"d4bfdc91-1e58-37b1-b770-4cf15f766fad","version":313,"action":"UPDATE"},{"gtasId":"7121098","tamrId":"f31b961c-8cf7-3421-89ef-e98284136ca4","version":313,"action":"UPDATE"},{"gtasId":"15720649","tamrId":"33af99ee-5e12-3535-af28-e51ea3806ffe","version":313,"action":"UPDATE"},{"gtasId":"242269","tamrId":"8d90aa91-6e69-3e9e-bb0a-50cf0be39c18","version":313,"action":"UPDATE"},{"gtasId":"25268067","tamrId":"29cce2b0-b46b-3496-bd6c-02505862e720","version":313,"action":"UPDATE"},{"gtasId":"1935749","tamrId":"85c0bc04-6d78-390e-92fe-c21f3f96d364","version":313,"action":"UPDATE"},{"gtasId":"25262762","tamrId":"190b6c23-28ef-39f9-8a9f-a2a583e9d8db","version":313,"action":"UPDATE"},{"gtasId":"12479413","tamrId":"b954d77a-9603-3b2d-b4d2-5709b2f4f412","version":313,"action":"UPDATE"},{"gtasId":"15036972","tamrId":"0fa1fb5c-b863-39e8-9fc7-aa0c5e5c8d0b","version":313,"action":"UPDATE"},{"gtasId":"4534221","tamrId":"9a2127c7-da6e-3db9-8503-b484abac4277","version":313,"action":"UPDATE"},{"gtasId":"15091359","tamrId":"cfe181fb-ec3e-316e-9b1b-aa8b49c7e7c7","version":313,"action":"UPDATE"},{"gtasId":"22234342","tamrId":"fb2700e7-a2c5-38fe-810e-c436e7917aec","version":313,"action":"UPDATE"},{"gtasId":"15550319","tamrId":"25577629-816a-3a29-a012-e4cddf647cc9","version":313,"action":"UPDATE"},{"gtasId":"5472431","tamrId":"dcf9f12c-fb36-3ebd-8432-0c0b527f88a2","version":313,"action":"UPDATE"},{"gtasId":"2599805","tamrId":"d04e835e-95a6-3ed1-8c06-842eaba11330","version":313,"action":"UPDATE"},{"gtasId":"8930028","tamrId":"46b98c37-ede1-3955-82ae-b8a6e8a501f6","version":313,"action":"UPDATE"},{"gtasId":"2814733","tamrId":"367d6c2a-6d99-31a5-9139-54b05ec3369f","version":313,"action":"UPDATE"},{"gtasId":"2364252","tamrId":"08dc6944-5543-32f1-a574-b6a4156cec44","version":313,"action":"UPDATE"},{"gtasId":"6818458","tamrId":"bb126f43-7191-3888-bed9-4caade99dc55","version":313,"action":"UPDATE"},{"gtasId":"24670772","tamrId":"34cc168c-dda3-35c1-95e3-00d588ed1f3f","version":313,"action":"UPDATE"},{"gtasId":"24111902","tamrId":"a096f5de-eab1-30e7-b7aa-d91898da73f0","version":313,"action":"UPDATE"},{"gtasId":"19281014","tamrId":"617d60e5-227d-3407-a9ec-b2e1f57cbb5c","version":313,"action":"UPDATE"},{"gtasId":"8496364","tamrId":"d5349d92-4961-3e7f-9a44-3ecbdfa14750","version":313,"action":"UPDATE"},{"gtasId":"13644671","tamrId":"8b694581-f97f-3b2f-8ab9-ef069364b84b","version":313,"action":"UPDATE"},{"gtasId":"12110347","tamrId":"11fda871-f14f-32fc-86f0-ad40e1d888f4","version":313,"action":"UPDATE"},{"gtasId":"1532564","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"19871814","tamrId":"b3f88e16-3261-39d6-aaae-a56695824cd2","version":313,"action":"UPDATE"},{"gtasId":"21484506","tamrId":"30ab7cdd-0072-3c51-88b4-7e2e4e6a3d92","version":313,"action":"UPDATE"},{"gtasId":"21825430","tamrId":"5825e00c-8984-318e-af0b-4b93b93e1822","version":313,"action":"UPDATE"},{"gtasId":"5139567","tamrId":"64aeb8e0-d6cb-3cbc-a667-23484182396a","version":313,"action":"UPDATE"},{"gtasId":"2448982","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"7082645","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"1689175","tamrId":"8175aac8-d26d-3faf-8a17-111d09c1746e","version":313,"action":"UPDATE"},{"gtasId":"16953365","tamrId":"a2637368-2024-3788-a9ce-1a8b9f85fa75","version":313,"action":"UPDATE"},{"gtasId":"12947324","tamrId":"fa50913c-7d70-3935-b02d-55a7a951dec1","version":313,"action":"UPDATE"},{"gtasId":"9756996","tamrId":"61eb8e08-4d0e-3590-850e-186c452a7c0a","version":313,"action":"UPDATE"},{"gtasId":"20984635","tamrId":"181d2474-03d3-39fd-b6f4-a1766b81601c","version":313,"action":"UPDATE"},{"gtasId":"8958852","tamrId":"f17f3643-af62-31c6-af67-bb275f262852","version":313,"action":"UPDATE"},{"gtasId":"14362414","tamrId":"8aeb26c7-3e0c-3c98-8180-eeeb6f7ec377","version":313,"action":"UPDATE"},{"gtasId":"23379774","tamrId":"1fc841d6-3255-384f-8eb1-c9a1922f02fa","version":313,"action":"UPDATE"},{"gtasId":"19219077","tamrId":"f98ec671-15c3-3fae-b39c-308ad24ffa9b","version":313,"action":"UPDATE"},{"gtasId":"9627671","tamrId":"10d3da52-4187-3a32-be01-feb6d8bfa8e5","version":313,"action":"UPDATE"},{"gtasId":"23295239","tamrId":"eea1da62-933f-38f7-9593-05aea5ae1144","version":313,"action":"UPDATE"},{"gtasId":"7493997","tamrId":"553904cc-5249-3c4c-a0e5-17d0db19cfa0","version":313,"action":"UPDATE"},{"gtasId":"5778161","tamrId":"1a5b5650-4635-315b-a972-940ec5acc2bf","version":313,"action":"UPDATE"},{"gtasId":"11517589","tamrId":"848ecc60-43b9-399a-aebe-63401e76ad84","version":313,"action":"UPDATE"},{"gtasId":"21657836","tamrId":"648a0bf9-1de1-35cd-ada7-b624a83eca31","version":313,"action":"UPDATE"},{"gtasId":"9903527","tamrId":"40917470-e260-322a-97e3-b584bee3a4b7","version":313,"action":"UPDATE"},{"gtasId":"8394468","tamrId":"8842a70f-fe41-33d1-8395-a22e1af11ab3","version":313,"action":"UPDATE"},{"gtasId":"2024800","tamrId":"3a9698d3-6f47-38d8-930f-37550e85b6b0","version":313,"action":"UPDATE"},{"gtasId":"19139188","tamrId":"34bbffda-87d0-3848-b208-7b1a00d10307","version":313,"action":"UPDATE"},{"gtasId":"21206018","tamrId":"3ba6e1cd-0d9d-3519-9998-34a7d44b40ee","version":313,"action":"UPDATE"},{"gtasId":"208394","tamrId":"e414d64e-a3bf-3fa4-bcb5-470650d986da","version":313,"action":"UPDATE"},{"gtasId":"25524748","tamrId":"c401ad43-f1b3-3bbe-9ed8-b66c346e6e9c","version":313,"action":"UPDATE"},{"gtasId":"15804885","tamrId":"13978c71-f666-3c99-8fa1-2340139cebd6","version":313,"action":"UPDATE"},{"gtasId":"24309252","tamrId":"7b770829-30e5-35cd-91bc-3a315c61d6bd","version":313,"action":"UPDATE"},{"gtasId":"7494442","tamrId":"d933fc89-c800-3783-a829-4bc1ea0828c0","version":313,"action":"UPDATE"},{"gtasId":"19637483","tamrId":"5f09a824-5194-3315-80db-a275c10d9f0d","version":313,"action":"UPDATE"},{"gtasId":"20809472","tamrId":"809753f2-0acb-36c4-a6c1-a88c492d095c","version":313,"action":"UPDATE"},{"gtasId":"6984745","tamrId":"67f27425-f813-36fd-94ac-71f276244a91","version":313,"action":"UPDATE"},{"gtasId":"21389173","tamrId":"74729449-7957-31b3-920f-895793bd5960","version":313,"action":"UPDATE"},{"gtasId":"3633779","tamrId":"7430a659-8525-3506-93ab-fb308c63c779","version":313,"action":"UPDATE"},{"gtasId":"22071262","tamrId":"06ce4828-d153-36ad-b481-3740e8e29179","version":313,"action":"UPDATE"},{"gtasId":"2371804","tamrId":"6433ae84-a70f-3846-a745-03dd495541a8","version":313,"action":"UPDATE"},{"gtasId":"22965097","tamrId":"08d01e7e-414b-3c4d-b860-5b267cc44729","version":313,"action":"UPDATE"},{"gtasId":"3828002","tamrId":"83b55301-ce2a-3933-8f78-e5b03137ecbe","version":313,"action":"UPDATE"},{"gtasId":"16404017","tamrId":"5719489d-20c1-3aea-8235-9c116886498d","version":313,"action":"UPDATE"},{"gtasId":"19740366","tamrId":"15bb90da-21d1-333a-9872-05851734e8a6","version":313,"action":"UPDATE"},{"gtasId":"18897239","tamrId":"96177021-3e50-37a8-96df-4e28b1f0f041","version":313,"action":"UPDATE"},{"gtasId":"22477965","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"13533841","tamrId":"429d2c2e-4f24-3c0e-8a10-14f6084ddb89","version":313,"action":"UPDATE"},{"gtasId":"10902062","tamrId":"91fcf2a7-6da4-3244-b2b0-f6c795a66421","version":313,"action":"UPDATE"},{"gtasId":"4831044","tamrId":"dc0a3327-e7df-3ff5-a6dc-7dcd2f0fcd9d","version":313,"action":"UPDATE"},{"gtasId":"4709644","tamrId":"1fe8be59-2c61-3d10-9fb2-66c242376733","version":313,"action":"UPDATE"},{"gtasId":"13286053","tamrId":"098216d8-7f22-3d55-aa9e-fff266d26b96","version":313,"action":"UPDATE"},{"gtasId":"6275833","tamrId":"331488b3-2019-3361-a010-1c77d1f47816","version":313,"action":"UPDATE"},{"gtasId":"24887556","tamrId":"cfdc38cb-f4b3-39c7-bd79-c9b746306ed3","version":313,"action":"UPDATE"},{"gtasId":"11837119","tamrId":"e62c72db-1ef5-365f-a80d-cbca3592ab33","version":313,"action":"UPDATE"},{"gtasId":"17661782","tamrId":"14288c9b-1286-3792-92d9-59e8a57a692a","version":313,"action":"UPDATE"},{"gtasId":"6518225","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"10808288","tamrId":"7c1be32b-9034-388b-ae2d-0fd2e01cbda9","version":313,"action":"UPDATE"},{"gtasId":"11849124","tamrId":"000ca59c-0ee0-3289-aae3-a8df1060d7d4","version":313,"action":"UPDATE"},{"gtasId":"3237960","tamrId":"3a9fafa3-efec-3452-bf5f-0fbb244cc27e","version":313,"action":"UPDATE"},{"gtasId":"17235342","tamrId":"3fd054cd-a5b3-367c-96e5-a13b820691be","version":313,"action":"UPDATE"},{"gtasId":"20950865","tamrId":"e1488c72-318d-3cad-a15f-4c269f785cb1","version":313,"action":"UPDATE"},{"gtasId":"555421","tamrId":"e8815ccd-8cff-3d68-a372-60ff258f2df3","version":313,"action":"UPDATE"},{"gtasId":"21286584","tamrId":"4c103e23-23a9-3434-a565-733a9374d78c","version":313,"action":"UPDATE"},{"gtasId":"20229823","tamrId":"eac0ee83-9109-361f-b4d2-f7338b06206c","version":313,"action":"UPDATE"},{"gtasId":"18115779","tamrId":"c45388ac-1f46-3eb3-8e81-1d14d91124f0","version":313,"action":"UPDATE"},{"gtasId":"3286090","tamrId":"0439ee0c-2714-35ca-9912-bb52cc0d35cf","version":313,"action":"UPDATE"},{"gtasId":"2482822","tamrId":"3fa2dd47-de0c-357b-80c8-194277ab48ca","version":313,"action":"UPDATE"},{"gtasId":"450673","tamrId":"d57f6ac8-4e12-3bcd-97d5-697ee45da75a","version":313,"action":"UPDATE"},{"gtasId":"20666902","tamrId":"a68f6e6b-bab5-378b-a7db-2df8b5c9fe7c","version":313,"action":"UPDATE"},{"gtasId":"1209063","tamrId":"157fb3ac-fb24-39b7-bd87-2cf95909b526","version":313,"action":"UPDATE"},{"gtasId":"9642863","tamrId":"3235f995-4061-3ac4-9662-e181eaef174f","version":313,"action":"UPDATE"},{"gtasId":"11056809","tamrId":"f95614c6-e823-3167-93f0-aec2e929644b","version":313,"action":"UPDATE"},{"gtasId":"1855842","tamrId":"5825e00c-8984-318e-af0b-4b93b93e1822","version":313,"action":"UPDATE"},{"gtasId":"9404076","tamrId":"b981eb2a-b39a-387a-bca2-deac7bd8c092","version":313,"action":"UPDATE"},{"gtasId":"2745701","tamrId":"4d072407-4001-355c-98d4-c663be4d5aa5","version":313,"action":"UPDATE"},{"gtasId":"8237907","tamrId":"b531c890-2c61-3270-af3b-3a34d72718b4","version":313,"action":"UPDATE"},{"gtasId":"15628310","tamrId":"0d3b3f3d-c9c4-3a60-99d5-55c39b6d57e2","version":313,"action":"UPDATE"},{"gtasId":"24360963","tamrId":"b5a582bb-0b95-3644-bf06-b083ebedee7a","version":313,"action":"UPDATE"},{"gtasId":"12019607","tamrId":"f5884477-2ce3-3bac-b836-3cb0ebbfed0c","version":313,"action":"UPDATE"},{"gtasId":"24521464","tamrId":"6c3cbae6-4aa0-3211-aef1-9ef72d440838","version":313,"action":"UPDATE"},{"gtasId":"19500262","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"8901536","tamrId":"d27b0351-b816-3ac9-a4fe-ffffe32dafad","version":313,"action":"UPDATE"},{"gtasId":"18296253","tamrId":"3f870cec-ad42-3f64-a501-648373ee508b","version":313,"action":"UPDATE"},{"gtasId":"2763583","tamrId":"da0a4695-aff0-3363-af86-1bc1df88523d","version":313,"action":"UPDATE"},{"gtasId":"24171135","tamrId":"a8f30300-3a42-35b9-9cdf-d4113025912d","version":313,"action":"UPDATE"},{"gtasId":"17920282","tamrId":"fd51603f-4562-355f-b91c-49b0a380e5ff","version":313,"action":"UPDATE"},{"gtasId":"11842598","tamrId":"33320b9b-92ab-30fd-81be-a5c3a027fba9","version":313,"action":"UPDATE"},{"gtasId":"12349444","tamrId":"5844faa6-1c40-31c6-8def-6bb55ba8ec5b","version":313,"action":"UPDATE"},{"gtasId":"20936938","tamrId":"66f5c141-d87e-3685-b4bc-ac672e560cdd","version":313,"action":"UPDATE"},{"gtasId":"831204","tamrId":"42c2e86e-5489-3806-a86f-d095f08da635","version":313,"action":"UPDATE"},{"gtasId":"20954376","tamrId":"ae2d254e-0057-3147-b546-7dd945233f8f","version":313,"action":"UPDATE"},{"gtasId":"16117998","tamrId":"c83414ac-b7b4-3f8d-bbff-ca9570ef11ae","version":313,"action":"UPDATE"},{"gtasId":"1122586","tamrId":"953b164d-2332-346a-8459-5a79b7065670","version":313,"action":"UPDATE"},{"gtasId":"18069417","tamrId":"8e972ee2-ec53-37a1-aec3-b743c2f4a103","version":313,"action":"UPDATE"},{"gtasId":"3980342","tamrId":"47fb5e35-c640-3e63-81e5-0a6c0accb6dd","version":313,"action":"UPDATE"},{"gtasId":"5218861","tamrId":"3c555cfe-7c68-3ed9-9951-4e830f064e11","version":313,"action":"UPDATE"},{"gtasId":"17034577","tamrId":"48167316-6397-3087-afc7-15630025a0ac","version":313,"action":"UPDATE"},{"gtasId":"6874552","tamrId":"768d05ab-bdfb-3811-9196-937b37707da0","version":313,"action":"UPDATE"},{"gtasId":"989399","tamrId":"278a7f87-4491-302d-8889-e190ec8de811","version":313,"action":"UPDATE"},{"gtasId":"19967530","tamrId":"9133a2da-d945-3309-b201-41cc75d3b88a","version":313,"action":"UPDATE"},{"gtasId":"4584562","tamrId":"9c449ad2-01fc-39d7-a79a-df11a8d6ec55","version":313,"action":"UPDATE"},{"gtasId":"18208178","tamrId":"5ea94dc2-3792-395e-a497-f2bc63cb6fd7","version":313,"action":"UPDATE"},{"gtasId":"15051723","tamrId":"a74e950f-d8ac-342e-999a-1b5b17f99f93","version":313,"action":"UPDATE"},{"gtasId":"21210579","tamrId":"a0c04fd2-055c-30bf-b25f-93ab6b8d32c0","version":313,"action":"UPDATE"},{"gtasId":"7973831","tamrId":"ed1dfebc-d685-3a89-9365-1dc912a756a5","version":313,"action":"UPDATE"},{"gtasId":"21420032","tamrId":"de926749-b144-3abc-992a-5ceba2b54b74","version":313,"action":"UPDATE"},{"gtasId":"1030458","tamrId":"9847cfc1-cdfa-3398-b741-8b97775add3c","version":313,"action":"UPDATE"},{"gtasId":"8163669","tamrId":"6468c960-1dfb-342c-ae1b-90d67849e3a8","version":313,"action":"UPDATE"},{"gtasId":"727009","tamrId":"b9d7f1ab-9e84-3a2f-b93d-2ea8bd169ff5","version":313,"action":"UPDATE"},{"gtasId":"6691431","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"1312892","tamrId":"9b17a111-a53a-32f3-b86f-6d0735eb944e","version":313,"action":"UPDATE"},{"gtasId":"9832785","tamrId":"25e00dc7-504d-3ccd-9ba4-8270f2885295","version":313,"action":"UPDATE"},{"gtasId":"141074","tamrId":"b80c439d-0913-39b1-9f60-8d01564ffd48","version":313,"action":"UPDATE"},{"gtasId":"15584956","tamrId":"433a4c03-024d-33fb-a0e9-850284d93043","version":313,"action":"UPDATE"},{"gtasId":"15223374","tamrId":"066f25ce-d790-3da5-9fad-76864c38b566","version":313,"action":"UPDATE"},{"gtasId":"DummyInit","tamrId":"00fef270-44c1-3acd-984e-568021832ca8","version":313,"action":"UPDATE"},{"gtasId":"9435672","tamrId":"f4ef2a27-8fcc-3060-9760-af9fe5ba3570","version":313,"action":"UPDATE"},{"gtasId":"9408083","tamrId":"8ab8aac1-010a-3bd4-8939-ae901a984d30","version":313,"action":"UPDATE"},{"gtasId":"3051340","tamrId":"2263236d-f58d-3d44-8969-409ab6a48bd8","version":313,"action":"UPDATE"},{"gtasId":"10401256","tamrId":"bfd20898-e32e-37ac-ab34-d4aa767edf93","version":313,"action":"UPDATE"},{"gtasId":"5328172","tamrId":"9c31e4b9-2363-36b7-9c1f-d49c57f74fdd","version":313,"action":"UPDATE"},{"gtasId":"21059344","tamrId":"e541a492-0483-3a5a-8cf1-157b85383441","version":313,"action":"UPDATE"},{"gtasId":"8919277","tamrId":"64d1524d-3a5f-3e7e-88e0-2b230325d15a","version":313,"action":"UPDATE"},{"gtasId":"4272974","tamrId":"4b9eea84-bba2-39ff-afbf-9b40b82ef328","version":313,"action":"UPDATE"},{"gtasId":"13106462","tamrId":"f5884477-2ce3-3bac-b836-3cb0ebbfed0c","version":313,"action":"UPDATE"},{"gtasId":"2227981","tamrId":"64cbf2c6-2fdf-3438-a287-b8a3937cfa8f","version":313,"action":"UPDATE"},{"gtasId":"14682079","tamrId":"f4ce59fd-4449-35cc-994d-3138a998fe80","version":313,"action":"UPDATE"},{"gtasId":"4256022","tamrId":"d5f48ca6-e75b-3a8c-97c2-3db1552775c2","version":313,"action":"UPDATE"},{"gtasId":"24118954","tamrId":"e59088de-fec9-3703-8965-ead8ea30e4e8","version":313,"action":"UPDATE"},{"gtasId":"9262708","tamrId":"6880f851-cc19-3946-808b-872c583863ac","version":313,"action":"UPDATE"},{"gtasId":"18790492","tamrId":"6c0b7703-5281-3a2b-950e-8696b4a7005b","version":313,"action":"UPDATE"},{"gtasId":"19152568","tamrId":"446caf5d-99a1-30c0-af4a-cb61ef241546","version":313,"action":"UPDATE"},{"gtasId":"15000114","tamrId":"50de1fcb-d4e5-3524-b7ec-3ebff691ec08","version":313,"action":"UPDATE"},{"gtasId":"8032198","tamrId":"637d09b4-abf2-3fb8-bae4-5b45bdf84488","version":313,"action":"UPDATE"},{"gtasId":"24826555","tamrId":"a83f0ee3-6140-3849-8473-1835da9cac5a","version":313,"action":"UPDATE"},{"gtasId":"13725000","tamrId":"33ebd43a-2f3a-3063-b4c2-a774d3f34e06","version":313,"action":"UPDATE"},{"gtasId":"18755685","tamrId":"17b956f4-e80f-38ea-80ff-9c1d957e06e4","version":313,"action":"UPDATE"},{"gtasId":"22445966","tamrId":"581ca0e5-8f2b-3d6a-a553-72778a33bd0d","version":313,"action":"UPDATE"},{"gtasId":"12956254","tamrId":"b5240e7d-fd51-339a-a684-0ac0193abef6","version":313,"action":"UPDATE"},{"gtasId":"11423683","tamrId":"87b80e9d-3c1b-3447-8c6a-bd457765cd38","version":313,"action":"UPDATE"},{"gtasId":"5061788","tamrId":"9d061e77-21ca-3181-9185-a65a5a2bbb29","version":313,"action":"UPDATE"},{"gtasId":"2215543","tamrId":"80b16245-2dce-3193-9e3f-169a14cd2b5e","version":313,"action":"UPDATE"},{"gtasId":"4238209","tamrId":"faf01de8-3ee6-3c81-865a-29c3d8baae68","version":313,"action":"UPDATE"},{"gtasId":"12251834","tamrId":"964348ff-9894-3c72-aa20-f5e93b9a5a15","version":313,"action":"UPDATE"},{"gtasId":"14550541","tamrId":"cedd395a-c5e0-366f-9ef5-5c2e2e86da14","version":313,"action":"UPDATE"},{"gtasId":"19842724","tamrId":"badc1196-0ecb-30b8-a334-4ea6ef67b63f","version":313,"action":"UPDATE"},{"gtasId":"16360006","tamrId":"0b89f7b6-1f40-313f-aa5e-308c3e882216","version":313,"action":"UPDATE"},{"gtasId":"16080465","tamrId":"fbc26584-d0a7-3c9d-90c3-a20bcd6bb377","version":313,"action":"UPDATE"},{"gtasId":"15418069","tamrId":"f59f5c35-f2c7-3016-9d32-4b3c99da490f","version":313,"action":"UPDATE"},{"gtasId":"13832773","tamrId":"c2a27e14-a33c-3034-bfde-4dbf2c6c1a7b","version":313,"action":"UPDATE"},{"gtasId":"20434894","tamrId":"0254fde0-ee37-30a7-a361-006c239c8952","version":313,"action":"UPDATE"},{"gtasId":"11608588","tamrId":"9957773a-626a-39f9-a2b3-7021c54986f0","version":313,"action":"UPDATE"},{"gtasId":"8204641","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"4436569","tamrId":"b31df345-dd55-343f-876c-4191e82104bc","version":313,"action":"UPDATE"},{"gtasId":"8632466","tamrId":"814a7839-707e-3307-8553-28a37d068af8","version":313,"action":"UPDATE"},{"gtasId":"12420392","tamrId":"50ed6344-c178-3cf0-b377-c44ab3cf4134","version":313,"action":"UPDATE"},{"gtasId":"14490433","tamrId":"9e11b849-2ae5-3957-8e86-42c822aecc78","version":313,"action":"UPDATE"},{"gtasId":"13242083","tamrId":"9fdd7b09-f839-3c8a-8100-056cfae19fa7","version":313,"action":"UPDATE"},{"gtasId":"12100504","tamrId":"a369fae0-07ed-3855-98a1-97a294b40635","version":313,"action":"UPDATE"},{"gtasId":"6970560","tamrId":"00e86f81-fb8b-3f9b-a552-6b16698661d5","version":313,"action":"UPDATE"},{"gtasId":"19550973","tamrId":"00b3c67e-a64b-3744-8bc8-24da64cc2010","version":313,"action":"UPDATE"},{"gtasId":"10868718","tamrId":"dbdd7b2a-3687-3b52-a09f-ca86a65c01d7","version":313,"action":"UPDATE"},{"gtasId":"783532","tamrId":"36ef9370-3db5-3353-8c2d-03008038495c","version":313,"action":"UPDATE"},{"gtasId":"21548101","tamrId":"ca918c2e-eb71-37f0-808e-daf6b082b6d3","version":313,"action":"UPDATE"},{"gtasId":"18408002","tamrId":"9fc5b7a7-da61-3325-a8aa-4a1622d1cdeb","version":313,"action":"UPDATE"},{"gtasId":"13513388","tamrId":"7c4d3090-7022-3163-a138-a46df45035ca","version":313,"action":"UPDATE"},{"gtasId":"23456837","tamrId":"a1fb7d28-3567-3485-8852-14ba46633f4a","version":313,"action":"UPDATE"},{"gtasId":"5586534","tamrId":"dd6b5745-3373-3199-8a04-dfe0c5e26ee5","version":313,"action":"UPDATE"},{"gtasId":"4838078","tamrId":"83241419-9104-3a2a-b669-f4f6575ffaae","version":313,"action":"UPDATE"},{"gtasId":"29875","tamrId":"163505f0-376a-394d-b8fa-9eca0f5c4643","version":313,"action":"UPDATE"},{"gtasId":"10878516","tamrId":"6f2016d8-86f2-3d72-8fac-8f89faeb63d6","version":313,"action":"UPDATE"},{"gtasId":"2490052","tamrId":"57161bb3-355c-3d9a-8aa6-57a986c01599","version":313,"action":"UPDATE"},{"gtasId":"8012142","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"10808202","tamrId":"88c842d5-980a-3523-9a7f-276758719595","version":313,"action":"UPDATE"},{"gtasId":"13608588","tamrId":"fd009587-4f73-3acf-b264-2a1db604cdf1","version":313,"action":"UPDATE"},{"gtasId":"16990314","tamrId":"7805493a-1cd4-3035-8422-950863074976","version":313,"action":"UPDATE"},{"gtasId":"12325090","tamrId":"0ff167fe-a975-379d-baef-9f640b3b45f3","version":313,"action":"UPDATE"},{"gtasId":"3015247","tamrId":"d6757c64-de4d-3517-b6ce-192e30635b38","version":313,"action":"UPDATE"},{"gtasId":"9034395","tamrId":"ba178c60-bafd-39d4-b23e-bd4bf74a8bc0","version":313,"action":"UPDATE"},{"gtasId":"13714795","tamrId":"9355e152-f3b4-337c-9b1b-c76f1575d3e0","version":313,"action":"UPDATE"},{"gtasId":"11819791","tamrId":"b4735b25-bad8-32fc-8269-8f59b18f1704","version":313,"action":"UPDATE"},{"gtasId":"18012582","tamrId":"556b587c-ae7f-3ac2-aaae-eca04fbde78a","version":313,"action":"UPDATE"},{"gtasId":"13981649","tamrId":"74690b04-49a8-3fa2-b55a-5a8c19533543","version":313,"action":"UPDATE"},{"gtasId":"520712","tamrId":"a334f15f-2053-3659-b851-4db35a7f23bc","version":313,"action":"UPDATE"},{"gtasId":"15358168","tamrId":"2ee18789-e388-3fab-810a-2a4e42c90c38","version":313,"action":"UPDATE"},{"gtasId":"18756562","tamrId":"8131ebcf-94a1-30fc-9a7c-7f340f3beee0","version":313,"action":"UPDATE"},{"gtasId":"18777029","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"16532093","tamrId":"71a0ab77-bfeb-36f7-9732-06188d1b0078","version":313,"action":"UPDATE"},{"gtasId":"17807507","tamrId":"a5ab597c-e2e7-3fc4-b698-6acd0ba51cf0","version":313,"action":"UPDATE"},{"gtasId":"8992775","tamrId":"cef4e026-260f-3874-9df1-0d5583156673","version":313,"action":"UPDATE"},{"gtasId":"6575608","tamrId":"b2e7ba3b-3540-3403-be33-002741f75fe5","version":313,"action":"UPDATE"},{"gtasId":"13596500","tamrId":"9d691398-3d24-393a-ab46-926aa430a04f","version":313,"action":"UPDATE"},{"gtasId":"23141522","tamrId":"6f075fa9-82d0-363c-b823-41316141cb47","version":313,"action":"UPDATE"},{"gtasId":"5308547","tamrId":"a239e084-fe5a-301f-a43a-46fece628aee","version":313,"action":"UPDATE"},{"gtasId":"377508","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"1610022","tamrId":"b71f664f-ea25-30f4-849b-b4d2abef009b","version":313,"action":"UPDATE"},{"gtasId":"12901579","tamrId":"2bd57531-190f-30c4-b87a-c973301d49eb","version":313,"action":"UPDATE"},{"gtasId":"19911995","tamrId":"09dcae5e-9e93-3921-8485-6af3d426d0bb","version":313,"action":"UPDATE"},{"gtasId":"12454155","tamrId":"5ac2d6d1-422c-31cd-b143-b2a4c9a05d0c","version":313,"action":"UPDATE"},{"gtasId":"9502265","tamrId":"18902f55-870a-3646-8ca1-240c93a85893","version":313,"action":"UPDATE"},{"gtasId":"9432598","tamrId":"b358996a-ab3c-3d8e-b817-c134464ae76b","version":313,"action":"UPDATE"},{"gtasId":"10369267","tamrId":"4e05f6f8-5028-3a89-aa4f-0823e2cfa3b3","version":313,"action":"UPDATE"},{"gtasId":"237351","tamrId":"3e5c2c2d-0dd5-39ed-bd02-c082b47abe21","version":313,"action":"UPDATE"},{"gtasId":"12279764","tamrId":"131e60dd-fc9b-3d9d-92b9-b4972e99995c","version":313,"action":"UPDATE"},{"gtasId":"11893535","tamrId":"8d3fdce5-c35e-3604-9217-6e8c4822c284","version":313,"action":"UPDATE"},{"gtasId":"13556122","tamrId":"a7d53979-ca83-3fad-be6f-ea96576eaeeb","version":313,"action":"UPDATE"},{"gtasId":"6741195","tamrId":"6507ed1f-f37b-32e9-a18f-d13f914f1a9e","version":313,"action":"UPDATE"},{"gtasId":"18054448","tamrId":"e597496d-ac5c-3ccb-8c0e-dac83cff3c6a","version":313,"action":"UPDATE"},{"gtasId":"3524458","tamrId":"301669ba-d1ce-39a3-948c-ebb43ebd3074","version":313,"action":"UPDATE"},{"gtasId":"12544953","tamrId":"aab6a7b9-a9f7-3593-a8de-09961f6f9bd1","version":313,"action":"UPDATE"},{"gtasId":"22595108","tamrId":"1da97387-fa2b-343a-8b45-303eb6bfdaf5","version":313,"action":"UPDATE"},{"gtasId":"6391308","tamrId":"a369fae0-07ed-3855-98a1-97a294b40635","version":313,"action":"UPDATE"},{"gtasId":"24698780","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"1881002","tamrId":"eaa21de4-9845-3fc7-8ece-301e23f15847","version":313,"action":"UPDATE"},{"gtasId":"9207497","tamrId":"89a8c680-86cc-3759-97b3-f8661abfb75e","version":313,"action":"UPDATE"},{"gtasId":"21777735","tamrId":"93c308f8-1db4-331a-80c1-02e65146b02a","version":313,"action":"UPDATE"},{"gtasId":"3777203","tamrId":"a40c301d-98d8-3cc6-99ab-cb8b418ef70c","version":313,"action":"UPDATE"},{"gtasId":"11763299","tamrId":"9bd2f25f-bc1a-3b08-aa09-0e662bbbfefd","version":313,"action":"UPDATE"},{"gtasId":"14894574","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"9854606","tamrId":"16e04796-279d-32d8-a158-bda8d8ca92e7","version":313,"action":"UPDATE"},{"gtasId":"11654972","tamrId":"b3967353-42db-3352-b8d6-8b37e42d0a0a","version":313,"action":"UPDATE"},{"gtasId":"3008460","tamrId":"7892d218-48d0-381a-8d02-de53fe5d6060","version":313,"action":"UPDATE"},{"gtasId":"1837772","tamrId":"01a8797f-d668-3f21-97d6-2947b8d0af36","version":313,"action":"UPDATE"},{"gtasId":"19504599","tamrId":"6b0bdece-5e2d-363f-bc18-102c768aabea","version":313,"action":"UPDATE"},{"gtasId":"6495776","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"23362851","tamrId":"3bf18bb7-793b-367b-a59a-e9e14a85cff6","version":313,"action":"UPDATE"},{"gtasId":"6549696","tamrId":"f244280a-8e2e-31ce-b0e8-f0e8a4358cb1","version":313,"action":"UPDATE"},{"gtasId":"10922531","tamrId":"b8b33434-2957-306f-9aa5-568025258a01","version":313,"action":"UPDATE"},{"gtasId":"5808790","tamrId":"8ef8c10b-bc0a-329e-92a4-b626ca5a665a","version":313,"action":"UPDATE"},{"gtasId":"13244057","tamrId":"b4f68a12-2331-31c9-aebd-2d4b7150edc2","version":313,"action":"UPDATE"},{"gtasId":"29151","tamrId":"2caba3a0-c6cb-37ec-8628-5d715d4d24de","version":313,"action":"UPDATE"},{"gtasId":"9940258","tamrId":"786fb28c-faa4-3767-aa6f-a3f426e04268","version":313,"action":"UPDATE"},{"gtasId":"8300820","tamrId":"0b0e3124-e200-373a-9921-2b45e82f2cb6","version":313,"action":"UPDATE"},{"gtasId":"16608615","tamrId":"54c0be2d-6545-3ed2-bfed-b646596b685f","version":313,"action":"UPDATE"},{"gtasId":"1764276","tamrId":"f0ed0f83-0c66-3786-97a3-87e3a4db9a3b","version":313,"action":"UPDATE"},{"gtasId":"5648559","tamrId":"660b67f3-e338-3ddc-8f17-4537a6ece2ef","version":313,"action":"UPDATE"},{"gtasId":"20068180","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"15237815","tamrId":"74dd1802-27dc-3568-9251-f320ee4a6d60","version":313,"action":"UPDATE"},{"gtasId":"16150601","tamrId":"8bae7d2b-63fe-3c5b-9701-fa48a0073c74","version":313,"action":"UPDATE"},{"gtasId":"10535714","tamrId":"a0b6038c-e83a-32fb-a8dd-f6b257037ba1","version":313,"action":"UPDATE"},{"gtasId":"15731602","tamrId":"fcad2160-42f7-3cec-9f49-60fc8a9769d2","version":313,"action":"UPDATE"},{"gtasId":"2988105","tamrId":"38108d3f-6190-3b3c-923d-32731a8f356c","version":313,"action":"UPDATE"},{"gtasId":"8189092","tamrId":"d9bf2be7-3428-367a-9f53-eb58fb7155c8","version":313,"action":"UPDATE"},{"gtasId":"2673824","tamrId":"68a89ec2-d76c-347f-907f-ed9d73460ba6","version":313,"action":"UPDATE"},{"gtasId":"11002902","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"5475059","tamrId":"0503a33d-114b-342e-9d3e-3c79a82c14ef","version":313,"action":"UPDATE"},{"gtasId":"23751888","tamrId":"588e3e09-1641-3ab2-b514-ace828b7445f","version":313,"action":"UPDATE"},{"gtasId":"16500254","tamrId":"b826bddb-6c9f-3ca3-857e-e0f0b5cdc78a","version":313,"action":"UPDATE"},{"gtasId":"22133169","tamrId":"e4922d93-d966-3229-847c-3e2a846f2bbe","version":313,"action":"UPDATE"},{"gtasId":"24560554","tamrId":"8ce58825-b41f-3b3a-8e73-f01ef3e95c13","version":313,"action":"UPDATE"},{"gtasId":"15087871","tamrId":"6ece2d61-8882-3463-80f1-06a75fdf4219","version":313,"action":"UPDATE"},{"gtasId":"17071395","tamrId":"4cd48d71-27a8-3ce6-878c-f070306490fe","version":313,"action":"UPDATE"},{"gtasId":"22571583","tamrId":"efa26c9e-3713-3a59-8033-26c0fd9777e0","version":313,"action":"UPDATE"},{"gtasId":"8580130","tamrId":"aa4fa987-68f1-32cb-9b3e-54a7f34e5fdd","version":313,"action":"UPDATE"},{"gtasId":"8618670","tamrId":"260063e5-d0bb-344a-81d8-ce327ab00509","version":313,"action":"UPDATE"},{"gtasId":"19013102","tamrId":"0fe75e62-fd05-3df4-a6e5-d7905c0d7e5e","version":313,"action":"UPDATE"},{"gtasId":"9599402","tamrId":"6e63bbae-1756-3659-8781-ed050cd2f394","version":313,"action":"UPDATE"},{"gtasId":"11905659","tamrId":"dd6b5745-3373-3199-8a04-dfe0c5e26ee5","version":313,"action":"UPDATE"},{"gtasId":"2540082","tamrId":"a3667f52-1e3f-3767-a181-f352d8c97916","version":313,"action":"UPDATE"},{"gtasId":"14104457","tamrId":"9c75a458-43c2-38bf-9fdc-5f235da9290e","version":313,"action":"UPDATE"},{"gtasId":"25115294","tamrId":"ff54abf3-3101-370e-90ac-8059de22620b","version":313,"action":"UPDATE"},{"gtasId":"9349779","tamrId":"08dc6944-5543-32f1-a574-b6a4156cec44","version":313,"action":"UPDATE"},{"gtasId":"25067292","tamrId":"b36386bb-30c3-37bd-a69d-ca1ff9f5ddbd","version":313,"action":"UPDATE"},{"gtasId":"6929722","tamrId":"37f93d71-1dad-3e2f-9956-449981a28171","version":313,"action":"UPDATE"},{"gtasId":"13786278","tamrId":"08bc567c-74d2-3bdb-9770-cefbabe99f98","version":313,"action":"UPDATE"},{"gtasId":"4552367","tamrId":"a3d38cc9-12e7-34d3-8a55-4bfea0cda0fc","version":313,"action":"UPDATE"},{"gtasId":"3146366","tamrId":"a8d4edce-c8f6-3fc0-a6dd-da9f373f796e","version":313,"action":"UPDATE"},{"gtasId":"16103440","tamrId":"c5845f2f-3f0b-34ca-8ad5-af182867e869","version":313,"action":"UPDATE"},{"gtasId":"7623127","tamrId":"0fd2b767-ebe9-3a7b-9446-f3b2dc7989b9","version":313,"action":"UPDATE"},{"gtasId":"90232","tamrId":"db17d2a7-a4a0-30a2-8ecf-6d330aed947b","version":313,"action":"UPDATE"},{"gtasId":"9661940","tamrId":"f6a263e7-7e04-3887-91fd-fdd632a51663","version":313,"action":"UPDATE"},{"gtasId":"7235840","tamrId":"b0875a98-e97e-3876-92c9-22d827450f8b","version":313,"action":"UPDATE"},{"gtasId":"18982527","tamrId":"a38c566a-2bcb-30dd-9579-0cebb8088723","version":313,"action":"UPDATE"},{"gtasId":"11551809","tamrId":"1737469e-f4d9-36e1-a8df-28949ab1efdf","version":313,"action":"UPDATE"},{"gtasId":"17540560","tamrId":"e90e2ef1-9d8d-37e0-8949-b9aef4903550","version":313,"action":"UPDATE"},{"gtasId":"8474908","tamrId":"f336e387-5b21-33fb-9a47-9b219c38fe6f","version":313,"action":"UPDATE"},{"gtasId":"13982591","tamrId":"0c5013d7-f284-36ce-aa5d-4dd49194723e","version":313,"action":"UPDATE"},{"gtasId":"13137717","tamrId":"ae256927-c75b-357c-8c69-5fb5a0719efa","version":313,"action":"UPDATE"},{"gtasId":"2908881","tamrId":"8c16752f-4976-3c1b-b186-b85a35390614","version":313,"action":"UPDATE"},{"gtasId":"5710853","tamrId":"981a726a-b4b5-328c-ad00-217660746b93","version":313,"action":"UPDATE"},{"gtasId":"10164549","tamrId":"13e964a5-88fc-3d2c-94b0-99774643f063","version":313,"action":"UPDATE"},{"gtasId":"17336203","tamrId":"2dbd60ef-3276-352a-ac43-83512784ed5f","version":313,"action":"UPDATE"},{"gtasId":"9584387","tamrId":"0b66fec1-b167-380e-982a-0918a86b8f5c","version":313,"action":"UPDATE"},{"gtasId":"7294680","tamrId":"8accbc18-704d-3aa9-9e14-e9ae0855ae43","version":313,"action":"UPDATE"},{"gtasId":"156460","tamrId":"ba6712f3-9e2a-322f-abca-95715a8dd84e","version":313,"action":"UPDATE"},{"gtasId":"9199339","tamrId":"2c8b7581-9b8b-3028-a350-033b6cd39deb","version":313,"action":"UPDATE"},{"gtasId":"15768084","tamrId":"890f2a9f-47b5-397b-937a-472a7e8c379c","version":313,"action":"UPDATE"},{"gtasId":"11620763","tamrId":"58b223a7-ad93-3d75-b7b2-afc097416353","version":313,"action":"UPDATE"},{"gtasId":"16977736","tamrId":"2cfd875d-8f26-37a1-8da9-c9bad5433538","version":313,"action":"UPDATE"},{"gtasId":"10050164","tamrId":"97c86320-5ff7-354f-a37e-95c595d9c439","version":313,"action":"UPDATE"},{"gtasId":"7828428","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"2501748","tamrId":"c85fe971-c5b6-3321-a7d3-02f28a02079f","version":313,"action":"UPDATE"},{"gtasId":"17266888","tamrId":"f0eef61e-8d65-313e-9ef0-cd9f09fbecfe","version":313,"action":"UPDATE"},{"gtasId":"12984073","tamrId":"829cd0e3-4ae5-3377-895e-3f32cbcc1389","version":313,"action":"UPDATE"},{"gtasId":"15350606","tamrId":"4be2311b-dab6-3fa5-b559-9591eb6d1828","version":313,"action":"UPDATE"},{"gtasId":"9040440","tamrId":"71bdfa76-8301-3319-8044-03e4644867d7","version":313,"action":"UPDATE"},{"gtasId":"11876153","tamrId":"ec5b47af-82e2-36e3-af72-9db5e590416f","version":313,"action":"UPDATE"},{"gtasId":"6597359","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"17665231","tamrId":"e7fd8ad5-1514-3b8c-ba27-d7c1a0e9b91c","version":313,"action":"UPDATE"},{"gtasId":"7769197","tamrId":"ccaf65eb-8668-3769-b2d8-04a765a1d785","version":313,"action":"UPDATE"},{"gtasId":"5787757","tamrId":"5c7481ee-2e96-34b8-8897-292527cc7818","version":313,"action":"UPDATE"},{"gtasId":"16097292","tamrId":"eab885f4-c489-3007-8bed-52bbe5e30168","version":313,"action":"UPDATE"},{"gtasId":"6651364","tamrId":"3d242b43-6512-3837-9704-9ac5c000837c","version":313,"action":"UPDATE"},{"gtasId":"11056368","tamrId":"7ef13dbb-bbc4-3f4a-9a4b-4d512df93bbb","version":313,"action":"UPDATE"},{"gtasId":"23455928","tamrId":"1de0ff64-5897-358e-bf82-453bea2d84d8","version":313,"action":"UPDATE"},{"gtasId":"12233561","tamrId":"c27965a0-b560-35a5-b857-1776de06ff84","version":313,"action":"UPDATE"},{"gtasId":"17955960","tamrId":"a38c566a-2bcb-30dd-9579-0cebb8088723","version":313,"action":"UPDATE"},{"gtasId":"9602759","tamrId":"de17150a-e541-32ad-b1c9-cbe17db1c5c2","version":313,"action":"UPDATE"},{"gtasId":"15588272","tamrId":"5d2fb89e-8440-3da1-b091-010018fd8b95","version":313,"action":"UPDATE"},{"gtasId":"25187787","tamrId":"2ef854ae-1b0b-3277-98ad-9b3c4fb17219","version":313,"action":"UPDATE"},{"gtasId":"15420406","tamrId":"8c43b555-d964-3cca-8e35-5c16993ee025","version":313,"action":"UPDATE"},{"gtasId":"22116648","tamrId":"5537102a-f0d8-37ab-bfd3-3675b555aab7","version":313,"action":"UPDATE"},{"gtasId":"17857956","tamrId":"dec583ce-3d95-339e-8766-37ed9161d8a8","version":313,"action":"UPDATE"},{"gtasId":"9579434","tamrId":"acac0ccc-b5a0-342e-9e6c-cdeac5dd1bde","version":313,"action":"UPDATE"},{"gtasId":"9206550","tamrId":"983357f5-db4e-31f6-96ba-db271669318f","version":313,"action":"UPDATE"},{"gtasId":"3578230","tamrId":"5a5bf797-d9db-3ef7-b112-449ab94d8c25","version":313,"action":"UPDATE"},{"gtasId":"2883234","tamrId":"ef7908fe-474d-3545-b844-599c777047a4","version":313,"action":"UPDATE"},{"gtasId":"16971536","tamrId":"a7d53979-ca83-3fad-be6f-ea96576eaeeb","version":313,"action":"UPDATE"},{"gtasId":"25260986","tamrId":"d6a7ab9a-3a3e-3ccf-8a9a-16306ad810c2","version":313,"action":"UPDATE"},{"gtasId":"20632165","tamrId":"556a346a-48c8-3816-a95a-e56280b0f305","version":313,"action":"UPDATE"},{"gtasId":"17941771","tamrId":"743fcb54-f3bb-3773-8056-f37ff047c4a5","version":313,"action":"UPDATE"},{"gtasId":"20612555","tamrId":"0944f8e5-512c-37ce-8156-c3ac69996a47","version":313,"action":"UPDATE"},{"gtasId":"16227293","tamrId":"060e6b6a-a1e8-307e-a555-151565a9447c","version":313,"action":"UPDATE"},{"gtasId":"25098421","tamrId":"8672d82e-9a32-3b12-ab0d-6065af8bf94c","version":313,"action":"UPDATE"},{"gtasId":"11462292","tamrId":"49c5c2c3-0993-34f2-b6be-49bce89304a8","version":313,"action":"UPDATE"},{"gtasId":"6191019","tamrId":"05587c30-2e1f-3e16-acf6-89b803a78b4c","version":313,"action":"UPDATE"},{"gtasId":"22718566","tamrId":"1bf5d36e-1cf1-32ca-ae8e-b7e3abbc394c","version":313,"action":"UPDATE"},{"gtasId":"7932991","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"11783289","tamrId":"c9f783a3-ebaf-3ae6-a054-afa4efdb1f9a","version":313,"action":"UPDATE"},{"gtasId":"8308378","tamrId":"11c0eca8-58b8-3877-b2ea-dbcbbe78ade7","version":313,"action":"UPDATE"},{"gtasId":"20135485","tamrId":"84155f33-250f-35c3-8213-0087f2230451","version":313,"action":"UPDATE"},{"gtasId":"21179397","tamrId":"63851e4b-0500-30c4-a874-dfdaa0bc1f3c","version":313,"action":"UPDATE"},{"gtasId":"1990885","tamrId":"ef33a09b-41a5-3c9c-b328-2ab28e87ac3b","version":313,"action":"UPDATE"},{"gtasId":"6603231","tamrId":"da1e409f-0bc6-3be5-83f5-7f5402697613","version":313,"action":"UPDATE"},{"gtasId":"3352632","tamrId":"9cecfb9d-9012-3a75-a941-4d2c01f7481d","version":313,"action":"UPDATE"},{"gtasId":"8787425","tamrId":"946605a0-e1eb-3339-b71b-da25a52f8ae1","version":313,"action":"UPDATE"},{"gtasId":"17424433","tamrId":"5e296c63-72fa-303a-b56b-c8ffc03596ff","version":313,"action":"UPDATE"},{"gtasId":"616391","tamrId":"7712523b-37a3-3b1a-a4b8-13576f24f527","version":313,"action":"UPDATE"},{"gtasId":"3391203","tamrId":"889a22a7-a973-39b5-987c-6c0dc6e369a8","version":313,"action":"UPDATE"},{"gtasId":"1838227","tamrId":"ca5cf17d-583e-38b4-bcd0-2c6198268193","version":313,"action":"UPDATE"},{"gtasId":"3642798","tamrId":"81d3f830-09c8-372d-9bd6-009824bb4689","version":313,"action":"UPDATE"},{"gtasId":"7890212","tamrId":"bad4946c-0096-300a-a785-2b6f71ff1e2e","version":313,"action":"UPDATE"},{"gtasId":"3013894","tamrId":"7f9ba6d7-919c-34f5-822a-3bebd28a6538","version":313,"action":"UPDATE"},{"gtasId":"12318803","tamrId":"c83414ac-b7b4-3f8d-bbff-ca9570ef11ae","version":313,"action":"UPDATE"},{"gtasId":"20181364","tamrId":"c2399ea8-d083-3bb3-a67e-781a9c6566b1","version":313,"action":"UPDATE"},{"gtasId":"8684532","tamrId":"091196f9-7061-3b51-8330-3d9f8580560d","version":313,"action":"UPDATE"},{"gtasId":"3082890","tamrId":"a91189f8-c9d1-3c99-b554-546d898ee730","version":313,"action":"UPDATE"},{"gtasId":"17120474","tamrId":"fdb60455-0080-3cdb-be3d-6eb7b9c9cc7d","version":313,"action":"UPDATE"},{"gtasId":"15193784","tamrId":"7b770829-30e5-35cd-91bc-3a315c61d6bd","version":313,"action":"UPDATE"},{"gtasId":"3274268","tamrId":"f33f4960-83ba-3a6a-93a3-4945b0e73c7f","version":313,"action":"UPDATE"},{"gtasId":"17077998","tamrId":"f76854af-3ce1-3476-b56d-27a27533d215","version":313,"action":"UPDATE"},{"gtasId":"5193240","tamrId":"b33ce611-eedd-3c94-9e5c-78a923d5a161","version":313,"action":"UPDATE"},{"gtasId":"12048718","tamrId":"76da171f-a71c-3283-bf83-7984db56adb9","version":313,"action":"UPDATE"},{"gtasId":"21621492","tamrId":"d5716f01-e5a6-3de4-8328-a6c8a1e89958","version":313,"action":"UPDATE"},{"gtasId":"11239254","tamrId":"d4d00536-872c-35df-bdcb-2911785a6cd0","version":313,"action":"UPDATE"},{"gtasId":"4855073","tamrId":"5060ac00-efe1-3cad-b29f-b447460f4f09","version":313,"action":"UPDATE"},{"gtasId":"22353085","tamrId":"bff2a81b-3d86-3096-a44b-624383ad4fa6","version":313,"action":"UPDATE"},{"gtasId":"7814216","tamrId":"e6a93534-a578-3d58-b1de-a70907aca736","version":313,"action":"UPDATE"},{"gtasId":"4337344","tamrId":"52a35224-3960-3834-b15d-5781735b3042","version":313,"action":"UPDATE"},{"gtasId":"3422802","tamrId":"4a5b5d55-dd70-3f53-955e-bd77d906392d","version":313,"action":"UPDATE"},{"gtasId":"7383756","tamrId":"c2639bbf-7b94-3e94-a279-3b994144183a","version":313,"action":"UPDATE"},{"gtasId":"3692166","tamrId":"ca481c7d-50d6-30e9-8d35-19a7c0ef227a","version":313,"action":"UPDATE"},{"gtasId":"10244533","tamrId":"6f9d0725-86eb-3742-a86c-02047d7a00c7","version":313,"action":"UPDATE"},{"gtasId":"19366992","tamrId":"973eb2aa-4458-3938-b38d-af2da61fa392","version":313,"action":"UPDATE"},{"gtasId":"1462196","tamrId":"3e37b22e-af7d-3b14-abea-b5de1cd12dab","version":313,"action":"UPDATE"},{"gtasId":"11605978","tamrId":"42341623-85b2-311f-b77b-93521f5382a3","version":313,"action":"UPDATE"},{"gtasId":"11521565","tamrId":"df8b64d6-9248-3e98-bd6d-fa11e50c1a86","version":313,"action":"UPDATE"},{"gtasId":"20195515","tamrId":"38751ae3-6a6f-338c-aa80-d51e3ba74a4c","version":313,"action":"UPDATE"},{"gtasId":"4554131","tamrId":"b0f9028b-02f7-3aa6-96cd-20ef16b9f9e4","version":313,"action":"UPDATE"},{"gtasId":"355011","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"22050062","tamrId":"25638bc9-263d-3f97-a797-ac799222f80c","version":313,"action":"UPDATE"},{"gtasId":"21599232","tamrId":"e25fe495-7e2c-3f80-970a-86b5dcfa91a2","version":313,"action":"UPDATE"},{"gtasId":"10697647","tamrId":"47a83aae-1e71-313f-9fd0-8329ac89a4ff","version":313,"action":"UPDATE"},{"gtasId":"5486583","tamrId":"4bfa3a73-6b39-3df5-ab74-a1859da84142","version":313,"action":"UPDATE"},{"gtasId":"22650919","tamrId":"f6aa3818-3e99-371c-bdcc-3d09613ad6a5","version":313,"action":"UPDATE"},{"gtasId":"13484119","tamrId":"853a76fd-d8e6-3eda-917d-aa491bd822c4","version":313,"action":"UPDATE"},{"gtasId":"22320174","tamrId":"fea22be9-3618-32f2-b63e-7f61b9717a89","version":313,"action":"UPDATE"},{"gtasId":"9074218","tamrId":"7d8a4e3a-b625-3690-b020-767dccca6ddc","version":313,"action":"UPDATE"},{"gtasId":"11893106","tamrId":"b5918aa9-5d0b-3c69-8e0a-843f16ccaa0c","version":313,"action":"UPDATE"},{"gtasId":"11053210","tamrId":"0603019e-a150-3360-be7d-6a15a2c5fe65","version":313,"action":"UPDATE"},{"gtasId":"22972763","tamrId":"78aeccad-7e71-30db-9802-4c8b383029cd","version":313,"action":"UPDATE"},{"gtasId":"16626444","tamrId":"61130ca4-b130-3c0f-a547-fd0b9428c48f","version":313,"action":"UPDATE"},{"gtasId":"5719680","tamrId":"a5f0b81b-2869-3d79-9150-3915275923a6","version":313,"action":"UPDATE"},{"gtasId":"17187141","tamrId":"24841422-bb11-3243-b6ae-54d2093a4303","version":313,"action":"UPDATE"},{"gtasId":"3088171","tamrId":"8585c549-56bf-3c7b-8a7b-c5b77b91183f","version":313,"action":"UPDATE"},{"gtasId":"22143364","tamrId":"52293965-9889-3669-869c-856383add0f5","version":313,"action":"UPDATE"},{"gtasId":"289838","tamrId":"62134397-e023-3189-9779-4182863850b2","version":313,"action":"UPDATE"},{"gtasId":"11035879","tamrId":"e9cb5897-5bb1-35b1-88a0-c587b6924f9f","version":313,"action":"UPDATE"},{"gtasId":"6835568","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"16010997","tamrId":"17921397-f5e9-3feb-8606-1445effcb86e","version":313,"action":"UPDATE"},{"gtasId":"6365063","tamrId":"e170eaa7-18f1-36c7-880f-d0a56031aee3","version":313,"action":"UPDATE"},{"gtasId":"13564177","tamrId":"6c597c96-a403-39e7-8fc8-c3907d70c921","version":313,"action":"UPDATE"},{"gtasId":"231687","tamrId":"1b1a136f-b45d-3726-9159-630f07ce0298","version":313,"action":"UPDATE"},{"gtasId":"12175916","tamrId":"61f4797e-f546-310b-bf43-509ad360c6e6","version":313,"action":"UPDATE"},{"gtasId":"3986486","tamrId":"af5410ef-bd90-3fec-9416-f41059a0964f","version":313,"action":"UPDATE"},{"gtasId":"6537603","tamrId":"2b748862-4602-38d9-9cb6-db85556dfd73","version":313,"action":"UPDATE"},{"gtasId":"17763101","tamrId":"7783e476-4247-32dc-82d0-be163456ccd4","version":313,"action":"UPDATE"},{"gtasId":"326899","tamrId":"2b8a84cb-dbd8-30ea-8442-8d9eaa5e26ef","version":313,"action":"UPDATE"},{"gtasId":"12335342","tamrId":"546ae436-8e2b-332a-b00a-e6fcc824eea1","version":313,"action":"UPDATE"},{"gtasId":"14050085","tamrId":"636e93e7-773e-3513-bdac-dee80ad6c073","version":313,"action":"UPDATE"},{"gtasId":"20040236","tamrId":"dd6b5745-3373-3199-8a04-dfe0c5e26ee5","version":313,"action":"UPDATE"},{"gtasId":"19208831","tamrId":"bcaf15a9-3515-3caf-9e95-3e1a6c2f6b7a","version":313,"action":"UPDATE"},{"gtasId":"24425112","tamrId":"5381d0d7-8721-3dc5-876e-b07cd075b6cd","version":313,"action":"UPDATE"},{"gtasId":"5337741","tamrId":"9d106bbe-676f-3534-b759-c1f432cdbeb7","version":313,"action":"UPDATE"},{"gtasId":"966534","tamrId":"8f9377c5-8ec4-3d44-a0c4-a55c8242bef0","version":313,"action":"UPDATE"},{"gtasId":"17797758","tamrId":"56c2fe66-10a3-3582-a33c-47a439dd6d43","version":313,"action":"UPDATE"},{"gtasId":"22154024","tamrId":"3a32d227-14f7-3849-82d9-0159c7399ca7","version":313,"action":"UPDATE"},{"gtasId":"6511469","tamrId":"903ce36c-375f-35fa-b48b-2dfbac10f495","version":313,"action":"UPDATE"},{"gtasId":"11650567","tamrId":"53811d28-e6b9-3e77-857a-d121327f4dc0","version":313,"action":"UPDATE"},{"gtasId":"18715008","tamrId":"7e97bf20-9f50-308c-b1f5-19d13247626b","version":313,"action":"UPDATE"},{"gtasId":"2818621","tamrId":"d72c9ee9-581f-37e7-86bc-8503ae98d396","version":313,"action":"UPDATE"},{"gtasId":"23658880","tamrId":"ad2bc239-59f8-3dea-9d02-0ea0a2cdd9d0","version":313,"action":"UPDATE"},{"gtasId":"12378020","tamrId":"73a8edd4-bbf0-3787-b73a-3d0448343cbd","version":313,"action":"UPDATE"},{"gtasId":"16836987","tamrId":"4c795834-ffa6-3b5f-982c-614e0ee5e059","version":313,"action":"UPDATE"},{"gtasId":"6849746","tamrId":"1da48111-1684-3303-b778-74ae95d91b19","version":313,"action":"UPDATE"},{"gtasId":"11557529","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"7081918","tamrId":"0262174b-32c6-3528-a23c-55686e6ccfa8","version":313,"action":"UPDATE"},{"gtasId":"3357020","tamrId":"4554cd9b-022f-31ec-93f8-9e8afef92e69","version":313,"action":"UPDATE"},{"gtasId":"2745533","tamrId":"fefe49fd-fe65-336c-9161-93b6edcce0ba","version":313,"action":"UPDATE"},{"gtasId":"17343331","tamrId":"e1e9b2b3-2bbb-35e0-a5e4-05bcb8473492","version":313,"action":"UPDATE"},{"gtasId":"7637321","tamrId":"1a7de034-6e8f-3a13-8512-8284928bf052","version":313,"action":"UPDATE"},{"gtasId":"182332","tamrId":"6d7e4d16-d139-328a-b896-8f77c64f63bd","version":313,"action":"UPDATE"},{"gtasId":"9486984","tamrId":"5c16678d-be8c-33b9-a784-d8e282b2fa48","version":313,"action":"UPDATE"},{"gtasId":"8803897","tamrId":"91df3c19-1e7f-3a7b-b5a4-11227f95218b","version":313,"action":"UPDATE"},{"gtasId":"11409604","tamrId":"d06b0007-0151-3746-9b30-ab1a492ce686","version":313,"action":"UPDATE"},{"gtasId":"6090779","tamrId":"cd9b9b41-2853-3b75-835f-8fcb56b7af23","version":313,"action":"UPDATE"},{"gtasId":"7057851","tamrId":"289aa9ea-54c2-3075-9062-744f08c102e4","version":313,"action":"UPDATE"},{"gtasId":"22228428","tamrId":"e5735ec5-3af0-3100-a88e-79aac54c0fff","version":313,"action":"UPDATE"},{"gtasId":"1021381","tamrId":"e8815ccd-8cff-3d68-a372-60ff258f2df3","version":313,"action":"UPDATE"},{"gtasId":"18123557","tamrId":"609c3531-ea2b-31db-9067-069fdf7c95a8","version":313,"action":"UPDATE"},{"gtasId":"3494066","tamrId":"48fe5ece-8e4d-33c8-b510-25799dcc4f9a","version":313,"action":"UPDATE"},{"gtasId":"12662623","tamrId":"3d4ea65f-de97-3e45-bc8d-213e8201b9ca","version":313,"action":"UPDATE"},{"gtasId":"9637434","tamrId":"040742dd-7349-3a55-bf89-cb5c9151e92d","version":313,"action":"UPDATE"},{"gtasId":"4441201","tamrId":"b894a6e9-de27-3f75-ac83-962f8ca1ba41","version":313,"action":"UPDATE"},{"gtasId":"4514627","tamrId":"91beacd4-dba3-3934-87ea-12428253b655","version":313,"action":"UPDATE"},{"gtasId":"1933415","tamrId":"9dc981df-b132-32b8-9b29-d64a071630a5","version":313,"action":"UPDATE"},{"gtasId":"19186183","tamrId":"46f50e6d-44a5-32f7-a72c-c05f9fde2de5","version":313,"action":"UPDATE"},{"gtasId":"20929403","tamrId":"87b6d49b-8f0c-3548-809e-ef476995e58c","version":313,"action":"UPDATE"},{"gtasId":"23793292","tamrId":"1fc749aa-0217-3c93-9792-8568568d958b","version":313,"action":"UPDATE"},{"gtasId":"8928584","tamrId":"ac7493a9-2767-39f4-add4-ac4cd755ef40","version":313,"action":"UPDATE"},{"gtasId":"25101644","tamrId":"3872c1a1-53bf-3baf-8042-a728ca766312","version":313,"action":"UPDATE"},{"gtasId":"7371739","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"421847","tamrId":"9dc981df-b132-32b8-9b29-d64a071630a5","version":313,"action":"UPDATE"},{"gtasId":"3373841","tamrId":"6118c42a-1053-34a9-982d-977bc6c3c88d","version":313,"action":"UPDATE"},{"gtasId":"21691866","tamrId":"0136f7cc-5192-3af3-a681-c97ad2aa59a3","version":313,"action":"UPDATE"},{"gtasId":"2939648","tamrId":"51fc5f41-69e9-3cca-8618-704acf2e7bb0","version":313,"action":"UPDATE"},{"gtasId":"15391894","tamrId":"41440ddb-3103-3a5f-93f6-79237ac2370b","version":313,"action":"UPDATE"},{"gtasId":"8701129","tamrId":"3bfa2e9b-994e-3282-a870-cb7247616711","version":313,"action":"UPDATE"},{"gtasId":"7044477","tamrId":"cfe336f0-41eb-321c-93ba-6db450bb62ae","version":313,"action":"UPDATE"},{"gtasId":"9373045","tamrId":"e8dfa667-f12e-3901-97c5-d30c2f1adae1","version":313,"action":"UPDATE"},{"gtasId":"10496924","tamrId":"0254fde0-ee37-30a7-a361-006c239c8952","version":313,"action":"UPDATE"},{"gtasId":"24555515","tamrId":"fc9f9d54-16d2-3394-a75e-e258033fa52a","version":313,"action":"UPDATE"},{"gtasId":"21928574","tamrId":"d1983760-aa61-34bf-a7a6-05cf12e22bec","version":313,"action":"UPDATE"},{"gtasId":"10161407","tamrId":"6597486b-3a17-33fd-b614-728b9d76678f","version":313,"action":"UPDATE"},{"gtasId":"11164444","tamrId":"aede10ba-194a-3fab-b385-bb04f1fddb9a","version":313,"action":"UPDATE"},{"gtasId":"18233864","tamrId":"28e68324-9274-332e-bb10-7af5bfcfc434","version":313,"action":"UPDATE"},{"gtasId":"7180281","tamrId":"60d0d1fd-2ba1-38fd-87fa-8e68041b9c15","version":313,"action":"UPDATE"},{"gtasId":"9555051","tamrId":"e8a788d3-c73e-33d3-9dde-71c99f28291c","version":313,"action":"UPDATE"},{"gtasId":"6694433","tamrId":"01a34f0f-0dcb-3838-bca2-68cbc224ab76","version":313,"action":"UPDATE"},{"gtasId":"3716612","tamrId":"000ca59c-0ee0-3289-aae3-a8df1060d7d4","version":313,"action":"UPDATE"},{"gtasId":"14553072","tamrId":"7586cf0b-4084-312d-ac60-479dc2dc31fe","version":313,"action":"UPDATE"},{"gtasId":"2849702","tamrId":"ebc0132f-cd73-3dae-ac9a-afda2df17c9f","version":313,"action":"UPDATE"},{"gtasId":"22095289","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"19158602","tamrId":"f83ce60d-9f2d-350d-8925-f6ee604857aa","version":313,"action":"UPDATE"},{"gtasId":"12878492","tamrId":"cd9e0e9b-4c9d-3875-a6e1-1cff95904dfe","version":313,"action":"UPDATE"},{"gtasId":"9489105","tamrId":"d7944c04-e24e-3734-a0c7-2b48e3e92a0b","version":313,"action":"UPDATE"},{"gtasId":"11966100","tamrId":"8b694581-f97f-3b2f-8ab9-ef069364b84b","version":313,"action":"UPDATE"},{"gtasId":"8994804","tamrId":"91ca13f8-444c-3409-a25e-ae9265cacd91","version":313,"action":"UPDATE"},{"gtasId":"14604753","tamrId":"131135e6-47b8-37f8-b0fc-0515491e99de","version":313,"action":"UPDATE"},{"gtasId":"18845084","tamrId":"9380dd0f-785b-3495-8e31-2c87499b1280","version":313,"action":"UPDATE"},{"gtasId":"6376974","tamrId":"9c122cec-fe0e-35e8-97a4-eb9e6597b116","version":313,"action":"UPDATE"},{"gtasId":"16154646","tamrId":"18beb66b-e84a-304e-94d2-7db9f193404e","version":313,"action":"UPDATE"},{"gtasId":"1935648","tamrId":"7f1139ca-94f2-35f1-8ec0-7a352c0fdbe9","version":313,"action":"UPDATE"},{"gtasId":"7171364","tamrId":"0b168486-8f2a-34c3-a1a3-7b63667a3f14","version":313,"action":"UPDATE"},{"gtasId":"10626021","tamrId":"0d489f24-9685-3966-9954-6ddd332eecfc","version":313,"action":"UPDATE"},{"gtasId":"8576456","tamrId":"dbe9ce0f-22b0-3523-ba4c-7fba1479d7cf","version":313,"action":"UPDATE"},{"gtasId":"21403422","tamrId":"5de7c36a-7b7a-397a-ae05-8ce7a58872ad","version":313,"action":"UPDATE"},{"gtasId":"18660825","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"9765584","tamrId":"bbafc720-ca3f-334d-955a-1e96df000778","version":313,"action":"UPDATE"},{"gtasId":"9547462","tamrId":"40fe0447-4b12-3902-aa88-baac6b439741","version":313,"action":"UPDATE"},{"gtasId":"4524330","tamrId":"a99152ff-d3dc-3fc3-aa59-b9fb4943c72b","version":313,"action":"UPDATE"},{"gtasId":"22440365","tamrId":"9380dd0f-785b-3495-8e31-2c87499b1280","version":313,"action":"UPDATE"},{"gtasId":"2778529","tamrId":"a13ccbcd-1f69-36ac-a432-443bb7ebc1e2","version":313,"action":"UPDATE"},{"gtasId":"16026438","tamrId":"4c6bc104-e52e-3bf8-95a6-2b7238279fc4","version":313,"action":"UPDATE"},{"gtasId":"18996394","tamrId":"db7a6ba8-5b17-335d-9b23-3c82d4cea813","version":313,"action":"UPDATE"},{"gtasId":"23619609","tamrId":"05c55da3-731a-3302-adf8-7160764bdabf","version":313,"action":"UPDATE"},{"gtasId":"17080771","tamrId":"7370cf92-09cd-3af8-9029-538b4b3d42e1","version":313,"action":"UPDATE"},{"gtasId":"23426900","tamrId":"f33f4960-83ba-3a6a-93a3-4945b0e73c7f","version":313,"action":"UPDATE"},{"gtasId":"16043830","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"21564545","tamrId":"df4abf7c-d725-39a6-b2a2-58cd5bb5680d","version":313,"action":"UPDATE"},{"gtasId":"8073419","tamrId":"88ab0d4a-1e37-3b38-acc2-8244615e5b89","version":313,"action":"UPDATE"},{"gtasId":"17093609","tamrId":"08c7f7fb-2f92-30e9-9ed8-b7250b2129d3","version":313,"action":"UPDATE"},{"gtasId":"20170615","tamrId":"4afb4de1-a446-3ccb-abb4-fb1d21f363af","version":313,"action":"UPDATE"},{"gtasId":"6554178","tamrId":"95496749-15a0-39df-bc2f-7714af13364e","version":313,"action":"UPDATE"},{"gtasId":"12409228","tamrId":"7396bbe6-1cc6-3ff1-8ef8-f8f7315621ff","version":313,"action":"UPDATE"},{"gtasId":"6258532","tamrId":"175a22bd-9111-323b-9903-e1e9abd097bd","version":313,"action":"UPDATE"},{"gtasId":"8096120","tamrId":"40d562e0-089b-320c-ae21-eeaa62fc7541","version":313,"action":"UPDATE"},{"gtasId":"17571341","tamrId":"0d0f1f0d-8590-3606-9372-9ed87f085536","version":313,"action":"UPDATE"},{"gtasId":"16703550","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"14109679","tamrId":"ea547e82-be76-3560-b5e4-95fa18d629d5","version":313,"action":"UPDATE"},{"gtasId":"14064788","tamrId":"2ef854ae-1b0b-3277-98ad-9b3c4fb17219","version":313,"action":"UPDATE"},{"gtasId":"506360","tamrId":"94b1f6d8-d371-30ff-862d-9bec1059cb6a","version":313,"action":"UPDATE"},{"gtasId":"3849297","tamrId":"c81e75cb-b28b-32f1-8d7b-a8ba6d4bbe49","version":313,"action":"UPDATE"},{"gtasId":"23999755","tamrId":"3f18bb88-f6a3-36fc-8521-f742527cdf27","version":313,"action":"UPDATE"},{"gtasId":"25350468","tamrId":"b4c3ef03-a7d9-39c5-b0c8-9328ea5e042b","version":313,"action":"UPDATE"},{"gtasId":"20650465","tamrId":"c1402a50-1dee-3255-bd99-f204b5287072","version":313,"action":"UPDATE"},{"gtasId":"9570664","tamrId":"6f8f3b34-cdae-33fd-a475-90a25b9c8a77","version":313,"action":"UPDATE"},{"gtasId":"3661967","tamrId":"a8797514-8bbb-324f-a14e-42db20eb178c","version":313,"action":"UPDATE"},{"gtasId":"10035301","tamrId":"f7bc941d-7634-378c-9c75-fc8815fe4843","version":313,"action":"UPDATE"},{"gtasId":"9620970","tamrId":"3974e185-ba8f-3aa4-ad93-91a5948b319c","version":313,"action":"UPDATE"},{"gtasId":"3941055","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"3673954","tamrId":"5d693a2b-c56e-32f9-834e-091614e19be5","version":313,"action":"UPDATE"},{"gtasId":"11040321","tamrId":"f00a5a39-3445-34c3-a03b-2d7ea440f694","version":313,"action":"UPDATE"},{"gtasId":"8565302","tamrId":"2aea31e0-b538-3be1-8378-e1e84552a755","version":313,"action":"UPDATE"},{"gtasId":"2526110","tamrId":"bfd20898-e32e-37ac-ab34-d4aa767edf93","version":313,"action":"UPDATE"},{"gtasId":"13396707","tamrId":"8fc4ae3a-3c0c-3fb2-99d8-131692288038","version":313,"action":"UPDATE"},{"gtasId":"19972801","tamrId":"b1fcd851-c0a7-3410-9eba-09da6b596ee4","version":313,"action":"UPDATE"},{"gtasId":"5265259","tamrId":"e24aa045-4231-34bf-9872-916fbc7a2db2","version":313,"action":"UPDATE"},{"gtasId":"15598401","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"10695497","tamrId":"f0a3a34f-ce80-3767-be0f-c60fc56d355f","version":313,"action":"UPDATE"},{"gtasId":"22555133","tamrId":"4110d781-69c1-3eef-8397-699d35e486c7","version":313,"action":"UPDATE"},{"gtasId":"17639759","tamrId":"bbfc1b5e-8927-3021-970b-d1fd45a245dd","version":313,"action":"UPDATE"},{"gtasId":"22726544","tamrId":"904845ae-1d00-3036-a257-e2027c1150e7","version":313,"action":"UPDATE"},{"gtasId":"105254","tamrId":"31162ebf-c561-319b-b5ed-d065cf9a39f6","version":313,"action":"UPDATE"},{"gtasId":"591835","tamrId":"d6733e64-eb53-34ec-8dd2-61f407879c6d","version":313,"action":"UPDATE"},{"gtasId":"15079764","tamrId":"9c122cec-fe0e-35e8-97a4-eb9e6597b116","version":313,"action":"UPDATE"},{"gtasId":"8280847","tamrId":"624e104c-33af-30d7-97a3-14b0be7dba37","version":313,"action":"UPDATE"},{"gtasId":"9854690","tamrId":"ef96f2c2-9a04-3af8-8c58-7d73e87164d3","version":313,"action":"UPDATE"},{"gtasId":"22784400","tamrId":"7b13e9d7-2a83-3361-965f-9e43947f5258","version":313,"action":"UPDATE"},{"gtasId":"6443788","tamrId":"f54e6203-5ec5-31d0-8729-3da0be2fa0d5","version":313,"action":"UPDATE"},{"gtasId":"1900587","tamrId":"a5ab597c-e2e7-3fc4-b698-6acd0ba51cf0","version":313,"action":"UPDATE"},{"gtasId":"15698171","tamrId":"704fca44-4cb3-348c-8089-ff0a0db0ac53","version":313,"action":"UPDATE"},{"gtasId":"21423476","tamrId":"dacbabf2-b756-3a59-aee2-80b66d72bb86","version":313,"action":"UPDATE"},{"gtasId":"15426613","tamrId":"c45388ac-1f46-3eb3-8e81-1d14d91124f0","version":313,"action":"UPDATE"},{"gtasId":"5951780","tamrId":"ccd34ad3-5c44-3b9d-9ab9-90244a9747ce","version":313,"action":"UPDATE"},{"gtasId":"8129887","tamrId":"6e3597b5-4fd8-30f2-a4bd-ac7a13ae88d7","version":313,"action":"UPDATE"},{"gtasId":"15023770","tamrId":"863ac6e8-e798-30ea-addc-92fc3cba8583","version":313,"action":"UPDATE"},{"gtasId":"14270003","tamrId":"b03dfa7f-22f9-3bdc-b637-4e409fd8f51e","version":313,"action":"UPDATE"},{"gtasId":"20026369","tamrId":"2c40692b-b6a2-3791-8421-a52c06b3c989","version":313,"action":"UPDATE"},{"gtasId":"18634506","tamrId":"dedbd57f-eba0-30e8-91fa-43993e1ee2b7","version":313,"action":"UPDATE"},{"gtasId":"3990450","tamrId":"7430a659-8525-3506-93ab-fb308c63c779","version":313,"action":"UPDATE"},{"gtasId":"22199437","tamrId":"04c8c1be-7288-3cf5-bc9b-46e61d54aa5d","version":313,"action":"UPDATE"},{"gtasId":"4250248","tamrId":"09155f74-509e-38c7-9090-098678581116","version":313,"action":"UPDATE"},{"gtasId":"2678756","tamrId":"0164ee4c-f301-3be4-a141-c9609ed5659e","version":313,"action":"UPDATE"},{"gtasId":"19967478","tamrId":"85cc056f-f7ba-3686-acb1-a63df29250ca","version":313,"action":"UPDATE"},{"gtasId":"10903499","tamrId":"b1698cb5-11f9-3069-848e-ae1cfd166c32","version":313,"action":"UPDATE"},{"gtasId":"12729770","tamrId":"90adcba3-09de-3d14-8f4e-7696e5d3b530","version":313,"action":"UPDATE"},{"gtasId":"2606722","tamrId":"b9b24f96-1edd-3e33-9433-e7b6f61917ad","version":313,"action":"UPDATE"},{"gtasId":"10127931","tamrId":"4119eb37-7cbc-3eaa-be0d-6ab8847a8784","version":313,"action":"UPDATE"},{"gtasId":"12295791","tamrId":"18a56551-f229-3e6a-820a-3e4972b9194f","version":313,"action":"UPDATE"},{"gtasId":"4910355","tamrId":"aa710d4d-30c0-329b-9116-6a79d3ea74c8","version":313,"action":"UPDATE"},{"gtasId":"1388957","tamrId":"4bfa3a73-6b39-3df5-ab74-a1859da84142","version":313,"action":"UPDATE"},{"gtasId":"19767539","tamrId":"10d3ced5-f439-304e-b775-dc7f6af7a88e","version":313,"action":"UPDATE"},{"gtasId":"6482964","tamrId":"063c675e-fa7a-3db3-a249-9e7f167bbf74","version":313,"action":"UPDATE"},{"gtasId":"3583145","tamrId":"70b9d950-7c6a-3278-8fcb-e6aaf6d4b5d1","version":313,"action":"UPDATE"},{"gtasId":"22661591","tamrId":"66b4df34-6645-3ad5-9778-9ebf4173138b","version":313,"action":"UPDATE"},{"gtasId":"14899763","tamrId":"56f8b624-1933-3ff7-a4e4-bb77f9e05361","version":313,"action":"UPDATE"},{"gtasId":"15332713","tamrId":"6eaa4657-6bed-39db-bbf9-da592aa7bb03","version":313,"action":"UPDATE"},{"gtasId":"6189500","tamrId":"404ed6dc-6f3d-3176-bb6d-b1b1f39a87ba","version":313,"action":"UPDATE"},{"gtasId":"6122805","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"13189781","tamrId":"9a605746-c2b0-3cd8-a0d4-4e29b7e09ec4","version":313,"action":"UPDATE"},{"gtasId":"18360352","tamrId":"af7c28c0-68b7-359f-8bc2-023955ef777d","version":313,"action":"UPDATE"},{"gtasId":"3097807","tamrId":"eea1da62-933f-38f7-9593-05aea5ae1144","version":313,"action":"UPDATE"},{"gtasId":"9779314","tamrId":"296bd4a0-723d-36e4-a99a-a4a13139be87","version":313,"action":"UPDATE"},{"gtasId":"5610365","tamrId":"d8f1a674-9cb4-36e7-b006-514797391dc8","version":313,"action":"UPDATE"},{"gtasId":"22167809","tamrId":"18a56551-f229-3e6a-820a-3e4972b9194f","version":313,"action":"UPDATE"},{"gtasId":"4448618","tamrId":"9fea1689-7975-3626-b85e-375c1c132636","version":313,"action":"UPDATE"},{"gtasId":"8347189","tamrId":"be3232b2-34f6-31a6-bf76-0522726e90e2","version":313,"action":"UPDATE"},{"gtasId":"5111704","tamrId":"8a077eb0-58fd-311b-9614-65f2ee3dca02","version":313,"action":"UPDATE"},{"gtasId":"14102191","tamrId":"1c558011-be40-3f74-be9a-179e5ede165b","version":313,"action":"UPDATE"},{"gtasId":"19991547","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"22510263","tamrId":"6f7318f3-39c4-3daa-8d57-ebdbd384f13c","version":313,"action":"UPDATE"},{"gtasId":"9541733","tamrId":"9753b911-d2b5-3ed9-b1e7-6a6c39549856","version":313,"action":"UPDATE"},{"gtasId":"8312069","tamrId":"3ea168d8-94af-35e6-abb6-ccd4b4f44af4","version":313,"action":"UPDATE"},{"gtasId":"18288173","tamrId":"25980c8a-ade1-3a0b-8a27-c581d274b7c4","version":313,"action":"UPDATE"},{"gtasId":"771289","tamrId":"1866d1ab-735a-376d-bd99-b50908b87e8a","version":313,"action":"UPDATE"},{"gtasId":"11947407","tamrId":"d22a3d48-ed80-380b-a2d7-826bdc818b9e","version":313,"action":"UPDATE"},{"gtasId":"2587552","tamrId":"8c0a33d1-cafc-3fe6-bcaf-79d56995c92e","version":313,"action":"UPDATE"},{"gtasId":"7671710","tamrId":"f3c91a83-6624-3e86-9dea-868283a231c1","version":313,"action":"UPDATE"},{"gtasId":"24897876","tamrId":"8e5041ca-09c9-3146-892a-76f2b19c6458","version":313,"action":"UPDATE"},{"gtasId":"16387864","tamrId":"276b2642-824d-380e-83f2-404b58eb0cb8","version":313,"action":"UPDATE"},{"gtasId":"6430069","tamrId":"4077d9e2-837a-3213-9ede-c3b8e8d13096","version":313,"action":"UPDATE"},{"gtasId":"10439960","tamrId":"ba5df41f-a235-3708-ab3d-52e001ed8bb7","version":313,"action":"UPDATE"},{"gtasId":"6809206","tamrId":"74f9c378-645e-3059-86eb-2ed1c7a6f4d5","version":313,"action":"UPDATE"},{"gtasId":"9374754","tamrId":"41f76b0d-957e-39a4-b965-eccbcd9a74ea","version":313,"action":"UPDATE"},{"gtasId":"5912179","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"9382368","tamrId":"49ecc68a-cfe7-3cc8-88df-10808f312799","version":313,"action":"UPDATE"},{"gtasId":"15771200","tamrId":"444310ea-ce40-3275-8a64-c06c53005264","version":313,"action":"UPDATE"},{"gtasId":"13698531","tamrId":"2551fa11-24f6-37e1-8eac-8fca8e5d822c","version":313,"action":"UPDATE"},{"gtasId":"18936740","tamrId":"ff61d61f-1376-3972-81ce-ad845940171f","version":313,"action":"UPDATE"},{"gtasId":"5781292","tamrId":"0cd944ed-5137-34aa-92e9-67cdf2699750","version":313,"action":"UPDATE"},{"gtasId":"8705537","tamrId":"e0627fdb-a9a5-37aa-bdb1-81bf34075e44","version":313,"action":"UPDATE"},{"gtasId":"3507865","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"9662377","tamrId":"05dd5c08-b88b-3c9b-ae3e-7228fbcb3df3","version":313,"action":"UPDATE"},{"gtasId":"2257250","tamrId":"9fd09f9f-6dd6-39bd-9b21-5db968e4002c","version":313,"action":"UPDATE"},{"gtasId":"13665649","tamrId":"8d228b51-5efb-3793-8ab4-d0e504fd962d","version":313,"action":"UPDATE"},{"gtasId":"2693936","tamrId":"7bf743b2-a004-3265-b1cd-c32e11db7509","version":313,"action":"UPDATE"},{"gtasId":"2111764","tamrId":"b7bdb934-f676-3b69-bc7e-8c35ec8414bd","version":313,"action":"UPDATE"},{"gtasId":"9520825","tamrId":"c6f96000-caf9-336d-a4eb-200714748ee8","version":313,"action":"UPDATE"},{"gtasId":"21991432","tamrId":"01e8cad9-2e1f-3449-bd7b-3a8b071b02e6","version":313,"action":"UPDATE"},{"gtasId":"11759528","tamrId":"e88b000f-e3af-3173-892d-3531a63728e4","version":313,"action":"UPDATE"},{"gtasId":"16693298","tamrId":"f2e9e0de-46de-3195-9e34-2fea91a4971c","version":313,"action":"UPDATE"},{"gtasId":"577980","tamrId":"275bcb13-7c60-3e4e-b3c8-ebe29f2bbd06","version":313,"action":"UPDATE"},{"gtasId":"22703423","tamrId":"24c790f9-fe97-3077-a547-dcc7e9fecc7d","version":313,"action":"UPDATE"},{"gtasId":"16489331","tamrId":"51ae8c56-53fa-3563-ab59-5068e588a0c3","version":313,"action":"UPDATE"},{"gtasId":"17223229","tamrId":"47f40e26-4a4f-3e94-9c9a-f4319aab808f","version":313,"action":"UPDATE"},{"gtasId":"180526","tamrId":"2c6fa3a9-8205-3ea6-a5ee-0c99d35ad5f3","version":313,"action":"UPDATE"},{"gtasId":"8092165","tamrId":"018e22ca-3234-322d-b624-c2287f30f6a0","version":313,"action":"UPDATE"},{"gtasId":"4608027","tamrId":"0f60498e-a19c-362e-86ea-d584718e16fa","version":313,"action":"UPDATE"},{"gtasId":"3176225","tamrId":"1a3e29c1-993b-316e-87da-853467276add","version":313,"action":"UPDATE"},{"gtasId":"11362126","tamrId":"8623a87d-d60c-3678-8436-c474a7fd6c87","version":313,"action":"UPDATE"},{"gtasId":"25451048","tamrId":"260068b5-f925-3abe-ac7e-de01786a93ac","version":313,"action":"UPDATE"},{"gtasId":"4881831","tamrId":"8bed9fc0-be8f-3f05-b587-1c784d914e31","version":313,"action":"UPDATE"},{"gtasId":"9643682","tamrId":"eca7e96d-e17f-321f-be13-b83427a0b3aa","version":313,"action":"UPDATE"},{"gtasId":"18850415","tamrId":"838a42f7-5b21-3922-bbdf-78c52adf7b00","version":313,"action":"UPDATE"},{"gtasId":"1039136","tamrId":"e23bc523-7f6a-38b0-94ae-b29bcad75bb9","version":313,"action":"UPDATE"},{"gtasId":"9128136","tamrId":"6a81ddbd-d31f-35e7-bcd9-1709c7f8ce2b","version":313,"action":"UPDATE"},{"gtasId":"18409222","tamrId":"626b6be3-3aee-3aba-a3ab-fc496fcb8458","version":313,"action":"UPDATE"},{"gtasId":"13515206","tamrId":"99c69394-31d8-3485-8fa1-0f47e4d29840","version":313,"action":"UPDATE"},{"gtasId":"2270284","tamrId":"d46c946b-d15b-3111-be3d-25cf873bf3c7","version":313,"action":"UPDATE"},{"gtasId":"22639220","tamrId":"6417cb68-a309-342a-9568-9758f274b4db","version":313,"action":"UPDATE"},{"gtasId":"22839595","tamrId":"8721f76a-c139-3f7f-a76a-8cf39ccd42ac","version":313,"action":"UPDATE"},{"gtasId":"1510625","tamrId":"6f0480b3-2cb6-322b-8740-ecb5679ce6a8","version":313,"action":"UPDATE"},{"gtasId":"16945693","tamrId":"3c5807aa-d389-3c93-a137-1bd95244fea0","version":313,"action":"UPDATE"},{"gtasId":"13078041","tamrId":"702a3475-9ca9-3f22-85ea-630fbc87938b","version":313,"action":"UPDATE"},{"gtasId":"6521702","tamrId":"147e2bcd-5d9e-3d15-ad13-07199234ec02","version":313,"action":"UPDATE"},{"gtasId":"14705744","tamrId":"27927b87-0f70-319f-b9c7-49917b6c75bb","version":313,"action":"UPDATE"},{"gtasId":"13735580","tamrId":"8e2fce24-2352-3a51-9727-d40867a24255","version":313,"action":"UPDATE"},{"gtasId":"15767599","tamrId":"66f5c141-d87e-3685-b4bc-ac672e560cdd","version":313,"action":"UPDATE"},{"gtasId":"7507830","tamrId":"599e94f5-b090-3699-9967-01ee6909ab5b","version":313,"action":"UPDATE"},{"gtasId":"5877310","tamrId":"4ef6a3b3-33fb-372f-b112-7208890de036","version":313,"action":"UPDATE"},{"gtasId":"16407015","tamrId":"ca0e148c-e22e-355a-907a-850280bca89a","version":313,"action":"UPDATE"},{"gtasId":"15668715","tamrId":"71e429c0-2a33-3972-9e22-85251c951f91","version":313,"action":"UPDATE"},{"gtasId":"151193","tamrId":"3295fe75-ae84-3d7c-a678-5c02fa637365","version":313,"action":"UPDATE"},{"gtasId":"13142667","tamrId":"f2e94ac0-000e-3d19-87fa-14d5f12438a3","version":313,"action":"UPDATE"},{"gtasId":"3707748","tamrId":"e68585b0-9ae3-36e8-8caf-94d502246a05","version":313,"action":"UPDATE"},{"gtasId":"20622859","tamrId":"479f9674-4aa6-3db1-842b-5fb91264e924","version":313,"action":"UPDATE"},{"gtasId":"1509610","tamrId":"36570173-ce5d-3c37-b712-6536d70982eb","version":313,"action":"UPDATE"},{"gtasId":"17997277","tamrId":"a7514654-c987-3b34-92e2-0d143e4339dd","version":313,"action":"UPDATE"},{"gtasId":"2798944","tamrId":"a4b3084a-ccfe-3964-bc09-f7a852eaae6b","version":313,"action":"UPDATE"},{"gtasId":"11830457","tamrId":"b27469eb-9203-3d65-bc7c-e036b769e36a","version":313,"action":"UPDATE"},{"gtasId":"397696","tamrId":"c6500db4-c58a-3e6b-80f8-f3f0c2efd306","version":313,"action":"UPDATE"},{"gtasId":"17629582","tamrId":"75e765a3-9a40-3ed2-8ad2-5055b8ae5e67","version":313,"action":"UPDATE"},{"gtasId":"17420457","tamrId":"187effd4-9f8d-3763-b818-daf198193e4c","version":313,"action":"UPDATE"},{"gtasId":"21184370","tamrId":"04330669-1051-322d-b5fb-7afe987768ab","version":313,"action":"UPDATE"},{"gtasId":"12573536","tamrId":"d92c3dfc-2cb7-34ff-8be0-7d8615c0746c","version":313,"action":"UPDATE"},{"gtasId":"15269401","tamrId":"cda31242-8cc3-3831-bebc-df872e840bca","version":313,"action":"UPDATE"},{"gtasId":"24579124","tamrId":"0944f8e5-512c-37ce-8156-c3ac69996a47","version":313,"action":"UPDATE"},{"gtasId":"16790368","tamrId":"7024205d-8e24-3d6f-903c-a51b32d37a6a","version":313,"action":"UPDATE"},{"gtasId":"9060548","tamrId":"3e23f721-4a9a-3920-b8c6-cd1aa97391da","version":313,"action":"UPDATE"},{"gtasId":"24276007","tamrId":"0c147da8-e5d1-3ef5-a06d-7bf577574420","version":313,"action":"UPDATE"},{"gtasId":"2901036","tamrId":"96084418-7864-3ba8-888d-02e987de0fee","version":313,"action":"UPDATE"}]} diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/deltas_message.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/deltas_message.json new file mode 100644 index 0000000000..c81c2a840f --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/deltas_message.json @@ -0,0 +1 @@ +{"historyClusters":[{"gtasId":"15587046","tamrId":"f0219955-024a-34b8-b1a5-dea94f374ed7","version":342,"action":"UPDATE"},{"gtasId":"13202558","tamrId":"fb1bb202-f041-35ba-8a3f-9dfe343ff63d","version":342,"action":"UPDATE"},{"gtasId":"9103158","tamrId":"d242f9b0-9d8f-3181-ab51-397109a92023","version":342,"action":"UPDATE"},{"gtasId":"6607558","tamrId":"7c08d511-9fe7-3c79-866a-a57b30b50565","version":342,"action":"UPDATE"},{"gtasId":"24728392","tamrId":"72e24fca-1ecc-3781-a2fd-cabc3167b32e","version":342,"action":"UPDATE"},{"gtasId":"9899621","tamrId":"683882b4-06ec-35dd-9969-8ba0e262ac65","version":342,"action":"UPDATE"},{"gtasId":"11316025","tamrId":"e60234c9-661f-341e-82e9-a908fe4da9b7","version":342,"action":"UPDATE"},{"gtasId":"8333606","tamrId":"dfda1e05-afb9-31a8-8ac1-f59e3f2c393e","version":342,"action":"UPDATE"},{"gtasId":"12681638","tamrId":"24aa5468-c7a1-3751-adb1-a08f895bee5d","version":342,"action":"UPDATE"},{"gtasId":"2757050","tamrId":"26000e6b-65a7-30b2-93fc-a7d8a3fb7c7f","version":342,"action":"UPDATE"},{"gtasId":"4395734","tamrId":"16a28c68-175a-368b-9382-4a615ea3ee61","version":342,"action":"UPDATE"},{"gtasId":"8834451","tamrId":"8a8f5870-d8bb-3c24-aed9-9a98f0b52811","version":342,"action":"UPDATE"},{"gtasId":"11834216","tamrId":"1b0d8b46-7a91-332d-9f03-06beac236511","version":342,"action":"UPDATE"},{"gtasId":"13444879","tamrId":"49cab748-53bf-368c-9557-18cb277fff28","version":342,"action":"UPDATE"},{"gtasId":"17774733","tamrId":"66e7c907-6bba-3e12-ad75-f2cd56f80802","version":342,"action":"UPDATE"},{"gtasId":"20349802","tamrId":"bb2fb345-e117-3650-99c2-25663ba6c9a9","version":342,"action":"UPDATE"},{"gtasId":"5612266","tamrId":"bcd2a66f-74a7-38cf-a74a-28d5dd85365d","version":342,"action":"UPDATE"},{"gtasId":"2415347","tamrId":"d14e07be-f232-3059-915a-70c6b8bdf1a7","version":342,"action":"UPDATE"},{"gtasId":"10244006","tamrId":"3837067d-6b30-3d26-b3f4-70a9225e288a","version":342,"action":"UPDATE"},{"gtasId":"3994350","tamrId":"f3526707-089c-36a5-8b20-e1ad13cdd178","version":342,"action":"UPDATE"},{"gtasId":"22051901","tamrId":"dc49c9ef-6a3e-32d8-8c85-22de0c0d2bdb","version":342,"action":"UPDATE"},{"gtasId":"6491291","tamrId":"5cedf324-2289-3959-835b-37dbb9fc135c","version":342,"action":"UPDATE"},{"gtasId":"12453957","tamrId":"17c1e8c2-c243-31bc-a460-4907c7b8c3ff","version":342,"action":"UPDATE"},{"gtasId":"7232251","tamrId":"11461c42-88ae-385e-bae6-4382b86638d6","version":342,"action":"UPDATE"},{"gtasId":"2200668","tamrId":"e33ed3d4-b066-3aa9-8820-f774c7a314f0","version":342,"action":"UPDATE"},{"gtasId":"4178716","tamrId":"9ff538d6-a732-36fa-95b6-ffdfcf671b79","version":342,"action":"UPDATE"},{"gtasId":"24040075","tamrId":"43a411cb-42cf-35a9-98d6-c9f4ea9c51e0","version":342,"action":"UPDATE"},{"gtasId":"16019232","tamrId":"bebfc021-4e6a-3b6c-a4dd-eeb7dc0fe667","version":342,"action":"UPDATE"},{"gtasId":"24350156","tamrId":"3ffd740c-c406-3cb1-91a0-f190ac3d1bb2","version":342,"action":"UPDATE"},{"gtasId":"14055269","tamrId":"32524aa3-5663-30fe-b354-f8be6bf2cdde","version":342,"action":"UPDATE"},{"gtasId":"21386632","tamrId":"e2d1e127-a391-3dfa-b98b-6d9e704136db","version":342,"action":"UPDATE"},{"gtasId":"2129206","tamrId":"d79ab736-c45f-3ec3-8e58-93e8828eed51","version":342,"action":"UPDATE"},{"gtasId":"11580265","tamrId":"9d8a78cf-752e-38d4-a6db-49f503be2e83","version":342,"action":"UPDATE"},{"gtasId":"3443261","tamrId":"472f7736-7177-35e5-b481-c95702a2dc66","version":342,"action":"UPDATE"},{"gtasId":"14160029","tamrId":"c17aafd5-6931-38d5-a02c-61d8e3654cf0","version":342,"action":"UPDATE"},{"gtasId":"5169616","tamrId":"1ed1a4df-15c9-34fd-8021-2614852cff09","version":342,"action":"UPDATE"},{"gtasId":"14870275","tamrId":"4e549386-6525-3dd0-9fe7-8a6c382de17d","version":342,"action":"UPDATE"},{"gtasId":"14539577","tamrId":"90ef85b2-f9be-34da-8dc8-8f5c5e73383a","version":342,"action":"UPDATE"},{"gtasId":"4629268","tamrId":"4e3a20bc-cbff-3f54-8972-4b9e8ac16337","version":342,"action":"UPDATE"},{"gtasId":"20240378","tamrId":"ae89a8a6-2971-3169-8a3b-6736d8bc7d97","version":342,"action":"UPDATE"},{"gtasId":"662117","tamrId":"1252a5ce-b710-3bb4-9ea8-8e496e115d2b","version":342,"action":"UPDATE"},{"gtasId":"2839453","tamrId":"0f12b332-41b7-342c-81dd-aa963aaf0d35","version":342,"action":"UPDATE"},{"gtasId":"25533915","tamrId":"a0d14dce-249c-3456-9712-d48e9172e8a6","version":342,"action":"UPDATE"},{"gtasId":"13545559","tamrId":"07106e49-e543-3a2d-b7ba-5c9c8ec71afd","version":342,"action":"UPDATE"},{"gtasId":"4692547","tamrId":"5bfdd334-2031-304e-b086-b156c966c9de","version":342,"action":"UPDATE"},{"gtasId":"23302698","tamrId":"9c77a1b0-f124-3a45-ba49-72e5f8046864","version":342,"action":"UPDATE"},{"gtasId":"24479219","tamrId":"cfbea183-326f-3d9a-9880-226dde34655e","version":342,"action":"UPDATE"},{"gtasId":"7485236","tamrId":"bf0ef402-37a7-3c5a-9902-11ea43ff7d90","version":342,"action":"UPDATE"},{"gtasId":"1548691","tamrId":"f64747b5-06e5-3c2d-90ed-6961b10efe77","version":342,"action":"UPDATE"},{"gtasId":"8515428","tamrId":"964abb36-7b46-3fe4-9229-fc27c7b4464e","version":342,"action":"UPDATE"},{"gtasId":"16542812","tamrId":"753407a7-bd40-3e68-90be-d2f5ef144a5f","version":342,"action":"UPDATE"},{"gtasId":"8524361","tamrId":"5fbfa142-6aa0-3e17-9849-6905d639f9af","version":342,"action":"UPDATE"},{"gtasId":"3216856","tamrId":"111e5698-a18c-3e81-b2a5-b472f7710b81","version":342,"action":"UPDATE"},{"gtasId":"6504205","tamrId":"56cd56ec-b7da-323d-9ea0-9b323dae9155","version":342,"action":"UPDATE"},{"gtasId":"21581420","tamrId":"652d39aa-5052-3b80-a5a9-c4d939532a96","version":342,"action":"UPDATE"},{"gtasId":"4906458","tamrId":"652a3e7f-31cc-3e9e-9610-20b2da88ceb9","version":342,"action":"UPDATE"},{"gtasId":"22943943","tamrId":"1c66d9c4-bdea-3e22-9d64-838cf1ee8150","version":342,"action":"UPDATE"},{"gtasId":"15857915","tamrId":"5250217a-3e99-3187-8f04-dd0f2d497491","version":342,"action":"UPDATE"},{"gtasId":"23555662","tamrId":"a50fa38c-74f1-354e-a4eb-168b0dea9f71","version":342,"action":"UPDATE"},{"gtasId":"24192382","tamrId":"95373ba4-39a7-3e10-b0a5-9895c34403d1","version":342,"action":"UPDATE"},{"gtasId":"15235988","tamrId":"735278d1-34f8-343e-803c-f72d8961e4e7","version":342,"action":"UPDATE"},{"gtasId":"9762984","tamrId":"1b97ee3e-5dfa-3bdf-a21e-a7cadb5ce8e8","version":342,"action":"UPDATE"},{"gtasId":"19426852","tamrId":"c79c863b-160a-3f72-b867-c2e483f3adb1","version":342,"action":"UPDATE"},{"gtasId":"7890740","tamrId":"2ef96fbb-443d-35c3-9fd8-2813e68068c2","version":342,"action":"UPDATE"},{"gtasId":"16046830","tamrId":"1749e0e6-d6dc-395e-b3cf-35b4305d040b","version":342,"action":"UPDATE"},{"gtasId":"728474","tamrId":"6daa93cd-c066-32d0-99e5-8a03c540cce0","version":342,"action":"UPDATE"},{"gtasId":"12794359","tamrId":"d9efafa9-1469-36fc-a30c-76dc6f13d016","version":342,"action":"UPDATE"},{"gtasId":"4197899","tamrId":"0ac5cdb1-036c-3dad-932b-2368ff935b48","version":342,"action":"UPDATE"},{"gtasId":"7082025","tamrId":"16395d0f-daa7-3081-ad85-3b166327e7ab","version":342,"action":"UPDATE"},{"gtasId":"9496483","tamrId":"338f190e-f47a-3791-9cef-6890853a444f","version":342,"action":"UPDATE"},{"gtasId":"1949273","tamrId":"da4daeaf-097a-3eca-981c-e93c1097cd2d","version":342,"action":"UPDATE"},{"gtasId":"4242156","tamrId":"1a5c0ad5-5302-342d-b7b1-781df22db8ef","version":342,"action":"UPDATE"},{"gtasId":"9931483","tamrId":"bb260880-2524-3769-8f36-2397490a7bc1","version":342,"action":"UPDATE"},{"gtasId":"12273070","tamrId":"e28b3e21-c980-3520-a8f1-ea73528f112c","version":342,"action":"UPDATE"},{"gtasId":"15984958","tamrId":"7f5bcaf4-10ff-337c-b094-c869ca063859","version":342,"action":"UPDATE"},{"gtasId":"14976699","tamrId":"2f12194f-33e8-39b5-9a58-bb00287edb1a","version":342,"action":"UPDATE"},{"gtasId":"18442275","tamrId":"9a3d02a9-573c-34f1-b289-ff4328490cf5","version":342,"action":"UPDATE"},{"gtasId":"10912420","tamrId":"4001254d-06b6-3d5a-bfff-ea1e94862d72","version":342,"action":"UPDATE"},{"gtasId":"15374946","tamrId":"699c7aa0-cbb0-33ea-87ab-7d2fbc4203d6","version":342,"action":"UPDATE"},{"gtasId":"13187289","tamrId":"ac9d9121-991f-3b9d-8fe9-d9647a8206d0","version":342,"action":"UPDATE"},{"gtasId":"24813557","tamrId":"99a9c838-9e9d-3a64-b8a8-d1f67c7eb754","version":342,"action":"UPDATE"},{"gtasId":"9700691","tamrId":"0d230e20-a95b-3f12-9c7b-1851fcc4a10f","version":342,"action":"UPDATE"},{"gtasId":"3824202","tamrId":"6dba99fb-9017-3855-a097-856eb8d54325","version":342,"action":"UPDATE"},{"gtasId":"23017842","tamrId":"dd2be629-9ee7-3f1d-931e-d0efa48c79e8","version":342,"action":"UPDATE"},{"gtasId":"20991902","tamrId":"97c11ecd-fef6-3268-9182-33297dba45bc","version":342,"action":"UPDATE"},{"gtasId":"6600958","tamrId":"c0b553e9-5ca0-3a8c-af30-01c93197a700","version":342,"action":"UPDATE"},{"gtasId":"3355813","tamrId":"3f6e08d5-32ca-3155-8382-f45143ab7057","version":342,"action":"UPDATE"},{"gtasId":"12024442","tamrId":"59de443e-5311-39a6-b784-aff975b668f3","version":342,"action":"UPDATE"},{"gtasId":"4914053","tamrId":"0b905d8c-5b4d-3de6-b3dc-e4be2e67bfb9","version":342,"action":"UPDATE"},{"gtasId":"5730320","tamrId":"2d5a72b0-ada3-358a-9c02-49df52536dd9","version":342,"action":"UPDATE"},{"gtasId":"3146481","tamrId":"af4466a6-2513-3f7e-8bcf-991a8e5d2584","version":342,"action":"UPDATE"},{"gtasId":"9863624","tamrId":"8793f153-61fd-3b01-98c9-4f719be907f7","version":342,"action":"UPDATE"},{"gtasId":"6439515","tamrId":"f4bab301-5894-3fb4-b355-ae60fb6ee30f","version":342,"action":"UPDATE"},{"gtasId":"8154037","tamrId":"f0cdd122-9dee-34af-8db3-3dd1625d4a1d","version":342,"action":"UPDATE"},{"gtasId":"14056557","tamrId":"4850292c-abca-3656-9a6a-796951318998","version":342,"action":"UPDATE"},{"gtasId":"7435806","tamrId":"eb87924b-c5bf-375c-93dc-9905ad0aeab2","version":342,"action":"UPDATE"},{"gtasId":"12991714","tamrId":"60069824-9313-3b82-922f-7dbb41249e9c","version":342,"action":"UPDATE"},{"gtasId":"2450580","tamrId":"410f9757-39ec-3ec6-8db2-53f85804532d","version":342,"action":"UPDATE"},{"gtasId":"6415542","tamrId":"d21b9a60-aad3-390c-b8e9-543a9157abcf","version":342,"action":"UPDATE"},{"gtasId":"2580602","tamrId":"bfa1d8e8-7cee-3f5c-86b3-a6a97fd3d1e4","version":342,"action":"UPDATE"},{"gtasId":"8902249","tamrId":"c18543e3-7a0e-3080-81e8-5054c1f3d257","version":342,"action":"UPDATE"},{"gtasId":"20840975","tamrId":"233a05db-76ff-3a1e-bd61-65c7818dc907","version":342,"action":"UPDATE"},{"gtasId":"21569753","tamrId":"7642d4fa-ed77-3522-ab8f-946331cdc118","version":342,"action":"UPDATE"},{"gtasId":"16171221","tamrId":"6b1b3484-5f01-319b-a1b8-ceed9b6e178e","version":342,"action":"UPDATE"},{"gtasId":"2911331","tamrId":"6fcb7b02-c2d8-37c2-8418-d320314242a3","version":342,"action":"UPDATE"},{"gtasId":"2227714","tamrId":"36533087-96a1-3e43-a07b-416e4f5b7263","version":342,"action":"UPDATE"},{"gtasId":"9190417","tamrId":"5d086d39-7e84-32b7-b982-b1bcc45eb10e","version":342,"action":"UPDATE"},{"gtasId":"9622693","tamrId":"439f0e70-a437-3931-872b-5207f1330f46","version":342,"action":"UPDATE"},{"gtasId":"14023668","tamrId":"77c8406f-8510-3433-9f75-b3fe30823be8","version":342,"action":"UPDATE"},{"gtasId":"15947909","tamrId":"e01c1a15-bdb1-3dac-b0cd-79a8c6cfbab9","version":342,"action":"UPDATE"},{"gtasId":"19045072","tamrId":"2d826930-9ce8-3a07-8af0-b987c3f6fed0","version":342,"action":"UPDATE"},{"gtasId":"4638177","tamrId":"0dcbab3d-9a6a-38ef-8483-c51b8cbc5b54","version":342,"action":"UPDATE"},{"gtasId":"3296101","tamrId":"7a063926-f437-39af-8211-1553622bd6a6","version":342,"action":"UPDATE"},{"gtasId":"8854002","tamrId":"95aa33f0-8489-3849-b257-05f1c284830d","version":342,"action":"UPDATE"},{"gtasId":"15309086","tamrId":"ab0d060d-7814-3760-ad64-6211a91e4339","version":342,"action":"UPDATE"},{"gtasId":"12912966","tamrId":"da1d26a4-bbfd-301b-8ba1-6397ce897ab7","version":342,"action":"UPDATE"},{"gtasId":"18296481","tamrId":"17239da5-8873-3798-a52e-d1b113c0bbe5","version":342,"action":"UPDATE"},{"gtasId":"19654563","tamrId":"f9132e0d-3153-3155-aca4-d44495336517","version":342,"action":"UPDATE"},{"gtasId":"9612430","tamrId":"4683b7d0-ea22-3252-8e85-f622c9b7f4c4","version":342,"action":"UPDATE"},{"gtasId":"25451531","tamrId":"2b8a9a9a-0851-3eae-97fe-95aa2ae4c8d3","version":342,"action":"UPDATE"},{"gtasId":"25094533","tamrId":"4c0c9e4d-5858-3312-b95f-f8324bb7cf4f","version":342,"action":"UPDATE"},{"gtasId":"18557515","tamrId":"62217f35-53a8-312d-a843-bb5d4ab246e0","version":342,"action":"UPDATE"},{"gtasId":"1433348","tamrId":"5d31092e-bf40-3902-a17d-59c00305a93e","version":342,"action":"UPDATE"},{"gtasId":"7396501","tamrId":"7838afeb-ad64-3235-bd71-caddf21eaedc","version":342,"action":"UPDATE"},{"gtasId":"11493322","tamrId":"88a526f9-afa2-3d90-a4a3-52fd80f4fd77","version":342,"action":"UPDATE"},{"gtasId":"18034501","tamrId":"e7588378-8c87-361b-b6d3-9cd518eb20c1","version":342,"action":"UPDATE"},{"gtasId":"15005688","tamrId":"015e1a72-12a1-3c59-89c0-e65d6d405910","version":342,"action":"UPDATE"},{"gtasId":"9836018","tamrId":"6887f07b-058b-32aa-9ae7-f922712e9934","version":342,"action":"UPDATE"},{"gtasId":"21842579","tamrId":"e0741197-d717-3830-96e0-46be794b927e","version":342,"action":"UPDATE"},{"gtasId":"11044270","tamrId":"e529292a-b145-3b5f-b09e-9d79d7d3ac40","version":342,"action":"UPDATE"},{"gtasId":"14504048","tamrId":"a9cc31e2-5e2d-31a5-82eb-247dec57c325","version":342,"action":"UPDATE"},{"gtasId":"14324802","tamrId":"edbe73ab-e706-3ac8-b678-89936ade54a0","version":342,"action":"UPDATE"},{"gtasId":"5454450","tamrId":"f16047cd-be6b-3d7c-97e8-fde58e84b782","version":342,"action":"UPDATE"},{"gtasId":"5798759","tamrId":"52b615b3-abd5-3201-a880-fadc8853d843","version":342,"action":"UPDATE"},{"gtasId":"4247876","tamrId":"7d3295f1-c87b-3957-a03e-7a54702cb600","version":342,"action":"UPDATE"},{"gtasId":"9138695","tamrId":"35f49771-5f45-3f42-94ad-d9b88fd6a7c9","version":342,"action":"UPDATE"},{"gtasId":"5414387","tamrId":"a7f593f0-3fc8-328e-8ab8-54690957a8f2","version":342,"action":"UPDATE"},{"gtasId":"19737440","tamrId":"fb8eda96-152f-3574-a2a9-af8485478a3e","version":342,"action":"UPDATE"},{"gtasId":"815401","tamrId":"6abb197d-6bd5-3518-8340-e527deb4064c","version":342,"action":"UPDATE"},{"gtasId":"5111496","tamrId":"883c880e-e7c1-38ec-879c-73e16052c01b","version":342,"action":"UPDATE"},{"gtasId":"7836382","tamrId":"1cd9d25f-e9ef-3a9e-8945-c5c4b2a66a8c","version":342,"action":"UPDATE"},{"gtasId":"17495768","tamrId":"0ab7dd71-fcf7-3ba4-b9b2-e50e9baae71a","version":342,"action":"UPDATE"},{"gtasId":"7602596","tamrId":"b07cdb8a-e66e-35d1-b630-02d6db6299e9","version":342,"action":"UPDATE"},{"gtasId":"8254305","tamrId":"0e361539-c29f-3c1e-856e-d2a1f77db14c","version":342,"action":"UPDATE"},{"gtasId":"15598574","tamrId":"e3b3d313-cce0-390b-a621-fd6bba88b94c","version":342,"action":"UPDATE"},{"gtasId":"3137585","tamrId":"ae23c89e-a697-3555-bf8f-b240acb83864","version":342,"action":"UPDATE"},{"gtasId":"10256859","tamrId":"8ed9310c-922b-3dcc-bccf-966ecbf83881","version":342,"action":"UPDATE"},{"gtasId":"1760890","tamrId":"cc19ea83-9c9e-38e7-b882-48c2dd8d8dce","version":342,"action":"UPDATE"},{"gtasId":"12001751","tamrId":"3cf32615-f996-3588-91b7-669571fdc345","version":342,"action":"UPDATE"},{"gtasId":"11885884","tamrId":"7803391c-f245-3ff7-8747-ad39312f2d58","version":342,"action":"UPDATE"},{"gtasId":"7807825","tamrId":"3ad0fe2b-15e8-314b-9704-b00764e1cea9","version":342,"action":"UPDATE"},{"gtasId":"13856147","tamrId":"0c767f06-8836-3863-bd36-f1479a18d3e7","version":342,"action":"UPDATE"},{"gtasId":"23044619","tamrId":"9848fad2-0519-3c15-80fd-ac578605a17c","version":342,"action":"UPDATE"},{"gtasId":"4083835","tamrId":"864abd84-1351-3c44-a787-fb7a17e1ea4a","version":342,"action":"UPDATE"},{"gtasId":"12954704","tamrId":"3d76a9d6-9ab0-39b3-ad01-15a4c2d42984","version":342,"action":"UPDATE"},{"gtasId":"3244965","tamrId":"dc4b55f7-64b1-3f8e-ba4f-db88d0a9b0b6","version":342,"action":"UPDATE"},{"gtasId":"20995486","tamrId":"baa55b9f-4729-3b86-ab22-2d3dd06519e9","version":342,"action":"UPDATE"},{"gtasId":"15121123","tamrId":"30ccb52b-40e5-3e59-9fcb-efe7e009d18b","version":342,"action":"UPDATE"},{"gtasId":"3047529","tamrId":"0c99f6c5-dbcf-3c19-bc03-d251395bb5da","version":342,"action":"UPDATE"},{"gtasId":"5273111","tamrId":"1161fdb6-63a9-3e1b-8158-304891d1b490","version":342,"action":"UPDATE"},{"gtasId":"1861589","tamrId":"a80e30e7-69d4-3600-b729-9782972ee724","version":342,"action":"UPDATE"},{"gtasId":"3082771","tamrId":"40021574-0c6b-32cb-8fa2-4c69cf443eac","version":342,"action":"UPDATE"},{"gtasId":"18946198","tamrId":"2e6c7084-7fb0-3411-b43a-462c8a980451","version":342,"action":"UPDATE"},{"gtasId":"4758841","tamrId":"818461b6-0e4f-3c11-9ae6-de1ea362937b","version":342,"action":"UPDATE"},{"gtasId":"5779637","tamrId":"d6a8df60-5623-3115-b9a9-7bb6154f65a0","version":342,"action":"UPDATE"},{"gtasId":"7905472","tamrId":"4cd9d2eb-ab65-333c-a66f-51c8e2fb44ff","version":342,"action":"UPDATE"},{"gtasId":"9567342","tamrId":"02364a52-7d5f-3560-baf4-b4624e02bfee","version":342,"action":"UPDATE"},{"gtasId":"22426224","tamrId":"52e86e66-0732-369a-9cd7-6b65213fa9e4","version":342,"action":"UPDATE"},{"gtasId":"12592986","tamrId":"4e27e8fb-affa-3b14-a445-1e2456a89fe1","version":342,"action":"UPDATE"},{"gtasId":"10730680","tamrId":"29a68053-0dd0-3018-8283-bfa4b066a001","version":342,"action":"UPDATE"},{"gtasId":"3395910","tamrId":"6049767a-a734-37d5-bfdb-6e750d5c329b","version":342,"action":"UPDATE"},{"gtasId":"8674854","tamrId":"193f5981-446a-3c70-a024-4df4faffabee","version":342,"action":"UPDATE"},{"gtasId":"2532122","tamrId":"547835f2-c503-3758-b635-4d33586a4ad3","version":342,"action":"UPDATE"},{"gtasId":"23413562","tamrId":"0a6a2fcf-927d-364d-b027-3c2818d469d2","version":342,"action":"UPDATE"},{"gtasId":"9152947","tamrId":"bbf8c178-2fd0-399f-bd7f-0082676d9169","version":342,"action":"UPDATE"},{"gtasId":"1881182","tamrId":"f0e44487-9f47-3c86-b926-88975d189607","version":342,"action":"UPDATE"},{"gtasId":"13744764","tamrId":"03f288d8-52df-3849-863e-a94f40976bc5","version":342,"action":"UPDATE"},{"gtasId":"10871361","tamrId":"5f7dbe56-6cf4-3a93-a3dd-3d9016dd17c1","version":342,"action":"UPDATE"},{"gtasId":"4641787","tamrId":"0d563268-b4be-3245-90f6-782d52d3a951","version":342,"action":"UPDATE"},{"gtasId":"6740363","tamrId":"35e472a9-9d12-35a7-ba3c-ce384a29f27b","version":342,"action":"UPDATE"},{"gtasId":"21301668","tamrId":"5f7dbe56-6cf4-3a93-a3dd-3d9016dd17c1","version":342,"action":"UPDATE"},{"gtasId":"15798209","tamrId":"ecc06daf-b7a1-3ffa-a4a8-7064e51c973e","version":342,"action":"UPDATE"},{"gtasId":"19529394","tamrId":"33292360-db9e-355c-8732-99737139ad8f","version":342,"action":"UPDATE"},{"gtasId":"5939172","tamrId":"9bfe2eb3-63f2-39fa-8e37-c613fb518887","version":342,"action":"UPDATE"},{"gtasId":"12363094","tamrId":"1f5794e3-d03b-3e64-b316-27d9ab503fd7","version":342,"action":"UPDATE"},{"gtasId":"6252040","tamrId":"e3d10ac2-7955-3717-8859-a01bc18ce714","version":342,"action":"UPDATE"},{"gtasId":"19964614","tamrId":"3b5ebc5d-663f-3f24-9a2a-60ddc72b740c","version":342,"action":"UPDATE"},{"gtasId":"5754368","tamrId":"de908cc4-7081-33a6-ad24-a4f233fe2081","version":342,"action":"UPDATE"},{"gtasId":"6124566","tamrId":"be47f9cd-66f9-3737-9bbf-d21d5d372bdc","version":342,"action":"UPDATE"},{"gtasId":"17088534","tamrId":"d98f1a5a-8c41-302a-8428-0cde7a0e8d57","version":342,"action":"UPDATE"},{"gtasId":"7393434","tamrId":"32118043-b273-3fa2-9e93-c81cf5951775","version":342,"action":"UPDATE"},{"gtasId":"11978987","tamrId":"b384a589-844a-37bd-93fc-c38170e02ecb","version":342,"action":"UPDATE"},{"gtasId":"10587082","tamrId":"57237c46-e142-380a-a970-677dce227250","version":342,"action":"UPDATE"},{"gtasId":"1067439","tamrId":"dadc0e59-fcb0-3b76-a6e5-41f8c1442436","version":342,"action":"UPDATE"},{"gtasId":"4098072","tamrId":"ddd1607a-885f-39de-b445-ba4c6f3f3f6c","version":342,"action":"UPDATE"},{"gtasId":"13295181","tamrId":"1e9246d6-4888-3976-a388-84ee41204f14","version":342,"action":"UPDATE"},{"gtasId":"12463332","tamrId":"c12645df-1def-3b99-ba42-08286879170e","version":342,"action":"UPDATE"},{"gtasId":"18528187","tamrId":"55648a76-7863-3afa-a0ae-5ac7edea85e5","version":342,"action":"UPDATE"},{"gtasId":"6056729","tamrId":"1a25159d-fdd7-3134-b7ba-9754c6bf8f3a","version":342,"action":"UPDATE"},{"gtasId":"8508221","tamrId":"f498372c-9807-3d63-9a6b-e1b64908f788","version":342,"action":"UPDATE"},{"gtasId":"3907020","tamrId":"cf82661d-f160-311e-bea1-f414c23b1aac","version":342,"action":"UPDATE"},{"gtasId":"16877397","tamrId":"1321cd86-b389-36b1-a24f-d99b61e93c7b","version":342,"action":"UPDATE"},{"gtasId":"19950874","tamrId":"c2f4b63a-3c45-328f-b9b3-71942824a65c","version":342,"action":"UPDATE"},{"gtasId":"11075381","tamrId":"13341dd1-bd36-3287-9f09-94938734ac82","version":342,"action":"UPDATE"},{"gtasId":"5298441","tamrId":"226ff9f9-aa1d-32a4-b1d5-d319fe1da681","version":342,"action":"UPDATE"},{"gtasId":"13308061","tamrId":"62217f35-53a8-312d-a843-bb5d4ab246e0","version":342,"action":"UPDATE"},{"gtasId":"4124037","tamrId":"e2670c56-45cf-3214-adfe-cb9c5aa73337","version":342,"action":"UPDATE"},{"gtasId":"13778999","tamrId":"f1885fb6-c505-3dbe-a2fa-ac47227b2887","version":342,"action":"UPDATE"},{"gtasId":"21486856","tamrId":"8e1fd2cb-95d3-347e-8b06-140836091f1b","version":342,"action":"UPDATE"},{"gtasId":"7596198","tamrId":"190b2648-bee6-3207-ba8a-a8d1b40d4b26","version":342,"action":"UPDATE"},{"gtasId":"8601031","tamrId":"55b0ea2a-5ed0-37ff-940f-aa38e5501d20","version":342,"action":"UPDATE"},{"gtasId":"10256817","tamrId":"0684efc3-4aa1-3323-b683-3173fe7c3597","version":342,"action":"UPDATE"},{"gtasId":"21520457","tamrId":"fdafb4f8-f3d2-344e-91ce-4e9baa576f74","version":342,"action":"UPDATE"},{"gtasId":"22521637","tamrId":"f4a67eef-290d-3a10-96dc-1134b8eab092","version":342,"action":"UPDATE"},{"gtasId":"13229681","tamrId":"7cdbcd25-b4e2-37be-bef3-6b374dbdb3a1","version":342,"action":"UPDATE"},{"gtasId":"4580338","tamrId":"7d27625e-62b8-386f-af9c-28e5c7f13463","version":342,"action":"UPDATE"},{"gtasId":"3148268","tamrId":"0d981de3-89e5-3a82-953d-c0f1bd63fab6","version":342,"action":"UPDATE"},{"gtasId":"1944432","tamrId":"4aa603fd-bf33-3f5d-a472-7b34ec975d83","version":342,"action":"UPDATE"},{"gtasId":"7449580","tamrId":"77d3d8a5-0ec0-3120-9826-2069e3f72481","version":342,"action":"UPDATE"},{"gtasId":"7976659","tamrId":"56cea975-6683-33a5-834f-532b7ea97812","version":342,"action":"UPDATE"},{"gtasId":"9291902","tamrId":"e55058e8-7d08-30bd-926a-18476f4fc3a3","version":342,"action":"UPDATE"},{"gtasId":"18964834","tamrId":"c29fd286-b2c7-3a72-b425-91d733a1abc5","version":342,"action":"UPDATE"},{"gtasId":"20022863","tamrId":"69426b78-b4b8-3391-8c4c-cde4b65ed159","version":342,"action":"UPDATE"},{"gtasId":"1280958","tamrId":"95da5ce4-301b-356e-b0f7-c59958ce4007","version":342,"action":"UPDATE"},{"gtasId":"8801567","tamrId":"28f2c598-78d2-3859-a1bb-b06289795a1b","version":342,"action":"UPDATE"},{"gtasId":"6837875","tamrId":"840847e8-e08e-308c-8bd2-06124e5ee68c","version":342,"action":"UPDATE"},{"gtasId":"5536838","tamrId":"a0ffe7c4-3eea-39c9-b73c-367c12e330d6","version":342,"action":"UPDATE"},{"gtasId":"2818502","tamrId":"10bb8e09-f24f-3fd7-9351-655565906b09","version":342,"action":"UPDATE"},{"gtasId":"12233825","tamrId":"9799840d-efd2-307a-88da-274571f088b1","version":342,"action":"UPDATE"},{"gtasId":"11046836","tamrId":"6cc7ec47-4305-3a20-bb22-73ec22922c07","version":342,"action":"UPDATE"},{"gtasId":"23311539","tamrId":"d3ea6820-0118-3d54-a60e-19799f4c918e","version":342,"action":"UPDATE"},{"gtasId":"10799563","tamrId":"c7d6d4dd-6e25-3061-96ce-7ab45ba337b5","version":342,"action":"UPDATE"},{"gtasId":"13162833","tamrId":"2d90f6ea-3639-3483-bc1f-3a5aa7179c15","version":342,"action":"UPDATE"},{"gtasId":"8053337","tamrId":"3f020a12-7a66-3139-bd68-e87b8cf8f785","version":342,"action":"UPDATE"},{"gtasId":"6697855","tamrId":"670b217a-c764-304f-9fe2-2766da02d9c9","version":342,"action":"UPDATE"},{"gtasId":"10169037","tamrId":"679f3281-1729-3d17-9860-f3a0ae4a4c2a","version":342,"action":"UPDATE"},{"gtasId":"8217379","tamrId":"b125f2e5-2f1a-3625-afa3-7353af2272e9","version":342,"action":"UPDATE"},{"gtasId":"14426012","tamrId":"ceaf6aa9-4989-3d0c-af5f-c6de99f43926","version":342,"action":"UPDATE"},{"gtasId":"407693","tamrId":"2ca900b0-757c-343c-a797-b95bcb9ca6ef","version":342,"action":"UPDATE"},{"gtasId":"16232707","tamrId":"e8f9296e-6798-32ce-a07e-9dad23fb812a","version":342,"action":"UPDATE"},{"gtasId":"1193167","tamrId":"388d0eb2-6093-38dc-abc2-68ca612b3b7a","version":342,"action":"UPDATE"},{"gtasId":"9079822","tamrId":"1d157467-dc30-3b98-897a-c0c604d74193","version":342,"action":"UPDATE"},{"gtasId":"25384173","tamrId":"645a28a8-b125-3dd2-bb82-842af3b70ebc","version":342,"action":"UPDATE"},{"gtasId":"25025192","tamrId":"85e4ad59-2177-3070-9d39-b82794453b72","version":342,"action":"UPDATE"},{"gtasId":"7985589","tamrId":"ca8749dc-9c87-340c-b971-fdfd04a88456","version":342,"action":"UPDATE"},{"gtasId":"2862647","tamrId":"f7d9ed2e-2988-3785-8032-05c0d4a20073","version":342,"action":"UPDATE"},{"gtasId":"11695539","tamrId":"22dd8b93-1126-3dc9-a726-d2aba8926ea8","version":342,"action":"UPDATE"},{"gtasId":"22899265","tamrId":"62e08a17-7b63-3f67-8c3c-4de1b6a32671","version":342,"action":"UPDATE"},{"gtasId":"242451","tamrId":"6c6a8b38-3013-3b20-8c4b-3fc4521ec9a0","version":342,"action":"UPDATE"},{"gtasId":"22553203","tamrId":"d5aa5267-0bed-3e86-b535-6636e804082d","version":342,"action":"UPDATE"},{"gtasId":"11825324","tamrId":"b999bd42-85da-3667-acc3-e948a7004c59","version":342,"action":"UPDATE"},{"gtasId":"21114520","tamrId":"1e9246d6-4888-3976-a388-84ee41204f14","version":342,"action":"UPDATE"},{"gtasId":"16586477","tamrId":"4c1cd19a-f6cb-3e0e-9cbf-b191b0005f2e","version":342,"action":"UPDATE"},{"gtasId":"1787044","tamrId":"94c1a8aa-1d45-3623-a8ee-65d7be93bfa2","version":342,"action":"UPDATE"},{"gtasId":"21541367","tamrId":"2e9e5806-2529-3c1d-aa44-d7898f7806c4","version":342,"action":"UPDATE"},{"gtasId":"23146661","tamrId":"60dfb9f9-aff9-3fba-9e26-5b7bc24ae117","version":342,"action":"UPDATE"},{"gtasId":"22423178","tamrId":"c60f82ac-1776-3d0b-be79-fa931f9acd11","version":342,"action":"UPDATE"},{"gtasId":"24429809","tamrId":"56025bd8-c129-3f4f-a5be-3bc43ddef8e8","version":342,"action":"UPDATE"},{"gtasId":"13769206","tamrId":"d95382de-367b-3e6e-9edd-27ede7b13365","version":342,"action":"UPDATE"},{"gtasId":"4305453","tamrId":"2c2873be-d126-3491-b430-763370ded291","version":342,"action":"UPDATE"},{"gtasId":"8026575","tamrId":"a9a827c0-4ae2-3efe-8e0b-64bbb99b83c1","version":342,"action":"UPDATE"},{"gtasId":"6659556","tamrId":"974fa897-fc95-372e-85b8-879b81faaa5c","version":342,"action":"UPDATE"},{"gtasId":"4242906","tamrId":"ad7f581b-f387-3796-a3f1-ab0dca388c71","version":342,"action":"UPDATE"},{"gtasId":"5769437","tamrId":"1c9ab180-977e-3b76-a258-8253e111c2f5","version":342,"action":"UPDATE"},{"gtasId":"18333004","tamrId":"ea03607b-7f90-3b4d-a18c-62e6205ba795","version":342,"action":"UPDATE"},{"gtasId":"11094493","tamrId":"140048d2-9a7d-3332-938b-2cf35a31e7b7","version":342,"action":"UPDATE"},{"gtasId":"14708942","tamrId":"f54d95f3-2814-396e-8175-f2a3232281a6","version":342,"action":"UPDATE"},{"gtasId":"21860458","tamrId":"c799dba0-3084-3694-aa8f-33182513ac66","version":342,"action":"UPDATE"},{"gtasId":"2745998","tamrId":"02b4b488-64a7-3096-9a3c-1108def2d3c3","version":342,"action":"UPDATE"},{"gtasId":"6142374","tamrId":"5f7b4177-ec12-3e52-9305-35c794198ab8","version":342,"action":"UPDATE"},{"gtasId":"7228203","tamrId":"22dd8b93-1126-3dc9-a726-d2aba8926ea8","version":342,"action":"UPDATE"},{"gtasId":"4823638","tamrId":"0547f820-b8d3-343e-958e-a3e2551b89fa","version":342,"action":"UPDATE"},{"gtasId":"9007234","tamrId":"049bf9c5-1ff5-3e35-b90a-782d7042587b","version":342,"action":"UPDATE"},{"gtasId":"1622268","tamrId":"0c867a79-6726-3424-9f14-83966219089f","version":342,"action":"UPDATE"},{"gtasId":"10838705","tamrId":"95fb3c92-7250-35ba-808c-9cf2da269d25","version":342,"action":"UPDATE"},{"gtasId":"14990161","tamrId":"8b1dd03b-b129-3f69-84e3-f6f7b62d09d0","version":342,"action":"UPDATE"},{"gtasId":"6714126","tamrId":"199cb4b3-7aef-3947-afa5-9ec9d7c8477e","version":342,"action":"UPDATE"},{"gtasId":"14098348","tamrId":"3d19314e-0adb-3f9c-b37a-6dfc184c42c0","version":342,"action":"UPDATE"},{"gtasId":"13579800","tamrId":"10f4ae13-d03f-3fbe-ba45-d43a98bfd76f","version":342,"action":"UPDATE"},{"gtasId":"2765592","tamrId":"dfd22761-9978-3be3-a093-d50715cc4466","version":342,"action":"UPDATE"},{"gtasId":"749425","tamrId":"962309be-2df3-31bd-8455-aa879e4207fa","version":342,"action":"UPDATE"},{"gtasId":"17010785","tamrId":"98aa58f7-c071-3431-bfcd-5cd434aa115a","version":342,"action":"UPDATE"},{"gtasId":"24670539","tamrId":"d8653555-8b81-3c27-b4ac-7197be3f93ca","version":342,"action":"UPDATE"},{"gtasId":"6609284","tamrId":"92cffb3e-715b-3db9-8241-ec3a8f187000","version":342,"action":"UPDATE"},{"gtasId":"5428966","tamrId":"f3b45d18-d22e-3b01-b9b8-450851381460","version":342,"action":"UPDATE"},{"gtasId":"10421015","tamrId":"e5a6aa1f-c8c8-3973-956c-db32b16ea3bb","version":342,"action":"UPDATE"},{"gtasId":"8784422","tamrId":"9f616ad5-dc6b-3f30-b4b1-32fead755460","version":342,"action":"UPDATE"},{"gtasId":"2812323","tamrId":"f81ecc24-3196-3e3c-b4e3-524cc5a30f4b","version":342,"action":"UPDATE"},{"gtasId":"7018299","tamrId":"61750313-ac82-37b7-bb3f-3af9c1d65c03","version":342,"action":"UPDATE"},{"gtasId":"13279956","tamrId":"71cacbb5-607a-34e5-b9ed-ccba8a5dfc4a","version":342,"action":"UPDATE"},{"gtasId":"14167459","tamrId":"7daeb40d-c541-37da-a18d-8fa86177127d","version":342,"action":"UPDATE"},{"gtasId":"21927140","tamrId":"8cb3a3fe-dd69-3d95-8140-3b8355667ec8","version":342,"action":"UPDATE"},{"gtasId":"14786410","tamrId":"25638bc9-263d-3f97-a797-ac799222f80c","version":342,"action":"UPDATE"},{"gtasId":"987366","tamrId":"d7025e89-0bcd-33d9-b70e-96d1f0c51d8c","version":342,"action":"UPDATE"},{"gtasId":"4566043","tamrId":"f54d95f3-2814-396e-8175-f2a3232281a6","version":342,"action":"UPDATE"},{"gtasId":"21759966","tamrId":"00f052f1-0640-317a-a594-ecac0abb514d","version":342,"action":"UPDATE"},{"gtasId":"6896173","tamrId":"a6156586-77ea-3b04-b2b1-6926e96fd787","version":342,"action":"UPDATE"},{"gtasId":"9728110","tamrId":"abbc8955-c796-339c-bd13-4b8b8b3b4564","version":342,"action":"UPDATE"},{"gtasId":"23414808","tamrId":"462f0e2c-706d-3459-a321-5a4718b2e275","version":342,"action":"UPDATE"},{"gtasId":"16660950","tamrId":"a191776e-5c37-3029-b461-d7285acbf415","version":342,"action":"UPDATE"},{"gtasId":"6090732","tamrId":"73593126-ed50-331d-89f6-172e15498bf5","version":342,"action":"UPDATE"},{"gtasId":"15479281","tamrId":"274c1c41-28ee-38f5-8283-e1d782ec8438","version":342,"action":"UPDATE"},{"gtasId":"18510952","tamrId":"adafde9a-5d08-395b-b94a-e24591e10a71","version":342,"action":"UPDATE"},{"gtasId":"13895690","tamrId":"7f0d08f1-3ba2-33de-868a-b775a86254a5","version":342,"action":"UPDATE"},{"gtasId":"12467647","tamrId":"5db1a15d-0516-30f4-850a-0fc40057ddc4","version":342,"action":"UPDATE"},{"gtasId":"9248250","tamrId":"ed038701-0f55-3c66-b00b-863cb508b932","version":342,"action":"UPDATE"},{"gtasId":"11097506","tamrId":"681b53c9-d5f8-398e-824d-81ce57854af5","version":342,"action":"UPDATE"},{"gtasId":"16518220","tamrId":"ec346337-b049-35d0-add4-479a4b19622d","version":342,"action":"UPDATE"},{"gtasId":"24327722","tamrId":"26c104e3-254e-3c4b-9128-fce6f0858de4","version":342,"action":"UPDATE"},{"gtasId":"24049352","tamrId":"78853444-70fc-3307-85dd-51817c18f7d6","version":342,"action":"UPDATE"},{"gtasId":"19308703","tamrId":"09f865db-3765-3ab9-b036-a944abac9924","version":342,"action":"UPDATE"},{"gtasId":"14925941","tamrId":"8a2f6018-3834-3783-b63b-a043ca6e44b9","version":342,"action":"UPDATE"},{"gtasId":"3176334","tamrId":"f69bc7ee-fae7-33a8-867c-1bc29fd13800","version":342,"action":"UPDATE"},{"gtasId":"2467471","tamrId":"b0b58598-b5e9-376c-95c0-03c9dc9bc937","version":342,"action":"UPDATE"},{"gtasId":"8233357","tamrId":"938a6413-c4b3-3686-a41f-d348f4f0e928","version":342,"action":"UPDATE"},{"gtasId":"4184612","tamrId":"2a561e99-f5be-318f-ab1a-829b8d1ac408","version":342,"action":"UPDATE"},{"gtasId":"2398262","tamrId":"da474cd0-3e2e-3d82-94b4-ea8dc056a24d","version":342,"action":"UPDATE"},{"gtasId":"9456343","tamrId":"54a3d9f3-6249-3d7f-9d6c-a4c74703bf45","version":342,"action":"UPDATE"},{"gtasId":"9921180","tamrId":"9f7d10c1-fd32-31f7-a1c0-481aca2c7478","version":342,"action":"UPDATE"},{"gtasId":"14042899","tamrId":"f0176f41-9056-3464-87d9-de7a9c793157","version":342,"action":"UPDATE"},{"gtasId":"22282623","tamrId":"e89f5cf7-502d-39df-b3b7-7324d8d8b747","version":342,"action":"UPDATE"},{"gtasId":"7506606","tamrId":"666fe77b-f576-329f-9699-43672aacf471","version":342,"action":"UPDATE"},{"gtasId":"16369490","tamrId":"7e7c253b-624f-35fd-abd6-ef183d26f3f0","version":342,"action":"UPDATE"},{"gtasId":"13075963","tamrId":"9ff73e58-3e34-3ef7-85d3-407f0696bf55","version":342,"action":"UPDATE"},{"gtasId":"12343535","tamrId":"4e176714-4478-3c57-9ba2-ceffa57cb92d","version":342,"action":"UPDATE"},{"gtasId":"8713270","tamrId":"ebc15fa7-358d-3149-9345-7a8fe438ff85","version":342,"action":"UPDATE"},{"gtasId":"9729428","tamrId":"7f709ecc-8623-3632-9fcd-409d50b91a48","version":342,"action":"UPDATE"},{"gtasId":"1036384","tamrId":"c163ad69-480f-34e7-8c6f-481339e78d7f","version":342,"action":"UPDATE"},{"gtasId":"5183065","tamrId":"21176dbb-b904-3d0e-9765-716cc2197762","version":342,"action":"UPDATE"},{"gtasId":"23649112","tamrId":"8ed9310c-922b-3dcc-bccf-966ecbf83881","version":342,"action":"UPDATE"},{"gtasId":"15467231","tamrId":"9a0bab16-10b0-37a4-82d4-5415f5047996","version":342,"action":"UPDATE"},{"gtasId":"23447715","tamrId":"709cb7df-9da8-38dc-9247-75464cd94df3","version":342,"action":"UPDATE"},{"gtasId":"14913953","tamrId":"5bf880eb-1d73-39e4-9999-eed5100c1248","version":342,"action":"UPDATE"},{"gtasId":"18123192","tamrId":"c251f321-903c-3ac6-96de-f8b147eb413e","version":342,"action":"UPDATE"},{"gtasId":"24040943","tamrId":"315ea81d-35f0-39ba-aaf5-7edd5462e084","version":342,"action":"UPDATE"},{"gtasId":"14145202","tamrId":"9fa250b2-bfd8-3bcd-8e73-768fa7d1d388","version":342,"action":"UPDATE"},{"gtasId":"19566224","tamrId":"92ee587c-251b-3222-ae03-3219a9127721","version":342,"action":"UPDATE"},{"gtasId":"11402596","tamrId":"fbe66d5e-6725-337d-8203-01c2e62c9a64","version":342,"action":"UPDATE"},{"gtasId":"13310434","tamrId":"4683b7d0-ea22-3252-8e85-f622c9b7f4c4","version":342,"action":"UPDATE"},{"gtasId":"18907465","tamrId":"b013f8a1-a626-3b2d-91bf-bf5bdd15856e","version":342,"action":"UPDATE"},{"gtasId":"17741050","tamrId":"45db31ce-980f-3500-a5e5-f3cf59277694","version":342,"action":"UPDATE"},{"gtasId":"7002769","tamrId":"f5050d39-bccd-397b-b8b6-0cd3c43ed9b2","version":342,"action":"UPDATE"},{"gtasId":"4572795","tamrId":"fe07f820-9e71-340c-be87-62f6c8df705a","version":342,"action":"UPDATE"},{"gtasId":"20427025","tamrId":"acc16f47-1798-305b-8436-8260760a77cd","version":342,"action":"UPDATE"},{"gtasId":"3099509","tamrId":"92071b7e-6fc2-3fb3-a7ea-a4c8dea8e3d3","version":342,"action":"UPDATE"},{"gtasId":"4270177","tamrId":"71d7896b-1a8d-3862-8044-3f3ca1c75723","version":342,"action":"UPDATE"},{"gtasId":"12567135","tamrId":"fde0848f-b1df-324a-8fd2-095727f6f0ce","version":342,"action":"UPDATE"},{"gtasId":"15493505","tamrId":"b6010985-a5b6-3635-bb53-26a64b45a65c","version":342,"action":"UPDATE"},{"gtasId":"23688787","tamrId":"51ca6131-ccbe-361c-a0a4-8ead347872c8","version":342,"action":"UPDATE"},{"gtasId":"20561901","tamrId":"5b63a352-ecb0-3cdd-8c9c-2e92e95e4411","version":342,"action":"UPDATE"},{"gtasId":"8176371","tamrId":"c8893719-35d0-3821-a661-0cb463829b27","version":342,"action":"UPDATE"},{"gtasId":"23040282","tamrId":"f3c951f0-af86-3cce-b6f2-c637e90cd8c6","version":342,"action":"UPDATE"},{"gtasId":"19131462","tamrId":"f28944c3-dcd2-3d55-9c3e-654194ac67dd","version":342,"action":"UPDATE"},{"gtasId":"118466","tamrId":"fd4b836d-eaf7-3062-af54-97dbe440772e","version":342,"action":"UPDATE"},{"gtasId":"23202353","tamrId":"779144a0-df6c-34d5-839a-d44856371af5","version":342,"action":"UPDATE"},{"gtasId":"24734251","tamrId":"5d052271-d292-34d5-b5a7-2b98ee2c85bb","version":342,"action":"UPDATE"},{"gtasId":"12136718","tamrId":"c56ac3de-502e-3fb9-ace8-9caf02780c08","version":342,"action":"UPDATE"},{"gtasId":"7336824","tamrId":"ac9eaaa2-f3d9-3b27-80a1-1638a8732af1","version":342,"action":"UPDATE"},{"gtasId":"22420843","tamrId":"95f2d1db-4f33-37de-8163-3e5982b8f66e","version":342,"action":"UPDATE"},{"gtasId":"15024731","tamrId":"e8a0618e-aa66-3d55-a98c-7653a839e48e","version":342,"action":"UPDATE"},{"gtasId":"17441086","tamrId":"5031759a-0da8-3ecf-aa42-5ada3f2b0430","version":342,"action":"UPDATE"},{"gtasId":"6132144","tamrId":"2a96a00e-98d3-32f3-b155-90d2d754d223","version":342,"action":"UPDATE"},{"gtasId":"22062538","tamrId":"825b4409-0f00-3cc3-a7df-3c8fe79aa913","version":342,"action":"UPDATE"},{"gtasId":"9714395","tamrId":"c0d73a46-fb1f-30ca-8def-0f3b8b43314f","version":342,"action":"UPDATE"},{"gtasId":"11242050","tamrId":"08d3029b-0a0b-319a-ac15-1024d30dcaa8","version":342,"action":"UPDATE"},{"gtasId":"6956404","tamrId":"b27534e2-370f-33d4-a377-bf109d3a787a","version":342,"action":"UPDATE"},{"gtasId":"12695384","tamrId":"06ba4807-f2ff-32c8-845f-681ea6ec38bc","version":342,"action":"UPDATE"},{"gtasId":"16416277","tamrId":"0a03f726-4198-3ce3-83ea-71ad02895cc3","version":342,"action":"UPDATE"},{"gtasId":"14876342","tamrId":"c718c2e9-e476-3cfe-9d73-679de0064241","version":342,"action":"UPDATE"},{"gtasId":"608561","tamrId":"4e27e8fb-affa-3b14-a445-1e2456a89fe1","version":342,"action":"UPDATE"},{"gtasId":"6144138","tamrId":"92397264-595a-337f-8a0e-5a66fd4cea1d","version":342,"action":"UPDATE"},{"gtasId":"11498110","tamrId":"cea7ec43-099b-358e-ac55-0b5eab2b8316","version":342,"action":"UPDATE"},{"gtasId":"14464316","tamrId":"50913c11-0996-367b-a9c5-91e02c4546e7","version":342,"action":"UPDATE"},{"gtasId":"21978723","tamrId":"f2f456cd-c6dd-3856-abd7-521a21cbf631","version":342,"action":"UPDATE"},{"gtasId":"1282767","tamrId":"86cae42d-7f41-3609-bf76-d2a02bc7e64e","version":342,"action":"UPDATE"},{"gtasId":"24980673","tamrId":"ef12b7a5-e045-303e-8ae7-46b2ca35d1b0","version":342,"action":"UPDATE"},{"gtasId":"6506026","tamrId":"e01b12df-0a86-3290-8aeb-8c584850fb42","version":342,"action":"UPDATE"},{"gtasId":"11461762","tamrId":"616aa954-cb15-3b72-8894-b7d02044ce7e","version":342,"action":"UPDATE"},{"gtasId":"853623","tamrId":"2ff7d4e3-77ce-3e96-a5a8-dd8c300f477e","version":342,"action":"UPDATE"},{"gtasId":"23339126","tamrId":"56f6d167-00e4-372a-94cb-106c698d2e72","version":342,"action":"UPDATE"},{"gtasId":"2033991","tamrId":"4554cd9b-022f-31ec-93f8-9e8afef92e69","version":342,"action":"UPDATE"},{"gtasId":"20166688","tamrId":"c55b2ebf-0e70-3abc-a35d-2af23b377c9a","version":342,"action":"UPDATE"},{"gtasId":"878908","tamrId":"6356f1db-f3f6-3410-954f-8a499afd6534","version":342,"action":"UPDATE"},{"gtasId":"1927934","tamrId":"22c40075-e6f5-3bb8-a7c5-a3c731235a08","version":342,"action":"UPDATE"},{"gtasId":"17728067","tamrId":"1b6f430a-b35e-3128-934c-3ebd0656523e","version":342,"action":"UPDATE"},{"gtasId":"7483525","tamrId":"f1c1c53b-e0ec-335d-8fc2-78c2a9321b07","version":342,"action":"UPDATE"},{"gtasId":"17792672","tamrId":"1487bad8-268c-37e6-ba78-93bbd8aea8a9","version":342,"action":"UPDATE"},{"gtasId":"6086616","tamrId":"23a68b34-4c33-377f-96c1-2bd29ea9babb","version":342,"action":"UPDATE"},{"gtasId":"16337021","tamrId":"5e2e39a2-bd02-3379-bff9-bc444c110fb4","version":342,"action":"UPDATE"},{"gtasId":"3749246","tamrId":"4ec4914c-29d0-3e89-bc71-cf835bcf8a67","version":342,"action":"UPDATE"},{"gtasId":"20854645","tamrId":"22d42863-1ed5-3155-8a95-dfaef608541f","version":342,"action":"UPDATE"},{"gtasId":"5376465","tamrId":"6c73f060-9094-35cd-b665-5508866b7be4","version":342,"action":"UPDATE"},{"gtasId":"1853055","tamrId":"e9644b69-cefc-3527-9de0-113df41f0c78","version":342,"action":"UPDATE"},{"gtasId":"1961881","tamrId":"447023b8-975f-305c-b875-b23d7a079c56","version":342,"action":"UPDATE"},{"gtasId":"21787132","tamrId":"eb9992f1-6a5c-3857-bac4-58b9a3207439","version":342,"action":"UPDATE"},{"gtasId":"13751992","tamrId":"2c60684f-d51f-3dc0-98c3-800a2988662d","version":342,"action":"UPDATE"},{"gtasId":"22410657","tamrId":"b049b235-7e7b-3a63-b94a-37f0a43001da","version":342,"action":"UPDATE"},{"gtasId":"9901515","tamrId":"a4bb3d0d-e72c-3a27-8f97-398010b6599b","version":342,"action":"UPDATE"},{"gtasId":"23234946","tamrId":"f7e355ed-0648-3268-9c0d-b7e18c726b78","version":342,"action":"UPDATE"},{"gtasId":"9242095","tamrId":"a251bee1-3fd9-3cd5-873f-18417b08e6ba","version":342,"action":"UPDATE"},{"gtasId":"19593817","tamrId":"319c7ffc-a793-3b7b-9709-4714c7aaa798","version":342,"action":"UPDATE"},{"gtasId":"16700551","tamrId":"91ee24e8-44f1-39ad-8db4-ee5fe3d18886","version":342,"action":"UPDATE"},{"gtasId":"11212223","tamrId":"bf9b5369-df5f-3ebf-a76d-55d0c207684f","version":342,"action":"UPDATE"},{"gtasId":"24040912","tamrId":"89edaf37-3e7c-3b6f-8f4c-327465e41582","version":342,"action":"UPDATE"},{"gtasId":"6664083","tamrId":"6919aa0e-957c-3b3e-b7ff-b9a193653fcc","version":342,"action":"UPDATE"},{"gtasId":"968237","tamrId":"21881ebc-55df-3cdd-b8d9-d21792c8f214","version":342,"action":"UPDATE"},{"gtasId":"363536","tamrId":"30ccb52b-40e5-3e59-9fcb-efe7e009d18b","version":342,"action":"UPDATE"},{"gtasId":"1534904","tamrId":"03dae92e-072c-3484-8c8f-5f96c6afb59a","version":342,"action":"UPDATE"},{"gtasId":"7607496","tamrId":"f899b358-1daa-3531-83a1-92f2a2105472","version":342,"action":"UPDATE"},{"gtasId":"3480282","tamrId":"3e6ebb0b-e093-3fbc-a9c5-1426c0633973","version":342,"action":"UPDATE"},{"gtasId":"16910488","tamrId":"71ff3ed0-c9ba-3ceb-b601-6e65a6daa47a","version":342,"action":"UPDATE"},{"gtasId":"6677394","tamrId":"8722ccbe-e448-355a-be10-ddcd203f967e","version":342,"action":"UPDATE"},{"gtasId":"24998776","tamrId":"1a3640ff-af31-3a6f-9e06-eb150198e866","version":342,"action":"UPDATE"},{"gtasId":"5875427","tamrId":"3bacf58f-f810-3ea4-a8f9-ea97624d67e9","version":342,"action":"UPDATE"},{"gtasId":"17260505","tamrId":"7a998a20-bd42-3753-9355-798dc9e2f2ba","version":342,"action":"UPDATE"},{"gtasId":"2643109","tamrId":"14ce0d4e-b611-3360-8af4-35bbe7c090c5","version":342,"action":"UPDATE"},{"gtasId":"5377779","tamrId":"01c2405f-5136-36b3-9365-daf08a241b81","version":342,"action":"UPDATE"},{"gtasId":"14405196","tamrId":"d8d26b30-1dfe-38d7-b060-f91e33bd502e","version":342,"action":"UPDATE"},{"gtasId":"25524126","tamrId":"e88e6d66-fe1a-3829-95a3-dcfbf9d7a594","version":342,"action":"UPDATE"},{"gtasId":"16213547","tamrId":"c0c94d43-a9ee-3578-9e0e-733c8e5bcf78","version":342,"action":"UPDATE"},{"gtasId":"13317005","tamrId":"41a4f4d1-25d8-3ed7-92b1-c4096d6882b2","version":342,"action":"UPDATE"},{"gtasId":"21049793","tamrId":"6b23ab11-42ec-35c4-a6aa-b742d9749fa2","version":342,"action":"UPDATE"},{"gtasId":"23371276","tamrId":"3d6d6465-3508-3bd5-8ebe-a8009ee000cf","version":342,"action":"UPDATE"},{"gtasId":"23456648","tamrId":"6aec4291-232a-33fa-b9ef-22af8da139cb","version":342,"action":"UPDATE"},{"gtasId":"15142963","tamrId":"b0a7a946-d0a7-3598-9649-f90ab9776bd0","version":342,"action":"UPDATE"},{"gtasId":"9208150","tamrId":"1228ffe4-c721-3b0e-92a0-46656a25e0a3","version":342,"action":"UPDATE"},{"gtasId":"1423060","tamrId":"617d60e5-227d-3407-a9ec-b2e1f57cbb5c","version":342,"action":"UPDATE"},{"gtasId":"3530985","tamrId":"da1d26a4-bbfd-301b-8ba1-6397ce897ab7","version":342,"action":"UPDATE"},{"gtasId":"15559783","tamrId":"b4eb8df4-dcdf-32ba-88fe-a864ae38dc22","version":342,"action":"UPDATE"},{"gtasId":"13222217","tamrId":"2c44e037-1937-338f-95ac-c1d9ed3be2f3","version":342,"action":"UPDATE"},{"gtasId":"11956696","tamrId":"74b7e245-f4fe-34ec-8434-d51c8972e3aa","version":342,"action":"UPDATE"},{"gtasId":"19244235","tamrId":"d34783ab-c463-3662-a849-b605578e6f1f","version":342,"action":"UPDATE"},{"gtasId":"14202457","tamrId":"e3f0b207-b9b8-37e1-ad86-ca4261fc8225","version":342,"action":"UPDATE"},{"gtasId":"12462806","tamrId":"02132c8d-4526-3abd-a06d-6c488a22c54e","version":342,"action":"UPDATE"},{"gtasId":"3459691","tamrId":"e874a655-ffca-30e8-aca5-8aea2a31dfcd","version":342,"action":"UPDATE"},{"gtasId":"6366880","tamrId":"9c0d22ab-2a62-37b2-80ba-4d1929e0fd5c","version":342,"action":"UPDATE"},{"gtasId":"23114130","tamrId":"6361f1d4-44f9-33e3-ab79-6475c0dff90f","version":342,"action":"UPDATE"},{"gtasId":"17227942","tamrId":"5d45dcf6-9970-3a51-90c3-b9eb4bcac1e0","version":342,"action":"UPDATE"},{"gtasId":"21642992","tamrId":"cb0d4e2b-a09a-3ce1-8dca-ab129938378a","version":342,"action":"UPDATE"},{"gtasId":"10067064","tamrId":"957ac96c-419f-345b-9d3d-79d0f8a37f55","version":342,"action":"UPDATE"},{"gtasId":"1100523","tamrId":"b805456f-311f-3b3a-b55d-29ee1bc99892","version":342,"action":"UPDATE"},{"gtasId":"7454142","tamrId":"1f42fe15-b39e-3d2c-904a-3bd02bcc8878","version":342,"action":"UPDATE"},{"gtasId":"23351658","tamrId":"1d560510-a670-3d51-b83d-0145e94a5d18","version":342,"action":"UPDATE"},{"gtasId":"14642493","tamrId":"bd81a4d0-7995-3244-9157-01a467f3f622","version":342,"action":"UPDATE"},{"gtasId":"19533392","tamrId":"6b6e978d-f434-3b41-b204-de4ae9d6f85c","version":342,"action":"UPDATE"},{"gtasId":"24256987","tamrId":"085da562-f537-35df-b4c0-285a7ec2b6eb","version":342,"action":"UPDATE"},{"gtasId":"6813815","tamrId":"45a7b0c1-fa86-3990-824c-4a9a2f7cc89d","version":342,"action":"UPDATE"},{"gtasId":"188340","tamrId":"45812af3-b9b3-37ef-b7ee-32cae4f013d0","version":342,"action":"UPDATE"},{"gtasId":"12644652","tamrId":"a195671f-3e19-34a7-a5fc-856c347a004f","version":342,"action":"UPDATE"},{"gtasId":"10164154","tamrId":"922fd23e-bcaa-3b75-ab19-421f3ecb031f","version":342,"action":"UPDATE"},{"gtasId":"3396496","tamrId":"0499ce37-9c26-3f76-92b1-b1cd906f752c","version":342,"action":"UPDATE"},{"gtasId":"18292933","tamrId":"74c2e89e-2756-3dea-8499-5733445258a1","version":342,"action":"UPDATE"},{"gtasId":"2948676","tamrId":"4428c27d-574c-3b30-acab-d819499bde65","version":342,"action":"UPDATE"},{"gtasId":"16793981","tamrId":"ce158d56-5de8-34f5-b312-d112d9883c0a","version":342,"action":"UPDATE"},{"gtasId":"19862562","tamrId":"a9195633-d0c8-3fc2-84b5-61f229fa8e6f","version":342,"action":"UPDATE"},{"gtasId":"17698448","tamrId":"c3ef5e33-6f4d-3495-adb6-be3f00ee2683","version":342,"action":"UPDATE"},{"gtasId":"13910235","tamrId":"d308d785-a279-3f55-b23a-9137e6e7df52","version":342,"action":"UPDATE"},{"gtasId":"11120542","tamrId":"cab3cdb8-4e83-374c-96f8-65f28d944c8e","version":342,"action":"UPDATE"},{"gtasId":"9491503","tamrId":"6e6c0ab0-3078-3bf8-946c-b090a3d8fdd0","version":342,"action":"UPDATE"},{"gtasId":"12939908","tamrId":"01850435-2a45-378e-9e6b-ee3985ff36ae","version":342,"action":"UPDATE"},{"gtasId":"8570170","tamrId":"1f12c625-d862-34e1-98b8-40ff19f79fa9","version":342,"action":"UPDATE"},{"gtasId":"18194395","tamrId":"d8fd3f88-8ff2-30a8-8bec-167e4e60f9fe","version":342,"action":"UPDATE"},{"gtasId":"19711667","tamrId":"f0ded504-4362-33b8-9306-eba1ad207aeb","version":342,"action":"UPDATE"},{"gtasId":"16697312","tamrId":"76230fac-0793-35c2-93f4-cadf54128b80","version":342,"action":"UPDATE"},{"gtasId":"20631661","tamrId":"b7a18cd8-9cc9-316d-b4a6-a6ac2c381369","version":342,"action":"UPDATE"},{"gtasId":"24079102","tamrId":"66d53423-6da9-349b-9902-468025890ad3","version":342,"action":"UPDATE"},{"gtasId":"2436307","tamrId":"8c98016e-252b-386f-be2e-6045bcfec0f6","version":342,"action":"UPDATE"},{"gtasId":"22999499","tamrId":"f361a012-bd5b-3a9c-b2ea-b48e56708a16","version":342,"action":"UPDATE"},{"gtasId":"1121468","tamrId":"be30b651-29e5-3a0f-9f74-18a32e622d45","version":342,"action":"UPDATE"},{"gtasId":"15082686","tamrId":"36801e10-5131-3ba5-93da-dac2e54039ec","version":342,"action":"UPDATE"},{"gtasId":"5939966","tamrId":"1fecbb8a-0b6a-311d-b266-23a168748c0a","version":342,"action":"UPDATE"},{"gtasId":"16128478","tamrId":"a696f911-94bd-3be2-b88f-abbbe337a33d","version":342,"action":"UPDATE"},{"gtasId":"13692919","tamrId":"01525ef7-8c0e-306f-b8f5-83de3cbb1c52","version":342,"action":"UPDATE"},{"gtasId":"7327014","tamrId":"9c5e02db-aacd-3dde-9493-edb2f8c06a3e","version":342,"action":"UPDATE"},{"gtasId":"1997818","tamrId":"69134260-c25c-3e57-b67f-ec511f615351","version":342,"action":"UPDATE"},{"gtasId":"11123608","tamrId":"d178532e-61ad-3e39-a14e-81f18031f7e7","version":342,"action":"UPDATE"},{"gtasId":"17232472","tamrId":"e02b5121-a93b-31db-84fc-26ec9b909690","version":342,"action":"UPDATE"},{"gtasId":"3738577","tamrId":"7d0fc6e0-b29f-331c-940a-64a0241628a7","version":342,"action":"UPDATE"},{"gtasId":"23498452","tamrId":"269d9353-051e-3003-8a84-90c2a97f9952","version":342,"action":"UPDATE"},{"gtasId":"18700321","tamrId":"cd829046-8387-3d64-b98c-7ad18c616a38","version":342,"action":"UPDATE"},{"gtasId":"526265","tamrId":"cc720b6b-0228-3e89-8e94-e01d6a1e85e4","version":342,"action":"UPDATE"},{"gtasId":"2757071","tamrId":"aec01dd8-fccf-3997-838f-bf682dc5e066","version":342,"action":"UPDATE"},{"gtasId":"5499297","tamrId":"508e2519-fd4d-3703-8504-51410ac0cfc8","version":342,"action":"UPDATE"},{"gtasId":"13027416","tamrId":"a8ae48d5-d31c-3d51-b4a4-7083db5e7622","version":342,"action":"UPDATE"},{"gtasId":"3383192","tamrId":"f8158ce7-4e59-37a9-baae-8cc05ed60a75","version":342,"action":"UPDATE"},{"gtasId":"8584785","tamrId":"cb6d8a1f-727b-3bca-82a6-107a20d19023","version":342,"action":"UPDATE"},{"gtasId":"6844984","tamrId":"55b7f52d-fe3c-386f-8240-50a1e8ebe77e","version":342,"action":"UPDATE"},{"gtasId":"6006518","tamrId":"1f258b54-f3f0-380d-9e17-102b18f73d34","version":342,"action":"UPDATE"},{"gtasId":"17142502","tamrId":"3666e72e-364a-363e-9ef4-d46b0a05c9cb","version":342,"action":"UPDATE"},{"gtasId":"19755239","tamrId":"23f9d547-49df-34e0-b6c6-6bd1851c6ef5","version":342,"action":"UPDATE"},{"gtasId":"6581297","tamrId":"e2b428ab-ca71-3828-899d-facd54ee49f9","version":342,"action":"UPDATE"},{"gtasId":"2611346","tamrId":"1ab507c7-7c59-3b42-bce3-6908360a4ba6","version":342,"action":"UPDATE"},{"gtasId":"2049497","tamrId":"a7677f6d-a662-3da3-9dff-d77b18071ca4","version":342,"action":"UPDATE"},{"gtasId":"24653880","tamrId":"40e4a98a-7963-371e-b6f2-283ea8d5c135","version":342,"action":"UPDATE"},{"gtasId":"6273830","tamrId":"c73bed36-06a0-378a-824a-01488dc184d6","version":342,"action":"UPDATE"},{"gtasId":"4966073","tamrId":"9f133357-8c6b-39a7-9b6e-3920673a26b5","version":342,"action":"UPDATE"},{"gtasId":"11608372","tamrId":"7e8b7cbd-b1b7-38f1-9e36-48161ec10028","version":342,"action":"UPDATE"},{"gtasId":"433202","tamrId":"6ea31861-482a-30d0-8ea3-5b638d3826e2","version":342,"action":"UPDATE"},{"gtasId":"16322603","tamrId":"aa4fa987-68f1-32cb-9b3e-54a7f34e5fdd","version":342,"action":"UPDATE"},{"gtasId":"10833822","tamrId":"a036f408-e459-391d-b925-127712ca45ec","version":342,"action":"UPDATE"},{"gtasId":"928842","tamrId":"72e03a14-bb63-3c60-8568-cada9605e0fd","version":342,"action":"UPDATE"},{"gtasId":"16285331","tamrId":"e3b9bcd3-d5fe-3f8c-ad6b-63511e60aec1","version":342,"action":"UPDATE"},{"gtasId":"1810040","tamrId":"5f3afdd7-7c94-356e-9e3f-668444001202","version":342,"action":"UPDATE"},{"gtasId":"23448178","tamrId":"05ff3d62-b1b6-36aa-89a7-2ae9c2435613","version":342,"action":"UPDATE"},{"gtasId":"4096402","tamrId":"a143138c-4f99-3dbe-8a93-e193058fc1e9","version":342,"action":"UPDATE"},{"gtasId":"7128036","tamrId":"521ab909-9f4f-3476-aeeb-e7a5fec19974","version":342,"action":"UPDATE"},{"gtasId":"18366725","tamrId":"c7e9686d-b47f-38ac-9fb4-ea9e97039724","version":342,"action":"UPDATE"},{"gtasId":"14547065","tamrId":"dfea6624-88a6-378a-92a4-ae8da4490338","version":342,"action":"UPDATE"},{"gtasId":"5454323","tamrId":"ed823894-8b32-39d0-be41-69ac7e0d00b9","version":342,"action":"UPDATE"},{"gtasId":"16881320","tamrId":"fc4e37b6-eb99-39e0-92cd-25820f45a2c8","version":342,"action":"UPDATE"},{"gtasId":"2392024","tamrId":"a9ee2528-848f-3a13-810a-c079c9becdde","version":342,"action":"UPDATE"},{"gtasId":"24830191","tamrId":"d98aca98-b2dc-3087-a1bf-511286a429f3","version":342,"action":"UPDATE"},{"gtasId":"20690692","tamrId":"5217df1f-7783-3d5d-aed6-96d826a4b69d","version":342,"action":"UPDATE"},{"gtasId":"3739152","tamrId":"1b440490-ca6b-34f6-bb7d-b3b9f657e83f","version":342,"action":"UPDATE"},{"gtasId":"14388161","tamrId":"5bb929d4-0132-332b-ae1f-4da555779c1e","version":342,"action":"UPDATE"},{"gtasId":"24315064","tamrId":"e8a76756-a959-324e-a3c5-b20812fd8d07","version":342,"action":"UPDATE"},{"gtasId":"17316805","tamrId":"b92c7fcf-9274-3796-b574-739b8806dafa","version":342,"action":"UPDATE"},{"gtasId":"23644493","tamrId":"24360387-2835-319f-bb81-0610c2a45f77","version":342,"action":"UPDATE"},{"gtasId":"18706336","tamrId":"30d1e024-1b26-306d-bfc9-0a4f98a5c833","version":342,"action":"UPDATE"},{"gtasId":"7191993","tamrId":"e1d75b98-6b58-3725-9699-1038a02fe604","version":342,"action":"UPDATE"},{"gtasId":"3111003","tamrId":"1dedd236-cc90-3648-8f41-f6f2024ca85c","version":342,"action":"UPDATE"},{"gtasId":"8112351","tamrId":"41775d9b-a805-305b-ab6c-67fcc37c6346","version":342,"action":"UPDATE"},{"gtasId":"7143442","tamrId":"9cab9b2e-e54a-3b3b-87eb-0895051c441f","version":342,"action":"UPDATE"},{"gtasId":"5637660","tamrId":"8c024dee-5601-33d3-80a5-c4f4ec8e1c31","version":342,"action":"UPDATE"},{"gtasId":"17356034","tamrId":"8c62a44b-21fe-3fb4-b2a4-354bd2dab879","version":342,"action":"UPDATE"},{"gtasId":"6102220","tamrId":"d17ece95-88e7-3125-ad09-242db4c8f0ab","version":342,"action":"UPDATE"},{"gtasId":"24008696","tamrId":"59a6ce2d-fea2-3e5e-910c-acd1af66fee9","version":342,"action":"UPDATE"},{"gtasId":"23693413","tamrId":"0b616dfc-6a90-3d88-859e-3635d6233129","version":342,"action":"UPDATE"},{"gtasId":"14977872","tamrId":"97f1b901-233f-30b0-9d80-7f2f9f14c50f","version":342,"action":"UPDATE"},{"gtasId":"5063367","tamrId":"1ead773c-9f6d-3a51-a7fc-89fc7454c29a","version":342,"action":"UPDATE"},{"gtasId":"2204904","tamrId":"73318c15-f517-348e-b729-a2a66a69a4cd","version":342,"action":"UPDATE"},{"gtasId":"17350747","tamrId":"b6ab3e03-340e-3f50-a519-df2ce9fa061a","version":342,"action":"UPDATE"},{"gtasId":"4256654","tamrId":"f8646b03-3f10-3e3d-b44c-197c13aa7a87","version":342,"action":"UPDATE"},{"gtasId":"6708393","tamrId":"34dac035-cd2a-3fc6-ac82-ec3a22a2f31f","version":342,"action":"UPDATE"},{"gtasId":"15433910","tamrId":"2f36cf14-c976-34cc-9d3c-248e28e7f959","version":342,"action":"UPDATE"},{"gtasId":"21569678","tamrId":"790647c5-42be-3545-884a-cb465e5e7b5d","version":342,"action":"UPDATE"},{"gtasId":"1526303","tamrId":"3da8b866-2da0-3ccf-9793-2b9ee90efd31","version":342,"action":"UPDATE"},{"gtasId":"447866","tamrId":"f98ecec3-b2ec-31df-bac7-c8e1bec8721e","version":342,"action":"UPDATE"},{"gtasId":"7440480","tamrId":"25f26ef8-f08a-31f2-8c5e-cb69b762b3cb","version":342,"action":"UPDATE"},{"gtasId":"2610223","tamrId":"25f4dcae-0671-3f7f-b342-855d28473948","version":342,"action":"UPDATE"},{"gtasId":"13262954","tamrId":"c628c86a-fcb3-3817-9b0a-7e772f9c97ed","version":342,"action":"UPDATE"},{"gtasId":"2050560","tamrId":"88c0db9a-b67f-3799-82ad-2cb930516bf1","version":342,"action":"UPDATE"},{"gtasId":"8911047","tamrId":"3145535a-c0b6-38b6-8df4-a6fbd52bba66","version":342,"action":"UPDATE"},{"gtasId":"4713887","tamrId":"d048e95e-e7ff-37a4-a2b1-a26cd6a6fc9a","version":342,"action":"UPDATE"},{"gtasId":"7426179","tamrId":"f4a1d4d9-34fa-33f9-ad17-bd131b9807fa","version":342,"action":"UPDATE"},{"gtasId":"5487278","tamrId":"bb1ad57d-fa48-338c-ab85-63a2c5346880","version":342,"action":"UPDATE"},{"gtasId":"11584519","tamrId":"e99d180d-9b85-39a7-a520-28cf25ab9561","version":342,"action":"UPDATE"},{"gtasId":"10494083","tamrId":"f822f579-58a3-3c33-a3c7-45d971535daa","version":342,"action":"UPDATE"},{"gtasId":"11619981","tamrId":"aee0bfa2-7b88-3246-8b2d-a7e3efd9a8d8","version":342,"action":"UPDATE"},{"gtasId":"6358513","tamrId":"d2c9e456-ca52-3829-b26e-c3d549b49fa8","version":342,"action":"UPDATE"},{"gtasId":"25416403","tamrId":"3c32dfe6-6c39-36b0-a416-db5972b7861a","version":342,"action":"UPDATE"},{"gtasId":"9664395","tamrId":"b2e2c69c-8ccb-37d6-bcee-0097c80373df","version":342,"action":"UPDATE"},{"gtasId":"23660530","tamrId":"2338b62c-c4bc-3cc6-90bc-c71ffcccc089","version":342,"action":"UPDATE"},{"gtasId":"4601604","tamrId":"d4af67bd-d5e7-328e-b692-6256f522af39","version":342,"action":"UPDATE"},{"gtasId":"5395476","tamrId":"c5a9f693-c4d1-3e0c-a8cf-99bfa8314968","version":342,"action":"UPDATE"},{"gtasId":"4968853","tamrId":"8d4497b4-b2fe-3088-a09c-31df469ab70d","version":342,"action":"UPDATE"},{"gtasId":"9014529","tamrId":"9b6f0a6c-46d7-3727-b4b0-69e9da776670","version":342,"action":"UPDATE"},{"gtasId":"24688758","tamrId":"35eb53d6-a02d-3804-8f21-b44324e584b5","version":342,"action":"UPDATE"},{"gtasId":"18198098","tamrId":"c12645df-1def-3b99-ba42-08286879170e","version":342,"action":"UPDATE"},{"gtasId":"17565223","tamrId":"c5d49672-acee-383d-b10b-6435a97dcdfa","version":342,"action":"UPDATE"},{"gtasId":"20116593","tamrId":"fac00700-ce6b-3077-935b-75147ce6657c","version":342,"action":"UPDATE"},{"gtasId":"2404795","tamrId":"dd4a8f2f-3da8-3e8e-a223-a1543d3863e5","version":342,"action":"UPDATE"},{"gtasId":"25100192","tamrId":"3ceab631-8580-3144-b2a9-a453de505a2b","version":342,"action":"UPDATE"},{"gtasId":"17549151","tamrId":"18880d90-7f83-3655-bbf3-7d04c584f3bb","version":342,"action":"UPDATE"},{"gtasId":"10152335","tamrId":"f16e9f3a-7657-3c52-b011-27d92983875d","version":342,"action":"UPDATE"},{"gtasId":"15943696","tamrId":"94d01941-d49b-3f46-953a-e65a72abdb12","version":342,"action":"UPDATE"},{"gtasId":"19296384","tamrId":"6a38e4db-8c28-39c3-89c8-0e6735d0d254","version":342,"action":"UPDATE"},{"gtasId":"15461128","tamrId":"7809dd95-259a-3f61-b875-0f9e125a9cbb","version":342,"action":"UPDATE"},{"gtasId":"23864367","tamrId":"e935aab5-3f49-393f-9418-59ecf7005756","version":342,"action":"UPDATE"},{"gtasId":"8448875","tamrId":"a9d464dd-e26e-390f-8a6e-583dc74ca35c","version":342,"action":"UPDATE"},{"gtasId":"8433772","tamrId":"a963835a-d181-3ca0-8992-8488e6cc7c52","version":342,"action":"UPDATE"},{"gtasId":"20990705","tamrId":"06ddcc3d-99c2-3a4b-937e-22d4a056e4c8","version":342,"action":"UPDATE"},{"gtasId":"6424361","tamrId":"fa62e427-ff3f-38b6-b87e-94165826be49","version":342,"action":"UPDATE"},{"gtasId":"11972648","tamrId":"e8a76756-a959-324e-a3c5-b20812fd8d07","version":342,"action":"UPDATE"},{"gtasId":"6000244","tamrId":"d6569a18-1a1b-361c-82c7-78ba07f76736","version":342,"action":"UPDATE"},{"gtasId":"24801682","tamrId":"dc3e1e83-f759-3ac6-bdcf-cdf9d83f4a61","version":342,"action":"UPDATE"},{"gtasId":"3399363","tamrId":"9ed49903-82c8-3b34-a56e-e2f5203b6618","version":342,"action":"UPDATE"},{"gtasId":"6424363","tamrId":"c29f8c96-df07-36ff-895e-6bcef81229da","version":342,"action":"UPDATE"},{"gtasId":"14803581","tamrId":"6ffcd45d-f049-344d-8c34-90ce74d12787","version":342,"action":"UPDATE"},{"gtasId":"3440060","tamrId":"836d867e-af29-33cc-b5bd-d97f25f8ba4e","version":342,"action":"UPDATE"},{"gtasId":"1942530","tamrId":"8395f095-933f-3334-878e-99ab329fb695","version":342,"action":"UPDATE"},{"gtasId":"6375018","tamrId":"57712943-04ca-3286-adf5-df2a2bab8ead","version":342,"action":"UPDATE"},{"gtasId":"5030471","tamrId":"cab83e39-7492-3f73-afca-b0fd4cf640d9","version":342,"action":"UPDATE"},{"gtasId":"11651263","tamrId":"1a3640ff-af31-3a6f-9e06-eb150198e866","version":342,"action":"UPDATE"},{"gtasId":"25392530","tamrId":"eb25278d-aa17-341f-98d7-ab37cdc49977","version":342,"action":"UPDATE"},{"gtasId":"7933635","tamrId":"c446a77a-7911-35c1-bffa-ece46f275ac2","version":342,"action":"UPDATE"},{"gtasId":"1937152","tamrId":"cca6906d-c93e-3bd4-9dbe-85666ae72929","version":342,"action":"UPDATE"},{"gtasId":"547013","tamrId":"118f1ab3-0924-369b-baae-be2af704eb65","version":342,"action":"UPDATE"},{"gtasId":"637072","tamrId":"cc0ed427-ec1d-3b15-b9e3-2cc60d8492af","version":342,"action":"UPDATE"},{"gtasId":"2012283","tamrId":"94933a58-e431-3a5a-b3f8-8dbd825775e5","version":342,"action":"UPDATE"},{"gtasId":"4121748","tamrId":"2ebec553-e896-3f81-962c-695e4bf2b622","version":342,"action":"UPDATE"},{"gtasId":"14312956","tamrId":"79a28f33-0ce3-3032-8602-4e112cbb8cef","version":342,"action":"UPDATE"},{"gtasId":"21792700","tamrId":"c3c12284-5699-34ab-bd76-3df8736fe852","version":342,"action":"UPDATE"},{"gtasId":"10529247","tamrId":"5182d99f-f73d-3e64-a5cc-a9283b26b612","version":342,"action":"UPDATE"},{"gtasId":"25192902","tamrId":"620b14c7-828a-3443-9cc0-b6f462b4a308","version":342,"action":"UPDATE"},{"gtasId":"8697672","tamrId":"fef66c45-704b-3e75-ae5b-4b01ca336140","version":342,"action":"UPDATE"},{"gtasId":"1017046","tamrId":"51ba29df-6677-394c-b6e9-f1e227d6028a","version":342,"action":"UPDATE"},{"gtasId":"1983013","tamrId":"42c214e9-40f0-32b0-a9d4-1a96b96adbff","version":342,"action":"UPDATE"},{"gtasId":"10417847","tamrId":"79fe4fbd-cbfe-3918-8bd5-8c527c6542e8","version":342,"action":"UPDATE"},{"gtasId":"19641398","tamrId":"63d69158-e201-39c8-809a-39769d5cc98e","version":342,"action":"UPDATE"},{"gtasId":"10306750","tamrId":"40676737-f053-30f4-bccb-4ef76da5881e","version":342,"action":"UPDATE"},{"gtasId":"6959357","tamrId":"46e5c530-b154-3bd7-bd78-20dc15cc304d","version":342,"action":"UPDATE"},{"gtasId":"7254354","tamrId":"f61033c7-7c3b-32cf-a81f-8ec696dd56d5","version":342,"action":"UPDATE"},{"gtasId":"22516115","tamrId":"f64fe569-c250-3193-acaa-23baa10b49ad","version":342,"action":"UPDATE"},{"gtasId":"7992827","tamrId":"9ab0f0da-228b-3409-8482-c730e78b0bc8","version":342,"action":"UPDATE"},{"gtasId":"2607480","tamrId":"4678eed1-a4aa-342d-848c-a77ac2cbf6f5","version":342,"action":"UPDATE"},{"gtasId":"4651038","tamrId":"a307911b-a77b-3254-9e64-19b54159721d","version":342,"action":"UPDATE"},{"gtasId":"2203629","tamrId":"bf093520-ed23-3a5f-9e64-f585500d5139","version":342,"action":"UPDATE"},{"gtasId":"21477838","tamrId":"168e70eb-18e7-3f60-8b21-f15a1982f0b9","version":342,"action":"UPDATE"},{"gtasId":"11400611","tamrId":"daa3f384-eadf-3af8-9cc7-0a722b8f1778","version":342,"action":"UPDATE"},{"gtasId":"25404483","tamrId":"989a3f83-bbc5-35c8-97c5-a2ed0f53cb8f","version":342,"action":"UPDATE"},{"gtasId":"17061312","tamrId":"6f569d72-af1e-37c9-9d98-5861c9816738","version":342,"action":"UPDATE"},{"gtasId":"14927523","tamrId":"45c86d7b-f007-3971-8c35-4aedc984fbd8","version":342,"action":"UPDATE"},{"gtasId":"22263491","tamrId":"1ef034c3-8b5b-32d5-bce5-10aa5e23055e","version":342,"action":"UPDATE"},{"gtasId":"13730870","tamrId":"ad4501d8-719f-3ed5-bfe9-7688b56b085b","version":342,"action":"UPDATE"},{"gtasId":"13438074","tamrId":"dfc5c770-25a9-34d0-afcd-65a4ffbb8606","version":342,"action":"UPDATE"},{"gtasId":"3374095","tamrId":"ad8ea91b-5676-34f3-b195-576b20871708","version":342,"action":"UPDATE"},{"gtasId":"7026054","tamrId":"c8058d3f-df0b-322f-8946-0a78f5ee502a","version":342,"action":"UPDATE"},{"gtasId":"18648110","tamrId":"e9638cc7-05c8-36ff-bc33-34bcd0053109","version":342,"action":"UPDATE"},{"gtasId":"15654256","tamrId":"c6f59e05-4fe6-3429-9362-e490da41f1ac","version":342,"action":"UPDATE"},{"gtasId":"5772021","tamrId":"de189c77-ebc3-34d1-ab28-767df7c834f4","version":342,"action":"UPDATE"},{"gtasId":"10725","tamrId":"8806c4b5-4ef7-3553-9729-ccc6a81a1e24","version":342,"action":"UPDATE"},{"gtasId":"5651929","tamrId":"461b3007-690b-3253-aa68-e1952ee29a09","version":342,"action":"UPDATE"},{"gtasId":"6684491","tamrId":"1af56d2e-cf0a-3924-bf2e-0a60aa10ebef","version":342,"action":"UPDATE"},{"gtasId":"22915189","tamrId":"9b9d960d-969d-3169-b1ce-ad8d317d78f0","version":342,"action":"UPDATE"},{"gtasId":"8871359","tamrId":"979d9968-a2f4-337d-9c7d-f7e5aa6641f8","version":342,"action":"UPDATE"},{"gtasId":"22221643","tamrId":"cef9b074-c13e-36ac-846c-796521532da9","version":342,"action":"UPDATE"},{"gtasId":"25462308","tamrId":"bde998cc-02aa-35a7-a4ae-6b7a6a6e9c84","version":342,"action":"UPDATE"},{"gtasId":"14845339","tamrId":"67a85f6a-4cd5-319a-bea3-248108abba07","version":342,"action":"UPDATE"},{"gtasId":"6919324","tamrId":"608063c4-f36a-35da-bb10-c082e96e67dc","version":342,"action":"UPDATE"},{"gtasId":"9245919","tamrId":"9cb8d770-00d5-3513-8ee4-18d347ba7a5f","version":342,"action":"UPDATE"},{"gtasId":"21692430","tamrId":"22038091-a12b-3585-b733-eab29e01a300","version":342,"action":"UPDATE"},{"gtasId":"3926935","tamrId":"5150b7a8-32dc-339e-b1b4-33119c32c265","version":342,"action":"UPDATE"},{"gtasId":"15353099","tamrId":"7630e564-2d93-36a4-8bf9-3c50f9347eb9","version":342,"action":"UPDATE"},{"gtasId":"24661409","tamrId":"4e5a506c-30a0-3836-9765-663437f89edc","version":342,"action":"UPDATE"},{"gtasId":"19733198","tamrId":"a0199d75-57af-3ae7-b920-7f1d2c2d784b","version":342,"action":"UPDATE"},{"gtasId":"14845327","tamrId":"b6adeb74-81d4-3f7e-bded-63ef588ea50e","version":342,"action":"UPDATE"},{"gtasId":"19297663","tamrId":"0eb0cd60-4a0a-3e49-bdc7-594122214fdf","version":342,"action":"UPDATE"},{"gtasId":"11346624","tamrId":"cbb9d323-b9db-3b61-b2b9-1f37f7b1b346","version":342,"action":"UPDATE"},{"gtasId":"18398388","tamrId":"3ada178a-719c-3f53-b24a-4f707ccd224d","version":342,"action":"UPDATE"},{"gtasId":"8639728","tamrId":"e2261c08-3a6a-3c4c-8dac-c23501c8cafe","version":342,"action":"UPDATE"},{"gtasId":"5641795","tamrId":"c738714d-072a-3924-84ed-4c659a69d1e3","version":342,"action":"UPDATE"},{"gtasId":"3501500","tamrId":"37bac6ab-d755-3bd0-8b23-c3657065f1f7","version":342,"action":"UPDATE"},{"gtasId":"20436081","tamrId":"175567f9-ffaa-3297-a361-4f6a3465d013","version":342,"action":"UPDATE"},{"gtasId":"22706350","tamrId":"85603101-1dbc-3fd6-83b5-feafbee37cf3","version":342,"action":"UPDATE"},{"gtasId":"2057129","tamrId":"c75355f1-300a-33c5-a0c6-074e32097c5f","version":342,"action":"UPDATE"},{"gtasId":"19239797","tamrId":"0a5b7519-3584-3b65-bca1-6e0fb288d39e","version":342,"action":"UPDATE"},{"gtasId":"9939424","tamrId":"aec75c67-fad2-3e98-b621-45ff67648ae8","version":342,"action":"UPDATE"},{"gtasId":"11509207","tamrId":"bd126646-42b6-36b9-b1c3-a95887deab89","version":342,"action":"UPDATE"},{"gtasId":"8042563","tamrId":"ffbbd3f3-3a4b-331f-9b4b-354c1ad49022","version":342,"action":"UPDATE"},{"gtasId":"24539338","tamrId":"8f2c2cd0-cb18-38e4-b185-47f6729c00d8","version":342,"action":"UPDATE"},{"gtasId":"4701819","tamrId":"d5859b55-dd86-3e1a-b439-32ad10f0c079","version":342,"action":"UPDATE"},{"gtasId":"2714628","tamrId":"b0c7f540-ad90-368e-94c0-8a5e5416bb3d","version":342,"action":"UPDATE"},{"gtasId":"2953207","tamrId":"63f74422-ba88-395c-9e2c-df201f3860a2","version":342,"action":"UPDATE"},{"gtasId":"21065717","tamrId":"b125f2e5-2f1a-3625-afa3-7353af2272e9","version":342,"action":"UPDATE"},{"gtasId":"22992131","tamrId":"e1b20efe-2f0e-36a5-9e1d-9e03e8cc8350","version":342,"action":"UPDATE"},{"gtasId":"2693245","tamrId":"7c64cd4c-00bf-3c2a-ac13-d4f857496fbc","version":342,"action":"UPDATE"},{"gtasId":"17518028","tamrId":"eee0f6e5-0e3c-3f1f-bcfd-88c42e55f1e3","version":342,"action":"UPDATE"},{"gtasId":"5927076","tamrId":"2e8d3b0c-0a85-3388-b942-c19aac3d59a0","version":342,"action":"UPDATE"},{"gtasId":"20136109","tamrId":"c4d1aca7-3021-36b1-a02c-f7b060d38cb0","version":342,"action":"UPDATE"},{"gtasId":"3649178","tamrId":"42bc3bc0-a11f-364d-9e3f-ba210d0d4a89","version":342,"action":"UPDATE"},{"gtasId":"15499716","tamrId":"0cee10be-7ccc-35cd-965f-8a1dfc672593","version":342,"action":"UPDATE"},{"gtasId":"5396736","tamrId":"0e6a74e1-a427-3645-bef0-445cab4df9a5","version":342,"action":"UPDATE"},{"gtasId":"6338985","tamrId":"396228fb-084f-348d-a2a5-036cbb963251","version":342,"action":"UPDATE"},{"gtasId":"11004911","tamrId":"5c692441-fe18-3b1f-b0bb-a5a0d0b3b0a3","version":342,"action":"UPDATE"},{"gtasId":"16017328","tamrId":"760c5130-18cd-38f3-963d-6a6a1b4a8cdb","version":342,"action":"UPDATE"},{"gtasId":"8824114","tamrId":"083e9368-f310-3684-a26d-59592f28f83b","version":342,"action":"UPDATE"},{"gtasId":"4449376","tamrId":"4ef310d2-2c01-3318-8d17-6e1feb51ac12","version":342,"action":"UPDATE"},{"gtasId":"1416094","tamrId":"1b786388-77a8-3e3b-b572-5748c510e4e2","version":342,"action":"UPDATE"},{"gtasId":"5521063","tamrId":"8438a67f-8611-3be6-9701-c90cd215ab77","version":342,"action":"UPDATE"},{"gtasId":"14822680","tamrId":"c075b29b-5995-352e-a796-7320a20fc63a","version":342,"action":"UPDATE"},{"gtasId":"19660527","tamrId":"8d94e322-3981-3288-ae5e-05e65be27830","version":342,"action":"UPDATE"},{"gtasId":"5793818","tamrId":"ec696804-57b0-39fd-a65e-8ed3c4f20508","version":342,"action":"UPDATE"},{"gtasId":"24683908","tamrId":"de61c461-e7ee-3f62-aa5a-bd56a14a85b3","version":342,"action":"UPDATE"},{"gtasId":"20936378","tamrId":"44cf07b2-c4d3-32cc-a525-c5d67debb377","version":342,"action":"UPDATE"},{"gtasId":"1613295","tamrId":"3800f6b9-da0e-3803-b43f-23d3b9fd9a9e","version":342,"action":"UPDATE"},{"gtasId":"11512844","tamrId":"2004c82b-53e8-3aaa-b40f-9f34a599afb7","version":342,"action":"UPDATE"},{"gtasId":"15899087","tamrId":"40e33b3e-4fee-3d39-9525-501d97666a68","version":342,"action":"UPDATE"},{"gtasId":"24763684","tamrId":"5a12f834-c0e4-3a42-a45c-dd423c036552","version":342,"action":"UPDATE"},{"gtasId":"12046752","tamrId":"4dc3cb21-4077-32b6-8a72-876f0bfb15f4","version":342,"action":"UPDATE"},{"gtasId":"7040386","tamrId":"f9256e05-9ef2-3578-be61-39a6c8526144","version":342,"action":"UPDATE"},{"gtasId":"10593870","tamrId":"a004a53e-2d48-3ec4-8cc3-29dfd2fc5917","version":342,"action":"UPDATE"},{"gtasId":"9155093","tamrId":"856088bb-2e2c-37c3-9401-fb7e5d2497b3","version":342,"action":"UPDATE"},{"gtasId":"24809559","tamrId":"5cec6ef0-8665-3a13-8c46-1b742a294931","version":342,"action":"UPDATE"},{"gtasId":"19796744","tamrId":"b082f319-363f-3160-a257-596ab27d866d","version":342,"action":"UPDATE"},{"gtasId":"7524658","tamrId":"1f1fa162-35bb-3f35-b643-3a882d96b195","version":342,"action":"UPDATE"},{"gtasId":"4340737","tamrId":"67d9e86f-7710-3757-92a7-537e79e48fe1","version":342,"action":"UPDATE"},{"gtasId":"19154060","tamrId":"d2c2d130-0acf-3aa2-99ee-2ecd117d7c3d","version":342,"action":"UPDATE"},{"gtasId":"8673604","tamrId":"b6df7f41-4a14-33a7-a69a-d7c7ada6772d","version":342,"action":"UPDATE"},{"gtasId":"23905316","tamrId":"2090067d-ecd5-30d7-8aad-261f9793e8ee","version":342,"action":"UPDATE"},{"gtasId":"2132954","tamrId":"3757a0c8-162d-30f9-87aa-665f2d17e737","version":342,"action":"UPDATE"},{"gtasId":"1350621","tamrId":"499e8851-9420-37f4-a567-989ede8e4118","version":342,"action":"UPDATE"},{"gtasId":"22740215","tamrId":"3a8dc424-9af9-3e54-ae04-15eda430a46c","version":342,"action":"UPDATE"},{"gtasId":"13637405","tamrId":"1e3fd1de-308c-3cac-bf9c-e985451a0d29","version":342,"action":"UPDATE"},{"gtasId":"24459519","tamrId":"48a3eeb2-24b2-32ca-9f50-e0843e0a4a0c","version":342,"action":"UPDATE"},{"gtasId":"5811383","tamrId":"ddf7d55f-b5af-36c0-9937-5da48412a403","version":342,"action":"UPDATE"},{"gtasId":"12064450","tamrId":"95f7fbd0-4256-3743-abd4-e5832a60e276","version":342,"action":"UPDATE"},{"gtasId":"7757839","tamrId":"78f591cb-a15f-3d19-847b-c331f2c9dca8","version":342,"action":"UPDATE"},{"gtasId":"12790952","tamrId":"259e40c0-dc52-31bb-b63e-60a6ba94aed2","version":342,"action":"UPDATE"},{"gtasId":"21343448","tamrId":"29be2704-0f43-3d3e-afc5-7f6291e865d8","version":342,"action":"UPDATE"},{"gtasId":"8799689","tamrId":"fab40635-85d6-3e03-a15b-bb358fea5baa","version":342,"action":"UPDATE"},{"gtasId":"13866261","tamrId":"bbfc1b5e-8927-3021-970b-d1fd45a245dd","version":342,"action":"UPDATE"},{"gtasId":"16636428","tamrId":"c9eb2fcb-17d7-37ff-b673-f31f6eb905a5","version":342,"action":"UPDATE"},{"gtasId":"7718225","tamrId":"e27b8d65-e1a2-3b14-bc08-b2aad186ca60","version":342,"action":"UPDATE"},{"gtasId":"22468171","tamrId":"379d7fcd-e964-33b4-8b7e-e0cc2246e88a","version":342,"action":"UPDATE"},{"gtasId":"16809180","tamrId":"3ae88960-c7d4-3b73-a22d-222b8b7570bb","version":342,"action":"UPDATE"},{"gtasId":"16239480","tamrId":"718bf2f4-9b06-3a34-9043-1757900984f4","version":342,"action":"UPDATE"},{"gtasId":"8858341","tamrId":"256d777c-1c19-3182-9782-ec47fd580fbb","version":342,"action":"UPDATE"},{"gtasId":"21143144","tamrId":"16bafb33-9bf1-33aa-9cbf-5d71a38e44af","version":342,"action":"UPDATE"},{"gtasId":"2619402","tamrId":"7712db42-fe13-356e-b876-321fb0d5c3fd","version":342,"action":"UPDATE"},{"gtasId":"5442308","tamrId":"fe41a360-a7ca-38e9-847a-fa011af362d5","version":342,"action":"UPDATE"},{"gtasId":"8452986","tamrId":"91ea7829-9787-3736-be75-039426ccdc14","version":342,"action":"UPDATE"},{"gtasId":"2410655","tamrId":"fe297eeb-ea67-39ee-8c92-45fb90013517","version":342,"action":"UPDATE"},{"gtasId":"777592","tamrId":"dbad8c46-0c4c-31c7-bc96-6f197e2cd8b9","version":342,"action":"UPDATE"},{"gtasId":"13102482","tamrId":"d4eaf7b5-2f0d-3e3a-a455-7520c0f16204","version":342,"action":"UPDATE"},{"gtasId":"19318254","tamrId":"b127c8e1-9f78-3bab-9525-f0e133ba0df4","version":342,"action":"UPDATE"},{"gtasId":"21419909","tamrId":"c9e1e908-6895-32c6-a7eb-9bf9b80217cf","version":342,"action":"UPDATE"},{"gtasId":"25229867","tamrId":"cbc9c5c9-11b9-38ca-acfb-7fd3371dbf85","version":342,"action":"UPDATE"},{"gtasId":"22562057","tamrId":"75d392f2-ff9a-31a8-bafe-5f1faea81777","version":342,"action":"UPDATE"},{"gtasId":"2076387","tamrId":"0efa2dfd-8150-30d0-a5f5-4851bffca910","version":342,"action":"UPDATE"},{"gtasId":"12325779","tamrId":"76482a03-7b71-33b5-9275-765b88c97385","version":342,"action":"UPDATE"},{"gtasId":"21704148","tamrId":"7344a5d9-1038-345e-a0dc-04f43c667674","version":342,"action":"UPDATE"},{"gtasId":"9287773","tamrId":"9e690859-f8e4-3989-8357-cd582876ed48","version":342,"action":"UPDATE"},{"gtasId":"16812777","tamrId":"8c024dee-5601-33d3-80a5-c4f4ec8e1c31","version":342,"action":"UPDATE"},{"gtasId":"19273642","tamrId":"63bf3480-806e-3eef-b19f-524ee8bab6ea","version":342,"action":"UPDATE"},{"gtasId":"24354679","tamrId":"56b85f05-3dbe-3ca2-a252-03a3fd47b382","version":342,"action":"UPDATE"},{"gtasId":"21226045","tamrId":"422b32b1-a9e9-3e65-8758-2f4d1e6a5a1f","version":342,"action":"UPDATE"},{"gtasId":"23006486","tamrId":"ad392892-06ea-3ae2-bd58-407b36efe6db","version":342,"action":"UPDATE"},{"gtasId":"16772399","tamrId":"88a5faf0-9631-337e-80be-0777e4a18751","version":342,"action":"UPDATE"},{"gtasId":"19657781","tamrId":"e4047af6-ff50-303b-bf12-f98b7e2af367","version":342,"action":"UPDATE"},{"gtasId":"12685978","tamrId":"9831b7c1-055f-325f-b2e9-ac56cc89d465","version":342,"action":"UPDATE"},{"gtasId":"24950637","tamrId":"a09333d4-5138-32dc-966b-4f85213d9387","version":342,"action":"UPDATE"},{"gtasId":"672208","tamrId":"6eef363f-19c9-3463-a94b-084462de01ff","version":342,"action":"UPDATE"},{"gtasId":"2790424","tamrId":"c0a6f5dd-440e-3ad2-a394-ad69a407ee25","version":342,"action":"UPDATE"},{"gtasId":"14509686","tamrId":"d3ffa1f7-00d4-35c4-9f07-9260d6814df0","version":342,"action":"UPDATE"},{"gtasId":"14254500","tamrId":"8b4a9e04-e913-3179-bb32-664cc681e10d","version":342,"action":"UPDATE"},{"gtasId":"1548535","tamrId":"d9b4bfb2-a06f-3b19-b31d-36ce3b490083","version":342,"action":"UPDATE"},{"gtasId":"7931888","tamrId":"63795599-fc8d-33b0-8202-f767138f2f94","version":342,"action":"UPDATE"},{"gtasId":"444719","tamrId":"6cd1e973-194e-3971-bce2-5b717c772764","version":342,"action":"UPDATE"},{"gtasId":"17566507","tamrId":"2a7ae016-61b1-3c74-aca4-25e568a169a4","version":342,"action":"UPDATE"},{"gtasId":"184765","tamrId":"9fe83c61-5f59-32d3-91a2-437fcc68d316","version":342,"action":"UPDATE"},{"gtasId":"22470473","tamrId":"1c69555c-9563-3ac9-9acf-df9a93d28962","version":342,"action":"UPDATE"},{"gtasId":"22124412","tamrId":"462b006d-6990-33fd-97e0-26598f3b47fc","version":342,"action":"UPDATE"},{"gtasId":"2456839","tamrId":"e0fdfade-37b4-3e38-9b10-a642d6149681","version":342,"action":"UPDATE"},{"gtasId":"6934922","tamrId":"80067de2-5abe-3d58-ae36-13b8845a1ba8","version":342,"action":"UPDATE"},{"gtasId":"15146334","tamrId":"2cdd95fa-7f50-3af3-a142-37fec4c937bd","version":342,"action":"UPDATE"},{"gtasId":"4779626","tamrId":"a6c5576c-2baf-38a6-a71b-f362dd1b28bd","version":342,"action":"UPDATE"},{"gtasId":"3466612","tamrId":"d175d5c0-1de2-311e-85ca-5b035dbbf474","version":342,"action":"UPDATE"},{"gtasId":"1637295","tamrId":"b0875a98-e97e-3876-92c9-22d827450f8b","version":342,"action":"UPDATE"},{"gtasId":"14513700","tamrId":"c9ea334d-9e0a-3162-aa01-c3cf82f53150","version":342,"action":"UPDATE"},{"gtasId":"4768930","tamrId":"787b6032-f9ed-3835-9b4e-866fc3c185ff","version":342,"action":"UPDATE"},{"gtasId":"19444638","tamrId":"cfaaaddd-06da-314d-8886-a260cc55eb2f","version":342,"action":"UPDATE"},{"gtasId":"21572380","tamrId":"9db76f26-b52e-3618-9ef5-f49b19431ca1","version":342,"action":"UPDATE"},{"gtasId":"16152245","tamrId":"1bfb0d9e-5428-3c0c-b32c-74c7b8508bc5","version":342,"action":"UPDATE"},{"gtasId":"8233440","tamrId":"4f90ab5a-04ed-31b4-b5a7-a5e0ccb1292b","version":342,"action":"UPDATE"},{"gtasId":"7952877","tamrId":"01eb2309-3e1a-3185-b28f-cdc9fda30808","version":342,"action":"UPDATE"},{"gtasId":"23821154","tamrId":"acadcde4-0b3b-3f05-b608-3b1fa38fed7d","version":342,"action":"UPDATE"},{"gtasId":"23907936","tamrId":"6449cc71-1bfd-3170-946f-aac72311e796","version":342,"action":"UPDATE"},{"gtasId":"14295991","tamrId":"93b7b45d-b5e6-305a-8fe5-6ca52978687e","version":342,"action":"UPDATE"},{"gtasId":"10202162","tamrId":"0db457f4-a2ea-3282-85aa-c0f8d25ab3c6","version":342,"action":"UPDATE"},{"gtasId":"11268781","tamrId":"b493362c-a49b-3980-8aa0-0fb13f165bf1","version":342,"action":"UPDATE"},{"gtasId":"15346728","tamrId":"17239da5-8873-3798-a52e-d1b113c0bbe5","version":342,"action":"UPDATE"},{"gtasId":"4623068","tamrId":"4dec6464-3e41-3a27-bb6f-4c3702016e3a","version":342,"action":"UPDATE"},{"gtasId":"4271354","tamrId":"b06d4640-d5f8-38a9-8a94-154347cb3663","version":342,"action":"UPDATE"},{"gtasId":"10354332","tamrId":"2b713412-155d-36b6-9584-40b872331bc0","version":342,"action":"UPDATE"},{"gtasId":"2408382","tamrId":"afc0ceaa-7051-301f-a9a3-afd8ad2f0f28","version":342,"action":"UPDATE"},{"gtasId":"15304092","tamrId":"4e3a8cdb-72af-3a04-a9e8-87394ef3158f","version":342,"action":"UPDATE"},{"gtasId":"7666506","tamrId":"73ec5d65-3893-3452-bc80-5a151e90321c","version":342,"action":"UPDATE"},{"gtasId":"17629746","tamrId":"568554f2-a445-3a4a-9b00-6a21d3367148","version":342,"action":"UPDATE"},{"gtasId":"24578878","tamrId":"660485a2-9624-3a83-ba01-aeb571c5df73","version":342,"action":"UPDATE"},{"gtasId":"14911213","tamrId":"48d29364-73f4-3976-a226-9a36cff089b7","version":342,"action":"UPDATE"},{"gtasId":"10984215","tamrId":"e6eedcc8-ceff-3907-abc0-f2c753aa8947","version":342,"action":"UPDATE"},{"gtasId":"6943036","tamrId":"4ed33d7e-65a1-34a8-8fac-6a0637484bf7","version":342,"action":"UPDATE"},{"gtasId":"4636374","tamrId":"787a5302-d140-351f-b15f-c9c893b3fc0d","version":342,"action":"UPDATE"},{"gtasId":"3424046","tamrId":"cfcea29e-8685-3cb9-adcf-0cb37aae0b3a","version":342,"action":"UPDATE"},{"gtasId":"15878180","tamrId":"b6adeb74-81d4-3f7e-bded-63ef588ea50e","version":342,"action":"UPDATE"},{"gtasId":"4764561","tamrId":"49ecd5d5-c271-368e-b1a9-83b2ecbd9526","version":342,"action":"UPDATE"},{"gtasId":"5629123","tamrId":"7bdac5f0-e5f0-34a0-8d89-bbe488bd63fd","version":342,"action":"UPDATE"},{"gtasId":"22580787","tamrId":"218c4f45-8bbc-379f-bcf8-b652b5bec3e3","version":342,"action":"UPDATE"},{"gtasId":"9502768","tamrId":"7f011854-b7ac-330c-9e8b-203b8e841b26","version":342,"action":"UPDATE"},{"gtasId":"17963718","tamrId":"58bc0074-3159-3184-ae2d-99eba9ad68c9","version":342,"action":"UPDATE"},{"gtasId":"1201412","tamrId":"1b1ab524-8150-3c81-9fcb-3036123b5c04","version":342,"action":"UPDATE"},{"gtasId":"2547248","tamrId":"1d0f4c87-e144-32b0-a9f8-fc4f1082dc98","version":342,"action":"UPDATE"},{"gtasId":"15977815","tamrId":"1d09fffb-8feb-30b1-a53e-64ab86306aaf","version":342,"action":"UPDATE"},{"gtasId":"25021633","tamrId":"01599890-5f08-3255-9b71-3fdcd11541aa","version":342,"action":"UPDATE"},{"gtasId":"4272675","tamrId":"ee939619-38f5-32dc-8b98-103d9dc81599","version":342,"action":"UPDATE"},{"gtasId":"2277946","tamrId":"8b1c6b75-29fd-3889-8017-7aea52286fda","version":342,"action":"UPDATE"},{"gtasId":"11924943","tamrId":"6038a78d-bab8-3db4-9bb0-e6c455232bdd","version":342,"action":"UPDATE"},{"gtasId":"16680699","tamrId":"de9b82e0-c8df-3959-b88e-3f9400e7e98f","version":342,"action":"UPDATE"},{"gtasId":"1808524","tamrId":"7cdbcd25-b4e2-37be-bef3-6b374dbdb3a1","version":342,"action":"UPDATE"},{"gtasId":"5342163","tamrId":"023c192f-22c8-3b44-841d-9c693673f7e3","version":342,"action":"UPDATE"},{"gtasId":"9508064","tamrId":"135f1682-ff6c-3145-a4f1-72d6e7d4d593","version":342,"action":"UPDATE"},{"gtasId":"2492552","tamrId":"6213d648-cef3-38ac-aabd-7a1c94650c45","version":342,"action":"UPDATE"},{"gtasId":"20086163","tamrId":"bc4a9247-f122-3ad6-97a9-2977c6c10b39","version":342,"action":"UPDATE"},{"gtasId":"2419065","tamrId":"d672c0d2-633c-3827-a6a7-2ce505a27c32","version":342,"action":"UPDATE"},{"gtasId":"15812363","tamrId":"c0767e64-df80-3150-a20f-687a4bd77b53","version":342,"action":"UPDATE"},{"gtasId":"17787384","tamrId":"ac181324-793d-3e64-b7d3-c7b949fcf99a","version":342,"action":"UPDATE"},{"gtasId":"22041751","tamrId":"91856b46-612c-3b6e-85ea-a2702fc38761","version":342,"action":"UPDATE"},{"gtasId":"17304010","tamrId":"75a54a51-0ec1-3f10-85ca-693a1fdcd4e1","version":342,"action":"UPDATE"},{"gtasId":"3920898","tamrId":"0145bcd3-ce25-3562-8e29-ae1b58d6c139","version":342,"action":"UPDATE"},{"gtasId":"6747163","tamrId":"db1dd9b3-9fff-34e2-a099-c2b47f69670a","version":342,"action":"UPDATE"},{"gtasId":"9813502","tamrId":"8c090b12-188c-3781-9a8e-8de77868ca4e","version":342,"action":"UPDATE"},{"gtasId":"13126333","tamrId":"c42c8226-0ce0-3c3e-aa9d-66b9af6563a4","version":342,"action":"UPDATE"},{"gtasId":"22886169","tamrId":"014d9972-5f90-3392-98a8-cb5a3cefc35b","version":342,"action":"UPDATE"},{"gtasId":"17535448","tamrId":"957ac96c-419f-345b-9d3d-79d0f8a37f55","version":342,"action":"UPDATE"},{"gtasId":"11932525","tamrId":"af8bf1fc-73e4-3e83-8432-9c6dd1d7031a","version":342,"action":"UPDATE"},{"gtasId":"14145984","tamrId":"5e97f00d-8838-312b-946f-8abc2989cbe9","version":342,"action":"UPDATE"},{"gtasId":"4969251","tamrId":"2ecb17f3-662f-3d1d-be03-f845fb43acaf","version":342,"action":"UPDATE"},{"gtasId":"1231293","tamrId":"6c84f9da-511d-3327-a96c-d093efb31ffc","version":342,"action":"UPDATE"},{"gtasId":"17639100","tamrId":"d3ea6820-0118-3d54-a60e-19799f4c918e","version":342,"action":"UPDATE"},{"gtasId":"15837655","tamrId":"8e057050-8e69-360f-8d2b-7ee39d863383","version":342,"action":"UPDATE"},{"gtasId":"16551090","tamrId":"5e64e8f2-4f94-31b0-8469-19927863474c","version":342,"action":"UPDATE"},{"gtasId":"25045644","tamrId":"abecd086-6081-3010-b8cb-0f12490f8311","version":342,"action":"UPDATE"},{"gtasId":"4498297","tamrId":"03ba521b-03bb-3dbb-b9c8-9f2ba66f9b73","version":342,"action":"UPDATE"},{"gtasId":"3368348","tamrId":"fe5b3107-fafe-35b0-8e68-059078fc2ce5","version":342,"action":"UPDATE"},{"gtasId":"12924109","tamrId":"472f7736-7177-35e5-b481-c95702a2dc66","version":342,"action":"UPDATE"},{"gtasId":"23938596","tamrId":"91b50dbc-722b-3ce8-9962-065226f3b35d","version":342,"action":"UPDATE"},{"gtasId":"3517022","tamrId":"edf779bd-cf27-36e5-93bd-10064fed989e","version":342,"action":"UPDATE"},{"gtasId":"7450701","tamrId":"4a9416e2-9be4-3e59-b925-67e068ce2d19","version":342,"action":"UPDATE"},{"gtasId":"21860353","tamrId":"ece5d5ac-d41f-3862-86cb-aaf4dd705ee8","version":342,"action":"UPDATE"},{"gtasId":"16976182","tamrId":"70ed498b-07f9-3da1-a7b7-1570915ab3da","version":342,"action":"UPDATE"},{"gtasId":"23943938","tamrId":"25316f78-0a6c-3b36-8665-ee5cbb83afe7","version":342,"action":"UPDATE"},{"gtasId":"1006411","tamrId":"fa0e36fc-e60b-3f64-b26a-d45da3ea392b","version":342,"action":"UPDATE"},{"gtasId":"10389876","tamrId":"39385e00-5977-37f4-844b-68a17cd0baed","version":342,"action":"UPDATE"},{"gtasId":"7949236","tamrId":"0012fdcd-b009-39af-a88c-5b0f09862b3c","version":342,"action":"UPDATE"},{"gtasId":"16702462","tamrId":"9cdb632a-d5e8-3d5e-b48d-29878baa13ea","version":342,"action":"UPDATE"},{"gtasId":"4698515","tamrId":"3652020e-1148-3042-9d64-63ba7c3b28c9","version":342,"action":"UPDATE"},{"gtasId":"11578646","tamrId":"51e10355-2a2d-3d2c-b521-63c1042cffbe","version":342,"action":"UPDATE"},{"gtasId":"5529845","tamrId":"339a9841-3a07-38c0-9ef3-5af9a51e31bc","version":342,"action":"UPDATE"},{"gtasId":"10736606","tamrId":"57a2342c-eda6-37c5-95a2-4649a8175301","version":342,"action":"UPDATE"},{"gtasId":"8426687","tamrId":"5160086d-c654-3727-b1e0-d607490c08da","version":342,"action":"UPDATE"},{"gtasId":"7671051","tamrId":"72fb907d-fcaa-37e9-9713-398cfc8b1890","version":342,"action":"UPDATE"},{"gtasId":"11115240","tamrId":"05cefcb9-b774-3a24-b9ac-2faf3b26435f","version":342,"action":"UPDATE"},{"gtasId":"3857919","tamrId":"140048d2-9a7d-3332-938b-2cf35a31e7b7","version":342,"action":"UPDATE"},{"gtasId":"3270405","tamrId":"4f607213-8b6f-3a53-8d7e-a00f9810e6cc","version":342,"action":"UPDATE"},{"gtasId":"21265595","tamrId":"18cb3be0-36a7-3988-b3b1-1c3eb5c2ba47","version":342,"action":"UPDATE"},{"gtasId":"2604311","tamrId":"d4d95b94-3cab-3226-a073-cd98164b4fc1","version":342,"action":"UPDATE"},{"gtasId":"6582413","tamrId":"23ff9abf-cb46-3f0a-9aea-248d790df986","version":342,"action":"UPDATE"},{"gtasId":"3899712","tamrId":"26f7be8b-876b-39cf-b4dc-30c925e47f26","version":342,"action":"UPDATE"},{"gtasId":"3027736","tamrId":"641af2d8-514a-37a2-af6a-1f596eca6f45","version":342,"action":"UPDATE"},{"gtasId":"18142428","tamrId":"1fcc2c98-6d9a-347f-a016-16afcb42fb6e","version":342,"action":"UPDATE"},{"gtasId":"18698374","tamrId":"3648ca4e-80f8-3154-b272-442d33201f54","version":342,"action":"UPDATE"},{"gtasId":"15424215","tamrId":"a2990862-099e-3e02-84d8-986d5bcfc705","version":342,"action":"UPDATE"},{"gtasId":"12522185","tamrId":"2a59344d-a8e4-34ff-97ca-9ecbdc6e2573","version":342,"action":"UPDATE"},{"gtasId":"12121588","tamrId":"957ac96c-419f-345b-9d3d-79d0f8a37f55","version":342,"action":"UPDATE"},{"gtasId":"14948543","tamrId":"c592b1dc-1093-3b36-8b23-576e65b22765","version":342,"action":"UPDATE"},{"gtasId":"5233919","tamrId":"fd12306f-f6ac-32b1-94cb-df974aac76ac","version":342,"action":"UPDATE"},{"gtasId":"8609178","tamrId":"aa9a0e99-b60d-33c6-a072-b6310a45c329","version":342,"action":"UPDATE"},{"gtasId":"23987535","tamrId":"4afa98ee-3f5a-3c59-928f-3921e00103df","version":342,"action":"UPDATE"},{"gtasId":"4994250","tamrId":"e100b062-0f41-3aee-b738-f4ec2c351e36","version":342,"action":"UPDATE"},{"gtasId":"11957887","tamrId":"d7b3f363-5cfb-3c49-9070-25ae3f745455","version":342,"action":"UPDATE"},{"gtasId":"894282","tamrId":"8673c099-c27f-322d-9026-32ff89a75d53","version":342,"action":"UPDATE"},{"gtasId":"1459173","tamrId":"99a92383-e396-3c86-a8ae-cbef3730bcbb","version":342,"action":"UPDATE"},{"gtasId":"6429248","tamrId":"4de5bc1d-25a1-3b26-9612-aad0ddda21e2","version":342,"action":"UPDATE"},{"gtasId":"14695206","tamrId":"1252a5ce-b710-3bb4-9ea8-8e496e115d2b","version":342,"action":"UPDATE"},{"gtasId":"17958339","tamrId":"f98185e5-1a51-3b09-afa1-4b3bb2fa3d11","version":342,"action":"UPDATE"},{"gtasId":"2421332","tamrId":"d5c93364-1a4d-3a65-bbe3-c5e1534d40ef","version":342,"action":"UPDATE"},{"gtasId":"289210","tamrId":"dd2c1279-7b54-3ea2-b60d-2ea2ce0e0fc8","version":342,"action":"UPDATE"},{"gtasId":"17720203","tamrId":"560fb2b7-2372-3a7b-bd24-641669078fdf","version":342,"action":"UPDATE"},{"gtasId":"14947226","tamrId":"8781c2a7-e9df-30d4-8227-23707605f3d1","version":342,"action":"UPDATE"},{"gtasId":"9830042","tamrId":"66b42d32-7d1b-3178-82d7-b3dd92b4635d","version":342,"action":"UPDATE"},{"gtasId":"2518739","tamrId":"478721b3-8672-3280-91e3-762d52acdb59","version":342,"action":"UPDATE"},{"gtasId":"14008832","tamrId":"0fef6870-e72a-357e-962b-70d11ba0b11d","version":342,"action":"UPDATE"},{"gtasId":"17135260","tamrId":"e2a9fd1b-b0ac-3e89-a455-45e2086c6b22","version":342,"action":"UPDATE"},{"gtasId":"16580401","tamrId":"4b51032e-ca43-3104-bcb4-070dc098d3b5","version":342,"action":"UPDATE"},{"gtasId":"14429000","tamrId":"0d4fe2c6-0eae-30e4-b49a-20c49fbc54f1","version":342,"action":"UPDATE"},{"gtasId":"16122408","tamrId":"3b98a6d9-240a-3f00-9dde-0471709a872a","version":342,"action":"UPDATE"},{"gtasId":"257657","tamrId":"728614d9-aac9-3a42-8605-038bc0a5ec8b","version":342,"action":"UPDATE"},{"gtasId":"258989","tamrId":"b696ae8f-a0a4-3de9-8cc8-1a7fed7dc336","version":342,"action":"UPDATE"},{"gtasId":"15492321","tamrId":"b7bdb934-f676-3b69-bc7e-8c35ec8414bd","version":342,"action":"UPDATE"},{"gtasId":"15997461","tamrId":"76655e46-e3f6-3726-a32b-d0ee85504885","version":342,"action":"UPDATE"},{"gtasId":"17973944","tamrId":"249bb999-8ada-3f34-90d2-8e02293a882f","version":342,"action":"UPDATE"},{"gtasId":"6978551","tamrId":"2f3196b2-8df0-3136-a724-4aae681f5776","version":342,"action":"UPDATE"},{"gtasId":"11234552","tamrId":"72f0dff4-39c0-3337-b045-ab7fdc38a813","version":342,"action":"UPDATE"},{"gtasId":"3405782","tamrId":"63a8bb44-ea24-3c99-b039-884ba87885d0","version":342,"action":"UPDATE"},{"gtasId":"13828778","tamrId":"c88bedb7-b2f3-3038-a848-d38770d1c19e","version":342,"action":"UPDATE"},{"gtasId":"3599796","tamrId":"de4b9ded-c5d3-30de-92bd-6b39fb016e92","version":342,"action":"UPDATE"},{"gtasId":"2598815","tamrId":"616808fc-a745-3295-82f2-4ddcadef2f19","version":342,"action":"UPDATE"},{"gtasId":"6345198","tamrId":"f0998f03-d9e1-38b7-9a91-3d6e01e04f05","version":342,"action":"UPDATE"},{"gtasId":"1325633","tamrId":"d56d7e0c-f77a-3292-8fdd-e0af39b5f2fd","version":342,"action":"UPDATE"},{"gtasId":"13608873","tamrId":"73fe0b53-d828-3ae4-8f44-1944b552b230","version":342,"action":"UPDATE"},{"gtasId":"921484","tamrId":"9bfe2eb3-63f2-39fa-8e37-c613fb518887","version":342,"action":"UPDATE"},{"gtasId":"4318878","tamrId":"d5c4d864-b1bc-36df-ac0a-0873889b1dbb","version":342,"action":"UPDATE"},{"gtasId":"10000938","tamrId":"dee59373-5719-31ed-9cd0-cbeacea4dc12","version":342,"action":"UPDATE"},{"gtasId":"21305288","tamrId":"043a4b46-1c9d-3471-8002-99b5c1446349","version":342,"action":"UPDATE"},{"gtasId":"11533729","tamrId":"804f19b0-77da-3d63-9d78-d290203b9a88","version":342,"action":"UPDATE"},{"gtasId":"7282495","tamrId":"01d92c6b-5f29-358a-835b-766141e679e6","version":342,"action":"UPDATE"},{"gtasId":"1618944","tamrId":"79b340aa-70e8-3dd7-b4f6-e5f206602a6e","version":342,"action":"UPDATE"},{"gtasId":"14495394","tamrId":"2cb05c34-c1b2-3d36-a9e4-b9cb50c31f6c","version":342,"action":"UPDATE"},{"gtasId":"7285515","tamrId":"9627d89d-6aa3-3efe-a334-ae43a68f3750","version":342,"action":"UPDATE"},{"gtasId":"12663683","tamrId":"798a8961-b9b7-3737-b67d-8e05eb30dd58","version":342,"action":"UPDATE"},{"gtasId":"15384162","tamrId":"12f59be2-48c9-3d5a-a72a-57b9c7591da3","version":342,"action":"UPDATE"},{"gtasId":"9346934","tamrId":"25f26ef8-f08a-31f2-8c5e-cb69b762b3cb","version":342,"action":"UPDATE"},{"gtasId":"2425712","tamrId":"c37819d1-58bc-337c-ba6d-79c4747f1c48","version":342,"action":"UPDATE"},{"gtasId":"1045188","tamrId":"382c4d71-3f13-3e15-8c58-1900ee01863c","version":342,"action":"UPDATE"},{"gtasId":"20993859","tamrId":"6cc7be9d-f464-3992-80f6-4dd943bed62e","version":342,"action":"UPDATE"},{"gtasId":"15697412","tamrId":"f328a54f-6342-3176-bd8e-00d828acf450","version":342,"action":"UPDATE"},{"gtasId":"7153754","tamrId":"dea36d84-1116-3d63-89ce-bf36e3af9464","version":342,"action":"UPDATE"},{"gtasId":"17381076","tamrId":"83cb958d-abb5-3116-825b-bf4a7addc5b7","version":342,"action":"UPDATE"},{"gtasId":"6156814","tamrId":"3a39a6d3-ea3c-391e-9560-6a69b1460563","version":342,"action":"UPDATE"},{"gtasId":"6873592","tamrId":"49fcb1c1-a107-3523-b1f7-b16201d9e517","version":342,"action":"UPDATE"},{"gtasId":"6658986","tamrId":"2fea73dd-8546-311a-a7d4-fd5adaa7725e","version":342,"action":"UPDATE"},{"gtasId":"2634977","tamrId":"1024104b-6389-3865-ad31-ccc822e61262","version":342,"action":"UPDATE"},{"gtasId":"3220199","tamrId":"7909e240-9188-3b5c-b740-bfa2cc56d73f","version":342,"action":"UPDATE"},{"gtasId":"5255243","tamrId":"bf3769cb-45e5-3721-b27e-8014130d4105","version":342,"action":"UPDATE"},{"gtasId":"18467708","tamrId":"1722bda4-8abe-3ab9-8ea6-1e466f51fa1f","version":342,"action":"UPDATE"},{"gtasId":"2362104","tamrId":"a20c056d-3bee-37ff-9028-43817854e659","version":342,"action":"UPDATE"},{"gtasId":"16277667","tamrId":"b5d1d843-410a-3aef-8152-75634e983b41","version":342,"action":"UPDATE"},{"gtasId":"11550225","tamrId":"e6e34f57-5cd8-314c-a1d1-5c62746b1389","version":342,"action":"UPDATE"},{"gtasId":"644989","tamrId":"bc865cc8-46ef-322d-aab0-25d32438a4e7","version":342,"action":"UPDATE"},{"gtasId":"8107019","tamrId":"6fb814a4-fe27-35cb-bc33-90e263d49aff","version":342,"action":"UPDATE"},{"gtasId":"5192940","tamrId":"eb87924b-c5bf-375c-93dc-9905ad0aeab2","version":342,"action":"UPDATE"},{"gtasId":"16503033","tamrId":"d7e5f39e-9de2-3ae6-b3ff-07fad518407a","version":342,"action":"UPDATE"},{"gtasId":"2375422","tamrId":"d6493c3c-38d6-3509-ae80-78f89a397eda","version":342,"action":"UPDATE"},{"gtasId":"8960864","tamrId":"39f16198-4588-374e-b5fa-a94d2fafab7a","version":342,"action":"UPDATE"},{"gtasId":"23854902","tamrId":"2f7a9545-4071-3040-947f-4ad955adeb28","version":342,"action":"UPDATE"},{"gtasId":"5165320","tamrId":"d8011385-079f-3857-a556-a4dade64f39a","version":342,"action":"UPDATE"},{"gtasId":"7530436","tamrId":"7353d2c2-7f94-3aa7-b268-d81818a7ff46","version":342,"action":"UPDATE"},{"gtasId":"13970855","tamrId":"87d35352-0367-3746-a821-4ffc223213b5","version":342,"action":"UPDATE"},{"gtasId":"5388321","tamrId":"8e60841e-4671-364c-ac6b-eeef9bb67c30","version":342,"action":"UPDATE"},{"gtasId":"10983756","tamrId":"974fa897-fc95-372e-85b8-879b81faaa5c","version":342,"action":"UPDATE"},{"gtasId":"16163788","tamrId":"9143a76c-edf5-3eb1-a519-fb3a1347be10","version":342,"action":"UPDATE"},{"gtasId":"4321651","tamrId":"73ef24f9-42c9-372e-818d-fb1b5c6fbfd5","version":342,"action":"UPDATE"},{"gtasId":"775888","tamrId":"52ae7bc5-4264-3432-8fcb-2803af5b28ed","version":342,"action":"UPDATE"},{"gtasId":"4439900","tamrId":"103b325c-f0ae-3deb-b20b-75a198d7bfa2","version":342,"action":"UPDATE"},{"gtasId":"3594052","tamrId":"e541a492-0483-3a5a-8cf1-157b85383441","version":342,"action":"UPDATE"},{"gtasId":"19899090","tamrId":"2281b380-1536-3a3f-b57a-a9e87033c114","version":342,"action":"UPDATE"},{"gtasId":"8805075","tamrId":"19833fda-4ad1-3302-9e2e-64cc773b07e0","version":342,"action":"UPDATE"},{"gtasId":"24709338","tamrId":"d878bc68-2ef0-3b08-80dd-ebe42adf7213","version":342,"action":"UPDATE"},{"gtasId":"14004431","tamrId":"9d8d888f-fb9d-3384-a86a-e4ddd71ae8b7","version":342,"action":"UPDATE"},{"gtasId":"7028602","tamrId":"94f6e22f-e1c6-3802-9394-f504d21d8098","version":342,"action":"UPDATE"},{"gtasId":"5897578","tamrId":"71208781-a45a-333e-a38c-d63b5ef65255","version":342,"action":"UPDATE"},{"gtasId":"9877533","tamrId":"c28d1195-bb3c-381b-8703-9c888a970f5a","version":342,"action":"UPDATE"},{"gtasId":"10051611","tamrId":"31cc1a5c-6110-3566-b40a-f42eccb3eb4d","version":342,"action":"UPDATE"},{"gtasId":"16885759","tamrId":"bc9bb4b3-7563-30c7-9267-8465f5088258","version":342,"action":"UPDATE"},{"gtasId":"18019057","tamrId":"720934b4-b9d9-3ab4-b215-56634e2eec15","version":342,"action":"UPDATE"},{"gtasId":"11839083","tamrId":"b845eddd-b48f-3e8d-975f-d47ba69d8007","version":342,"action":"UPDATE"},{"gtasId":"17518943","tamrId":"be457fc4-9783-38c7-abb0-9717c3230724","version":342,"action":"UPDATE"},{"gtasId":"2869981","tamrId":"ee5d52e5-53d8-3fcd-b552-9d5e2f90a75f","version":342,"action":"UPDATE"},{"gtasId":"9626057","tamrId":"fe048cef-ef5d-3926-8759-44722916faa6","version":342,"action":"UPDATE"},{"gtasId":"401548","tamrId":"d61075db-bd70-3250-aa7d-0f7c3cf8a498","version":342,"action":"UPDATE"},{"gtasId":"7692847","tamrId":"a0ffe7c4-3eea-39c9-b73c-367c12e330d6","version":342,"action":"UPDATE"},{"gtasId":"3268118","tamrId":"6330e883-dffd-3afa-a4fe-5bd14ac887fc","version":342,"action":"UPDATE"},{"gtasId":"16036400","tamrId":"b821dbd3-640f-3bd1-a8b5-b1f09fcbec72","version":342,"action":"UPDATE"},{"gtasId":"24026512","tamrId":"be48ef69-7086-3eba-90d5-cdb9e608e634","version":342,"action":"UPDATE"},{"gtasId":"22421467","tamrId":"187effd4-9f8d-3763-b818-daf198193e4c","version":342,"action":"UPDATE"},{"gtasId":"8665253","tamrId":"681b593b-f31b-3052-8e3e-6cdfdbb8f967","version":342,"action":"UPDATE"},{"gtasId":"3831316","tamrId":"5c95ab7c-f16a-38c1-8f2b-7a4fd05ee980","version":342,"action":"UPDATE"},{"gtasId":"17852834","tamrId":"c7ed5328-1cc6-3cf6-b7ce-41bc502d4ea3","version":342,"action":"UPDATE"},{"gtasId":"24899825","tamrId":"180e7d96-a7cf-38e2-b7d1-8a3227f39d8a","version":342,"action":"UPDATE"},{"gtasId":"24470818","tamrId":"598fb7dd-9897-3fea-8743-bb3a9d0383e3","version":342,"action":"UPDATE"},{"gtasId":"21412544","tamrId":"c1b5cb36-5d95-3628-8310-d2a5b034d986","version":342,"action":"UPDATE"},{"gtasId":"22847387","tamrId":"e21d17a7-db80-32bb-b428-68ca8064b9f2","version":342,"action":"UPDATE"},{"gtasId":"9595328","tamrId":"7bdac5f0-e5f0-34a0-8d89-bbe488bd63fd","version":342,"action":"UPDATE"},{"gtasId":"5687062","tamrId":"669edfe5-04c4-3749-8b43-022a951d2f50","version":342,"action":"UPDATE"},{"gtasId":"16813282","tamrId":"30d9af74-677a-3b2f-a123-84de56abb5d4","version":342,"action":"UPDATE"},{"gtasId":"6504162","tamrId":"1195a944-574c-316c-865b-8ca21e86967a","version":342,"action":"UPDATE"},{"gtasId":"25032344","tamrId":"46d0082a-62ac-37e6-abd5-5fc5d19556cd","version":342,"action":"UPDATE"},{"gtasId":"5972810","tamrId":"fc9d9751-08af-3572-a36d-82b0d2edbd6c","version":342,"action":"UPDATE"},{"gtasId":"16989409","tamrId":"b87410c3-5636-368f-a85a-22227d96362d","version":342,"action":"UPDATE"},{"gtasId":"12844405","tamrId":"fc9d9751-08af-3572-a36d-82b0d2edbd6c","version":342,"action":"UPDATE"},{"gtasId":"21024382","tamrId":"a3a8601a-9d48-31f4-9558-a615fe11fe1f","version":342,"action":"UPDATE"},{"gtasId":"24011434","tamrId":"878aba48-4150-3164-bb8c-96cf2aa3ce62","version":342,"action":"UPDATE"},{"gtasId":"21104486","tamrId":"42a510bc-f52c-3af0-84a9-4c9be4879f51","version":342,"action":"UPDATE"},{"gtasId":"16013773","tamrId":"5b93b40d-617c-31c4-92d1-e816a1502004","version":342,"action":"UPDATE"},{"gtasId":"4247674","tamrId":"7bdac5f0-e5f0-34a0-8d89-bbe488bd63fd","version":342,"action":"UPDATE"},{"gtasId":"16499312","tamrId":"620f65dd-29f4-3168-b9c6-900552e210ff","version":342,"action":"UPDATE"},{"gtasId":"13960605","tamrId":"7038ba72-adb2-3bb1-9da3-ba70c053e447","version":342,"action":"UPDATE"},{"gtasId":"24817983","tamrId":"85654b9b-8229-334c-819a-348c6e1cb054","version":342,"action":"UPDATE"},{"gtasId":"16923656","tamrId":"3798bab2-e7a0-3187-a260-99e3028c80b2","version":342,"action":"UPDATE"},{"gtasId":"12424623","tamrId":"fa63aab2-cbd7-335a-bf3a-28766f6ddb24","version":342,"action":"UPDATE"},{"gtasId":"5569061","tamrId":"4e5a506c-30a0-3836-9765-663437f89edc","version":342,"action":"UPDATE"},{"gtasId":"14060559","tamrId":"0e9278e3-f60d-369d-ab66-be827f31ddc0","version":342,"action":"UPDATE"},{"gtasId":"8900368","tamrId":"f26a3568-aeb2-368b-91e7-d0b2a53ad765","version":342,"action":"UPDATE"},{"gtasId":"11898236","tamrId":"c3d8ab11-db3f-36a7-9f71-55e9657e477b","version":342,"action":"UPDATE"},{"gtasId":"6851371","tamrId":"1c856809-b947-3b6c-9130-809147e434c1","version":342,"action":"UPDATE"},{"gtasId":"1039376","tamrId":"3c2094ea-a82d-3b38-b136-838cf09421bb","version":342,"action":"UPDATE"},{"gtasId":"20222488","tamrId":"4e94c21b-fcdd-339c-8e28-712b51ae7e2b","version":342,"action":"UPDATE"},{"gtasId":"4132464","tamrId":"c69d3247-028f-351f-9148-81640cf02164","version":342,"action":"UPDATE"},{"gtasId":"19130882","tamrId":"f21bf8ec-c045-366c-9085-062263575af4","version":342,"action":"UPDATE"},{"gtasId":"7896257","tamrId":"a68b553c-8329-3130-aeb2-551af70f729d","version":342,"action":"UPDATE"},{"gtasId":"12347186","tamrId":"a5aa1dd6-f80f-3869-910e-5bffc9f3843f","version":342,"action":"UPDATE"},{"gtasId":"24013203","tamrId":"ba725bab-c896-33c5-8bb5-3ed83bde100e","version":342,"action":"UPDATE"},{"gtasId":"20595403","tamrId":"22c40075-e6f5-3bb8-a7c5-a3c731235a08","version":342,"action":"UPDATE"},{"gtasId":"9048660","tamrId":"bae4fcc4-e8c7-3ca3-9abf-d889cfad3795","version":342,"action":"UPDATE"},{"gtasId":"25187615","tamrId":"35d92629-f46e-3076-b6d5-06c90b7a4094","version":342,"action":"UPDATE"},{"gtasId":"4284634","tamrId":"b5bfafc3-670d-30db-886d-ea27b4aa2b67","version":342,"action":"UPDATE"},{"gtasId":"478046","tamrId":"52312324-ad52-38d5-9f9e-b05aa0b18a92","version":342,"action":"UPDATE"},{"gtasId":"13339117","tamrId":"2c3dce06-ef1e-35cf-833a-5db027d38d86","version":342,"action":"UPDATE"},{"gtasId":"21561611","tamrId":"b82a677f-ee65-3043-91e6-07f9788d6e12","version":342,"action":"UPDATE"},{"gtasId":"10038676","tamrId":"1debd66c-4712-3825-b2a9-b5837e52ae46","version":342,"action":"UPDATE"},{"gtasId":"11747385","tamrId":"4ab00f18-7c44-3d3a-9817-bfa99fdffff2","version":342,"action":"UPDATE"},{"gtasId":"22976038","tamrId":"503079fe-0030-39e1-97fd-1fe1d1d4a7b1","version":342,"action":"UPDATE"},{"gtasId":"3273529","tamrId":"74ce9c60-7001-35cc-bcc5-801210195ee5","version":342,"action":"UPDATE"},{"gtasId":"22066189","tamrId":"ab966548-7c05-3a2c-9951-8ba6ff0910b3","version":342,"action":"UPDATE"},{"gtasId":"14742097","tamrId":"a9013545-9b6a-3357-b0a2-c43572dd92f0","version":342,"action":"UPDATE"},{"gtasId":"6849053","tamrId":"55bfcc77-6162-3561-baaf-a10995b55e52","version":342,"action":"UPDATE"},{"gtasId":"13401552","tamrId":"406a3d13-2e56-30c6-8e48-c10f86741448","version":342,"action":"UPDATE"},{"gtasId":"24933311","tamrId":"5650bae6-bae9-3cfd-a51f-d99b4c5a792a","version":342,"action":"UPDATE"},{"gtasId":"17649393","tamrId":"a47adbf5-13da-33d3-adfd-a3a902264deb","version":342,"action":"UPDATE"},{"gtasId":"9844608","tamrId":"295e3fa4-10ee-32e9-b872-059eed923e81","version":342,"action":"UPDATE"},{"gtasId":"19324003","tamrId":"4c9bd188-c13c-359a-ae78-8130703b8b63","version":342,"action":"UPDATE"},{"gtasId":"3614503","tamrId":"3002afbc-5005-3925-a437-a75caf5064c8","version":342,"action":"UPDATE"},{"gtasId":"9133707","tamrId":"90e352c8-db4d-3e11-8dd1-760df8258184","version":342,"action":"UPDATE"},{"gtasId":"6459965","tamrId":"daa3f384-eadf-3af8-9cc7-0a722b8f1778","version":342,"action":"UPDATE"},{"gtasId":"3692884","tamrId":"a757680a-efab-379f-8bb6-6ecf2c174aae","version":342,"action":"UPDATE"},{"gtasId":"7738658","tamrId":"504da03c-69ef-3893-a0ab-4ba4b7fb8b6e","version":342,"action":"UPDATE"},{"gtasId":"20735222","tamrId":"f06a1261-0875-30c3-a27b-3845efbbd501","version":342,"action":"UPDATE"},{"gtasId":"3375455","tamrId":"077ed394-33af-332e-80d3-71bdb903f51d","version":342,"action":"UPDATE"},{"gtasId":"6420063","tamrId":"80f177c1-cede-3506-8658-2b5b8e8c7c5e","version":342,"action":"UPDATE"},{"gtasId":"15361454","tamrId":"35d051d6-f2f7-3ccc-bdb5-a67f601aff04","version":342,"action":"UPDATE"},{"gtasId":"13107219","tamrId":"161c180b-b995-34e9-9c7a-2a0833db9dae","version":342,"action":"UPDATE"},{"gtasId":"8844602","tamrId":"56abf1cd-3657-3d58-8bcf-66beb8d4b022","version":342,"action":"UPDATE"},{"gtasId":"22184125","tamrId":"8511c939-9fb2-3b0d-b1a8-d7b36fa6f6fe","version":342,"action":"UPDATE"},{"gtasId":"434481","tamrId":"cc27c9aa-819b-3c12-aae5-47d415d8b1a4","version":342,"action":"UPDATE"},{"gtasId":"19198851","tamrId":"9e5f0df0-69fb-336a-9b79-fe016b2c9b6b","version":342,"action":"UPDATE"},{"gtasId":"6577924","tamrId":"1e09c091-7421-39e1-b277-a41286dd12ad","version":342,"action":"UPDATE"},{"gtasId":"1435132","tamrId":"47756a74-4292-3bc7-94f4-b0328deed480","version":342,"action":"UPDATE"},{"gtasId":"14105040","tamrId":"b7087b06-daf2-3dbd-8203-083ffc1af94c","version":342,"action":"UPDATE"},{"gtasId":"14248734","tamrId":"7c0557ba-cc53-3c1e-bef6-5aa44b941756","version":342,"action":"UPDATE"},{"gtasId":"3038471","tamrId":"10f78186-0ea5-35e5-97c7-9d06d53c1401","version":342,"action":"UPDATE"},{"gtasId":"6841115","tamrId":"f025e0c9-876c-35f5-a4ee-28bf8afdc241","version":342,"action":"UPDATE"},{"gtasId":"9987057","tamrId":"3de6a726-f819-3d6b-93b3-30240579cce5","version":342,"action":"UPDATE"},{"gtasId":"3425305","tamrId":"7d3cd8f1-2527-3f52-b09e-c45c9a83ea3f","version":342,"action":"UPDATE"},{"gtasId":"20359037","tamrId":"0ba5059c-d196-38d0-b1f5-bb4f2ce1a5ef","version":342,"action":"UPDATE"},{"gtasId":"21716941","tamrId":"286160e1-5186-3e32-9128-0834cc6f7c9b","version":342,"action":"UPDATE"},{"gtasId":"15174456","tamrId":"d53711ad-61aa-38af-8db1-f4bac5d912b4","version":342,"action":"UPDATE"},{"gtasId":"13164689","tamrId":"d317d220-3f2d-3833-aba1-973255281c19","version":342,"action":"UPDATE"},{"gtasId":"15085819","tamrId":"ad55b577-7ae8-3fda-b632-6d2972991b96","version":342,"action":"UPDATE"},{"gtasId":"1094158","tamrId":"9813e226-5ef6-3ef7-b01a-4c769402e97d","version":342,"action":"UPDATE"},{"gtasId":"6934129","tamrId":"d14fb4b8-d5a7-34ca-b43b-31e4fc9e36f7","version":342,"action":"UPDATE"},{"gtasId":"25196539","tamrId":"0cdef901-0a07-3095-b9bb-bb2956e23c08","version":342,"action":"UPDATE"},{"gtasId":"18349313","tamrId":"e49ca75f-2ab4-3972-a0d2-31d01ddde29f","version":342,"action":"UPDATE"},{"gtasId":"21072854","tamrId":"2c4fc898-1a69-311b-b4f7-c57aed324e75","version":342,"action":"UPDATE"},{"gtasId":"7704418","tamrId":"7726b69d-6634-3ce2-8194-48538fef5dba","version":342,"action":"UPDATE"},{"gtasId":"4284620","tamrId":"806d10f3-a958-3df8-87bc-fa1b5fe3efc7","version":342,"action":"UPDATE"},{"gtasId":"2926555","tamrId":"8996063d-2144-3682-ae23-c96b03c3afb2","version":342,"action":"UPDATE"},{"gtasId":"15565015","tamrId":"45150ae3-2f70-3d25-9f87-8a4e61926506","version":342,"action":"UPDATE"},{"gtasId":"10051794","tamrId":"4da3de0f-ffa3-3197-b24e-fff4b020895f","version":342,"action":"UPDATE"},{"gtasId":"4097849","tamrId":"9750f03d-3d18-3072-9c38-ebab316f0721","version":342,"action":"UPDATE"},{"gtasId":"19858396","tamrId":"3718ffd6-75e5-36a9-af04-7f70bbe64074","version":342,"action":"UPDATE"},{"gtasId":"1540515","tamrId":"89a367a3-9415-39c0-a82a-0e9fdf730058","version":342,"action":"UPDATE"},{"gtasId":"1780669","tamrId":"29930c1c-d966-3391-a95c-e61e641e27d3","version":342,"action":"UPDATE"},{"gtasId":"9248906","tamrId":"9bb0bcaa-6d2a-30b7-8b75-4ddc4b706f85","version":342,"action":"UPDATE"},{"gtasId":"8575702","tamrId":"449732ab-7bb4-33f7-b36b-554dcbe09cfa","version":342,"action":"UPDATE"},{"gtasId":"3398356","tamrId":"2c20c492-2ac1-347e-a378-a7d4357f59ce","version":342,"action":"UPDATE"},{"gtasId":"2614723","tamrId":"1277632f-e795-393e-a410-09b015c02c10","version":342,"action":"UPDATE"},{"gtasId":"308527","tamrId":"5d693a2b-c56e-32f9-834e-091614e19be5","version":342,"action":"UPDATE"},{"gtasId":"9303856","tamrId":"77031e08-a3a2-3390-a9af-cbd41e656757","version":342,"action":"UPDATE"},{"gtasId":"13742770","tamrId":"f8cb87d3-324a-3726-b966-85d4ad41743f","version":342,"action":"UPDATE"},{"gtasId":"8167170","tamrId":"9e83d14f-b0c4-389b-be76-be49d525f7de","version":342,"action":"UPDATE"},{"gtasId":"3408230","tamrId":"2568f363-a359-393a-adb4-dad445503048","version":342,"action":"UPDATE"},{"gtasId":"4266323","tamrId":"27c4f96c-c3bd-3512-9aa9-8c69300a50b9","version":342,"action":"UPDATE"},{"gtasId":"10920249","tamrId":"96f8cf84-3155-3e5c-9ddd-bbb1876afd49","version":342,"action":"UPDATE"},{"gtasId":"21640943","tamrId":"a0a10f94-2ff8-3ca0-a04e-88ad91f6ce57","version":342,"action":"UPDATE"},{"gtasId":"18832339","tamrId":"f1482dc5-b631-3e5a-a7e0-b454e16e1bc8","version":342,"action":"UPDATE"},{"gtasId":"24159527","tamrId":"7fb1c553-7c56-3f82-836a-37aeb2bc6850","version":342,"action":"UPDATE"},{"gtasId":"22643889","tamrId":"51078a44-75a6-3324-9672-00a5f8de54d3","version":342,"action":"UPDATE"},{"gtasId":"18077452","tamrId":"1f72af1b-af22-3156-b829-f1a913e8872c","version":342,"action":"UPDATE"},{"gtasId":"5429255","tamrId":"fe117095-f399-3ddd-ac1a-a91fb350767d","version":342,"action":"UPDATE"},{"gtasId":"3327138","tamrId":"dec1d1d2-23dc-33b3-b2ce-0b3615a99d5b","version":342,"action":"UPDATE"},{"gtasId":"1924160","tamrId":"bab95e3a-d00e-3cce-b378-b5c3cd6355ba","version":342,"action":"UPDATE"},{"gtasId":"10786883","tamrId":"7d3cd8f1-2527-3f52-b09e-c45c9a83ea3f","version":342,"action":"UPDATE"},{"gtasId":"22089051","tamrId":"c3d8ab11-db3f-36a7-9f71-55e9657e477b","version":342,"action":"UPDATE"},{"gtasId":"9183087","tamrId":"39c255a3-dc09-3eca-a361-3a898a1a56a9","version":342,"action":"UPDATE"},{"gtasId":"17762962","tamrId":"4798e163-f7e6-3032-984a-1805778b162a","version":342,"action":"UPDATE"},{"gtasId":"6233957","tamrId":"54a0058e-c316-3ce3-889d-10d198d19d29","version":342,"action":"UPDATE"},{"gtasId":"12710029","tamrId":"bf6d821d-2092-36cb-b6a8-fe6620ded3bd","version":342,"action":"UPDATE"},{"gtasId":"20654482","tamrId":"6ea9f87e-735c-38c5-90c3-ec0ceabda6d5","version":342,"action":"UPDATE"},{"gtasId":"10117241","tamrId":"4382a2d2-8776-399a-b597-5ce16c459d4c","version":342,"action":"UPDATE"},{"gtasId":"16691813","tamrId":"85363654-d291-3d14-b89c-e25dd7e1bce6","version":342,"action":"UPDATE"},{"gtasId":"16079544","tamrId":"cdf79701-bd03-3600-ba39-9f9c72cb0eaa","version":342,"action":"UPDATE"},{"gtasId":"3803926","tamrId":"77fa8255-b7f5-332c-beb7-4cf15662bf67","version":342,"action":"UPDATE"},{"gtasId":"7222217","tamrId":"513a4ac0-b9b5-38a4-a1b5-cde452245c71","version":342,"action":"UPDATE"},{"gtasId":"23430742","tamrId":"fbb48aec-8f15-3aa6-8bb0-2b60c976af0e","version":342,"action":"UPDATE"},{"gtasId":"12599774","tamrId":"3889cf5d-bbe9-3c56-a551-29e4381c6f9b","version":342,"action":"UPDATE"},{"gtasId":"11149952","tamrId":"5aa57ee7-4e91-333f-9685-d5991c16e5e2","version":342,"action":"UPDATE"},{"gtasId":"4114051","tamrId":"e38c0132-429e-32c6-b289-bf59795a7827","version":342,"action":"UPDATE"},{"gtasId":"10671548","tamrId":"ec668d1d-474c-39df-86db-d071cc8073fe","version":342,"action":"UPDATE"},{"gtasId":"4396839","tamrId":"5c8d624e-eda2-3709-86b6-9bc1a7d2d490","version":342,"action":"UPDATE"},{"gtasId":"10300048","tamrId":"bb31ee72-306a-3801-9a53-264fbd16d1ae","version":342,"action":"UPDATE"},{"gtasId":"11638370","tamrId":"4acb727b-f66f-3595-a0bd-cd9b3008a6b0","version":342,"action":"UPDATE"},{"gtasId":"22940204","tamrId":"94a8e8f4-dad7-37b7-a103-2eae5f4f5807","version":342,"action":"UPDATE"},{"gtasId":"18763225","tamrId":"06db0f7a-41b2-3278-a6f4-c15adb5bfa32","version":342,"action":"UPDATE"},{"gtasId":"16358931","tamrId":"08281e00-bdf0-34bb-8f13-daed442424c0","version":342,"action":"UPDATE"},{"gtasId":"5342871","tamrId":"3ca2bd65-f6d3-31b7-83d2-4ffe9f5cb238","version":342,"action":"UPDATE"},{"gtasId":"23278232","tamrId":"3123f7cc-34b5-3abb-8f12-3d774e987c1d","version":342,"action":"UPDATE"},{"gtasId":"12900704","tamrId":"607931da-1fae-3811-a02b-ded50a9f9f90","version":342,"action":"UPDATE"},{"gtasId":"10958875","tamrId":"640d4e41-59e4-3619-91d7-fc7431ab4cf3","version":342,"action":"UPDATE"},{"gtasId":"6550369","tamrId":"115a0f93-d8f5-37ea-8747-7f86c2b2b612","version":342,"action":"UPDATE"},{"gtasId":"15029437","tamrId":"e31bfaff-e905-33d6-8294-47a032ba176c","version":342,"action":"UPDATE"},{"gtasId":"3941603","tamrId":"175a4aba-5090-354b-9cbf-542327f23c45","version":342,"action":"UPDATE"},{"gtasId":"11715076","tamrId":"0c01c69e-7c36-326b-b6c6-281d4b5f6a48","version":342,"action":"UPDATE"},{"gtasId":"7375860","tamrId":"42aca5b8-bf28-305c-832a-0eaaa673d007","version":342,"action":"UPDATE"},{"gtasId":"22377384","tamrId":"92f9354d-93aa-332f-893d-c376e4c90fa6","version":342,"action":"UPDATE"},{"gtasId":"16136206","tamrId":"492d7734-0b02-39f9-a2e4-6f22bdda3a91","version":342,"action":"UPDATE"},{"gtasId":"14963584","tamrId":"41daac04-5b3e-37c1-8e7e-849045209750","version":342,"action":"UPDATE"},{"gtasId":"16912051","tamrId":"a6aa0ce9-bc8a-37ad-a3bc-ebdb7efcba56","version":342,"action":"UPDATE"},{"gtasId":"19392335","tamrId":"50e872ac-74b7-33d5-b58b-862e247be552","version":342,"action":"UPDATE"},{"gtasId":"14358823","tamrId":"c4c8295f-d5e7-3cc2-8bd7-043ecce3623f","version":342,"action":"UPDATE"},{"gtasId":"149879","tamrId":"8337620f-93fd-3b30-81c9-0e206df13fb8","version":342,"action":"UPDATE"},{"gtasId":"24192141","tamrId":"a867cd07-a8d8-378c-a1ca-a80624821791","version":342,"action":"UPDATE"},{"gtasId":"914597","tamrId":"40c2a251-24aa-357c-8079-6686b509c410","version":342,"action":"UPDATE"},{"gtasId":"23093394","tamrId":"69619f99-f792-33cf-88df-4d1419757406","version":342,"action":"UPDATE"},{"gtasId":"2966218","tamrId":"f36f3ebd-698c-3f2f-9179-2c06bbf37538","version":342,"action":"UPDATE"},{"gtasId":"23918126","tamrId":"a9195633-d0c8-3fc2-84b5-61f229fa8e6f","version":342,"action":"UPDATE"},{"gtasId":"8433658","tamrId":"563ef1d1-1858-3c57-8c79-618e831cd944","version":342,"action":"UPDATE"},{"gtasId":"1832390","tamrId":"e861006f-bc82-3f5f-bb05-255c874acd36","version":342,"action":"UPDATE"},{"gtasId":"498286","tamrId":"950877d8-65d5-3a71-8423-0c6673edbcd3","version":342,"action":"UPDATE"},{"gtasId":"6184005","tamrId":"0311d82c-bf3c-35cf-8080-5d72a5ee5da9","version":342,"action":"UPDATE"},{"gtasId":"12361528","tamrId":"db5c729d-0361-3c71-8cc3-2bf33043abc3","version":342,"action":"UPDATE"},{"gtasId":"6484304","tamrId":"e9b6df9f-ba94-3315-99a7-506d77dc7a2a","version":342,"action":"UPDATE"},{"gtasId":"9611337","tamrId":"2a777ac5-2704-3f8f-b231-eee635ff78a8","version":342,"action":"UPDATE"},{"gtasId":"13688714","tamrId":"82d2fda2-5db7-3c0c-b87f-85adbbf205d1","version":342,"action":"UPDATE"},{"gtasId":"23073787","tamrId":"4e33a0e4-625b-3626-9d59-9691cd98bee5","version":342,"action":"UPDATE"},{"gtasId":"13401950","tamrId":"4faf67cc-fdde-3c95-bf47-e48cb1f568e7","version":342,"action":"UPDATE"},{"gtasId":"6446039","tamrId":"e56f1aaa-4578-3067-a1e7-4d9ef8c25d1d","version":342,"action":"UPDATE"},{"gtasId":"402613","tamrId":"8c0a33d1-cafc-3fe6-bcaf-79d56995c92e","version":342,"action":"UPDATE"},{"gtasId":"7530104","tamrId":"abda5f87-dc4a-33a2-a31c-05280cc39c14","version":342,"action":"UPDATE"},{"gtasId":"10600376","tamrId":"e2a1c877-9882-3f96-9431-fb3bfbab6390","version":342,"action":"UPDATE"},{"gtasId":"17108807","tamrId":"f2ba5236-cb3f-3bab-80b3-0161875d5de9","version":342,"action":"UPDATE"},{"gtasId":"816944","tamrId":"7ebc827a-abb7-3130-90b0-9d8212ed6426","version":342,"action":"UPDATE"},{"gtasId":"12529011","tamrId":"28dd25c6-bd1f-318f-a725-75e4fdf0ac5d","version":342,"action":"UPDATE"},{"gtasId":"5537520","tamrId":"999ff47a-dea4-3846-b4db-2ded8e5ae28e","version":342,"action":"UPDATE"},{"gtasId":"12232367","tamrId":"70407025-271e-3607-bfd2-5a1f45451c0f","version":342,"action":"UPDATE"},{"gtasId":"12307177","tamrId":"5444458d-2c06-31f7-a694-f7b695dd4875","version":342,"action":"UPDATE"},{"gtasId":"6347919","tamrId":"250c972f-129e-3e9e-81d1-06c1c73bb198","version":342,"action":"UPDATE"},{"gtasId":"2934665","tamrId":"461b3007-690b-3253-aa68-e1952ee29a09","version":342,"action":"UPDATE"},{"gtasId":"144130","tamrId":"5a843efc-865e-3dc6-a0c8-980a8d376033","version":342,"action":"UPDATE"},{"gtasId":"9073470","tamrId":"9b90ca58-65ec-34b7-8b2d-ecd654d01812","version":342,"action":"UPDATE"},{"gtasId":"4368792","tamrId":"eb12e418-99cb-3c2b-bd73-b3047f92b109","version":342,"action":"UPDATE"},{"gtasId":"16964902","tamrId":"17fed470-af71-3c92-951f-3efdb7d6e462","version":342,"action":"UPDATE"},{"gtasId":"11866013","tamrId":"e8bd4ee7-fbc2-3ef8-9180-f030b3b0a166","version":342,"action":"UPDATE"},{"gtasId":"25495789","tamrId":"884e06c3-c964-3160-a2ae-605a098b260f","version":342,"action":"UPDATE"},{"gtasId":"421789","tamrId":"94391c35-c57a-3fd8-820e-71eafb32503b","version":342,"action":"UPDATE"},{"gtasId":"15035297","tamrId":"b98372d1-aed0-37a0-ba6d-64af061ac873","version":342,"action":"UPDATE"},{"gtasId":"8935368","tamrId":"c88f1879-ab24-38ec-a2f3-7a4776d5e4cb","version":342,"action":"UPDATE"},{"gtasId":"21501526","tamrId":"ac181324-793d-3e64-b7d3-c7b949fcf99a","version":342,"action":"UPDATE"},{"gtasId":"11482425","tamrId":"a7ffec96-e76c-3ff9-99be-a8e019206b18","version":342,"action":"UPDATE"},{"gtasId":"938561","tamrId":"2f485feb-3187-3fd3-8239-008c19ed89e8","version":342,"action":"UPDATE"},{"gtasId":"23862044","tamrId":"f369ebc5-1de6-3ca8-9065-5dd276caf25f","version":342,"action":"UPDATE"},{"gtasId":"5888143","tamrId":"9da957e5-10fd-3453-b9ea-ff157c7a3131","version":342,"action":"UPDATE"},{"gtasId":"16021359","tamrId":"0cae2d5b-e779-35ce-bc4c-5bc1d4e13568","version":342,"action":"UPDATE"},{"gtasId":"10539166","tamrId":"d98e0a71-3349-3c6a-bceb-eab747d40d97","version":342,"action":"UPDATE"},{"gtasId":"25118458","tamrId":"1106d5c3-bcff-3909-aecc-f969dd170dc7","version":342,"action":"UPDATE"},{"gtasId":"20338981","tamrId":"e541a492-0483-3a5a-8cf1-157b85383441","version":342,"action":"UPDATE"},{"gtasId":"165078","tamrId":"4363b5a6-af1a-338f-b9b4-c5f576033254","version":342,"action":"UPDATE"},{"gtasId":"18776573","tamrId":"ed359a43-1c97-33de-8902-c56bad809f45","version":342,"action":"UPDATE"},{"gtasId":"8711797","tamrId":"5574f7b8-95d1-3fd8-9736-baa31f56def4","version":342,"action":"UPDATE"},{"gtasId":"3559214","tamrId":"5e638373-050c-396c-a60a-3b6927b3725a","version":342,"action":"UPDATE"},{"gtasId":"9152732","tamrId":"3ad37469-674d-3aab-afaf-e45ee12d0828","version":342,"action":"UPDATE"},{"gtasId":"3721503","tamrId":"750411ac-d1d6-3b21-a56e-22e38aa5f898","version":342,"action":"UPDATE"},{"gtasId":"799061","tamrId":"42f2ddc4-5f17-3a56-9c46-5b36cc9f635e","version":342,"action":"UPDATE"},{"gtasId":"22552516","tamrId":"7e44a011-76d0-3c57-aa3d-baff56051edd","version":342,"action":"UPDATE"},{"gtasId":"8008181","tamrId":"284002e8-c813-3055-89b8-607a808b204d","version":342,"action":"UPDATE"},{"gtasId":"21906938","tamrId":"1125cba0-c0b5-3e42-92e0-c82550827e81","version":342,"action":"UPDATE"},{"gtasId":"3905901","tamrId":"5fd22420-468c-38a0-b28f-b38659d2ab57","version":342,"action":"UPDATE"},{"gtasId":"4759999","tamrId":"1c085181-472a-37b3-bfa1-47c950304756","version":342,"action":"UPDATE"},{"gtasId":"22361839","tamrId":"bb18f4af-2cae-3bf1-86bf-2ffd68e98ba8","version":342,"action":"UPDATE"},{"gtasId":"19301563","tamrId":"d516466d-b54d-3960-8fc1-85c4f80ab1d5","version":342,"action":"UPDATE"},{"gtasId":"10120861","tamrId":"07d72256-d2b1-3614-afcb-fc1992754c9e","version":342,"action":"UPDATE"},{"gtasId":"398030","tamrId":"44c2f31e-bd8d-3152-b075-5dc29a38f6a1","version":342,"action":"UPDATE"},{"gtasId":"21616449","tamrId":"d4bcd933-80e4-3a6a-9ace-76b8533f22ab","version":342,"action":"UPDATE"},{"gtasId":"6406850","tamrId":"1c936a03-e97c-3f30-9d2c-cf49a337ea06","version":342,"action":"UPDATE"},{"gtasId":"6437113","tamrId":"d1fab40c-14dc-361e-b992-5583b2335c72","version":342,"action":"UPDATE"},{"gtasId":"14602273","tamrId":"e4757f5e-6534-3e43-b4a0-01437aa18134","version":342,"action":"UPDATE"},{"gtasId":"7728353","tamrId":"f7f92c3b-4ffc-31c1-b50b-ded5a25686ad","version":342,"action":"UPDATE"},{"gtasId":"15248216","tamrId":"72e2f128-0857-3f9b-b0df-ef413178b385","version":342,"action":"UPDATE"},{"gtasId":"5676525","tamrId":"ea0be6ac-0c77-3cc8-8b4e-178b49732ecb","version":342,"action":"UPDATE"},{"gtasId":"3431412","tamrId":"7ae27125-064a-3033-a1fc-0d53d94607fa","version":342,"action":"UPDATE"},{"gtasId":"15695912","tamrId":"e5cff683-615d-39f6-b0c1-37275eff2274","version":342,"action":"UPDATE"},{"gtasId":"3694201","tamrId":"d1b17689-6f74-32d8-bcd5-45f25ca5a1fe","version":342,"action":"UPDATE"},{"gtasId":"4276526","tamrId":"ba024651-c9fd-3e88-8da8-6c4751de7d08","version":342,"action":"UPDATE"},{"gtasId":"10764684","tamrId":"23198ba7-ff73-36f9-918d-a47f77bb8cec","version":342,"action":"UPDATE"},{"gtasId":"25037392","tamrId":"d4271f41-3f46-3aba-9318-f927341974db","version":342,"action":"UPDATE"},{"gtasId":"19861951","tamrId":"f027de0a-344d-3671-82db-4fed46bad619","version":342,"action":"UPDATE"},{"gtasId":"2040807","tamrId":"1946bb1f-d9c9-363c-b6cc-ded80441ad61","version":342,"action":"UPDATE"},{"gtasId":"8472415","tamrId":"6f3e95b2-3029-364f-a7d3-2295c2075f95","version":342,"action":"UPDATE"},{"gtasId":"16182971","tamrId":"50376f12-c62c-35fa-a6ab-af9e9a6006ad","version":342,"action":"UPDATE"},{"gtasId":"7200835","tamrId":"88567ffc-2e13-3c91-9aa2-72c80422313f","version":342,"action":"UPDATE"},{"gtasId":"13543555","tamrId":"ee98d75b-23ea-3954-bb46-5689312e968a","version":342,"action":"UPDATE"},{"gtasId":"3406451","tamrId":"d270d44e-8af3-364d-a7a4-2240088c1e2c","version":342,"action":"UPDATE"},{"gtasId":"8129741","tamrId":"94e53bf6-6a57-38f4-8b20-c95fab4568d3","version":342,"action":"UPDATE"},{"gtasId":"861550","tamrId":"ab1cbc2b-e911-3dee-83d9-eeec8b5353a3","version":342,"action":"UPDATE"},{"gtasId":"19271175","tamrId":"55a0c710-f93b-3e72-95c1-096dff6abe9d","version":342,"action":"UPDATE"},{"gtasId":"12773225","tamrId":"b44dff26-a498-307b-8e62-b00e4c2b2c08","version":342,"action":"UPDATE"},{"gtasId":"4126888","tamrId":"1acf681d-985b-3d8b-b07a-a8e7f8738b60","version":342,"action":"UPDATE"},{"gtasId":"7228399","tamrId":"c21286bf-bdd3-3a56-bd85-c4de6132b32c","version":342,"action":"UPDATE"},{"gtasId":"18320458","tamrId":"6fd14e7a-0620-3688-953f-1c52ed8c1cb6","version":342,"action":"UPDATE"},{"gtasId":"3295067","tamrId":"9b3c813d-6b73-38d0-a407-bbb6452b6425","version":342,"action":"UPDATE"},{"gtasId":"5447070","tamrId":"6f666a3f-3c08-3c9f-b8f0-6249ab20a5ed","version":342,"action":"UPDATE"},{"gtasId":"21519681","tamrId":"45268fd9-f906-316e-86d1-90e12cf85824","version":342,"action":"UPDATE"},{"gtasId":"5823695","tamrId":"77670769-61d2-3d22-82ef-37bb414b2f8e","version":342,"action":"UPDATE"},{"gtasId":"23156679","tamrId":"0083d81e-4d10-3492-94fa-58d965421aa0","version":342,"action":"UPDATE"},{"gtasId":"4952534","tamrId":"7ccaa603-6cd2-349a-b287-2ac18642975f","version":342,"action":"UPDATE"},{"gtasId":"11372815","tamrId":"8d6f039d-a039-3eed-96f6-0eb8b4f2e13b","version":342,"action":"UPDATE"},{"gtasId":"3352985","tamrId":"52058fee-74fe-3b6e-847c-cf8a2145a78a","version":342,"action":"UPDATE"},{"gtasId":"8021983","tamrId":"63b93027-45f5-3715-a67a-e8ad285c67ac","version":342,"action":"UPDATE"},{"gtasId":"24867986","tamrId":"dbd8b9f0-f2a2-3eaa-95d1-f6ea4bdac8ba","version":342,"action":"UPDATE"},{"gtasId":"5078123","tamrId":"b3e4f7f7-7c45-31a6-bb55-ed0f16432f90","version":342,"action":"UPDATE"},{"gtasId":"5485366","tamrId":"14c04d10-1bf2-369b-9d10-f0c41ad2b2d9","version":342,"action":"UPDATE"},{"gtasId":"4031188","tamrId":"05cd9eae-7afa-3e54-a241-434214d08cc5","version":342,"action":"UPDATE"},{"gtasId":"1002342","tamrId":"4acf28e8-12d9-3363-8615-7e03786665b0","version":342,"action":"UPDATE"},{"gtasId":"502848","tamrId":"a35bb017-15c1-326d-a4ad-b5b82d198de5","version":342,"action":"UPDATE"},{"gtasId":"6933520","tamrId":"41ef7b77-4036-3ec2-8363-9eeb0c981edb","version":342,"action":"UPDATE"},{"gtasId":"6954423","tamrId":"637f18de-f3d0-3914-ae65-9d50002163e7","version":342,"action":"UPDATE"},{"gtasId":"766129","tamrId":"7f8d8803-5e3f-3f00-a41f-3c2daa22f5ff","version":342,"action":"UPDATE"},{"gtasId":"3211333","tamrId":"d317d220-3f2d-3833-aba1-973255281c19","version":342,"action":"UPDATE"},{"gtasId":"467951","tamrId":"f1aebd06-21bb-3118-b81a-11be0afc1fb2","version":342,"action":"UPDATE"},{"gtasId":"23383073","tamrId":"3cb869c2-28d1-3080-80cb-ea4399100dcf","version":342,"action":"UPDATE"},{"gtasId":"4733339","tamrId":"cb3740e5-db27-3d20-ab4d-9fd39f8b56cd","version":342,"action":"UPDATE"},{"gtasId":"13450026","tamrId":"be999580-7a82-3216-b15c-d6a0a5fdc387","version":342,"action":"UPDATE"},{"gtasId":"16412147","tamrId":"4a654457-627d-31d9-b038-549bc0576008","version":342,"action":"UPDATE"},{"gtasId":"12712635","tamrId":"7fc9bcf0-4402-3b11-8c4e-04f2207eb94d","version":342,"action":"UPDATE"},{"gtasId":"10662622","tamrId":"f0e8cd34-90de-3f38-91bc-0802e972fff9","version":342,"action":"UPDATE"},{"gtasId":"6535564","tamrId":"8277b9d6-909e-3394-8ba0-21a9f2f23234","version":342,"action":"UPDATE"},{"gtasId":"16886051","tamrId":"7eac388d-48f1-3d8f-a8e3-9e88909ebc19","version":342,"action":"UPDATE"},{"gtasId":"12123182","tamrId":"f9bc4d86-f57f-3d8b-acce-1e1c37b7355f","version":342,"action":"UPDATE"},{"gtasId":"5805792","tamrId":"99ebebdd-55d8-3b54-bc0f-abf4ca9b168e","version":342,"action":"UPDATE"},{"gtasId":"22720550","tamrId":"e94d9c2d-1696-3787-9d83-bf9ea4215a8a","version":342,"action":"UPDATE"},{"gtasId":"8773122","tamrId":"5af41623-fbf5-3256-89f2-d2124a4995e2","version":342,"action":"UPDATE"},{"gtasId":"15294109","tamrId":"1885559e-8ddd-37b0-bc10-9080261c4eba","version":342,"action":"UPDATE"},{"gtasId":"11389697","tamrId":"265614f9-4938-3111-b30d-9b96659b40d2","version":342,"action":"UPDATE"},{"gtasId":"18167414","tamrId":"6280604c-b7e7-393f-9534-53ad9fd076c0","version":342,"action":"UPDATE"},{"gtasId":"12719267","tamrId":"cbf0f7c4-1845-3d9b-8bf0-90f28e6942a1","version":342,"action":"UPDATE"},{"gtasId":"5047870","tamrId":"0f297d69-5892-3689-a5e4-5016234c389c","version":342,"action":"UPDATE"},{"gtasId":"14563001","tamrId":"f2b2b9de-4a70-37c1-8198-248385081dbd","version":342,"action":"UPDATE"},{"gtasId":"2775098","tamrId":"2c356f7c-1939-3eca-8c72-993bb376f6da","version":342,"action":"UPDATE"},{"gtasId":"5517917","tamrId":"dcce51d7-312c-3ec4-8f90-61ca27b82f0a","version":342,"action":"UPDATE"},{"gtasId":"14958155","tamrId":"488d8101-3969-310e-867a-d1bc24aa2dcd","version":342,"action":"UPDATE"},{"gtasId":"10009393","tamrId":"0ebea3d9-98b7-31b0-85f7-172326db59bf","version":342,"action":"UPDATE"},{"gtasId":"2531099","tamrId":"bc123820-2f6f-3cc3-9a25-98027e31d6be","version":342,"action":"UPDATE"},{"gtasId":"1023220","tamrId":"083e9368-f310-3684-a26d-59592f28f83b","version":342,"action":"UPDATE"},{"gtasId":"9664702","tamrId":"1b386a48-8591-3ecc-9404-5ad521f996ac","version":342,"action":"UPDATE"},{"gtasId":"14891317","tamrId":"bdd2a606-4f63-38e6-8f92-9db79c1c63cc","version":342,"action":"UPDATE"},{"gtasId":"12191281","tamrId":"4c7dad89-6b4e-3d8e-8c21-3a8ce135ab7d","version":342,"action":"UPDATE"},{"gtasId":"10311599","tamrId":"94bebbb7-bde4-30b1-ab58-5c8360af0628","version":342,"action":"UPDATE"},{"gtasId":"19749230","tamrId":"cf204d0e-b420-3359-ac9e-b98f20044b6c","version":342,"action":"UPDATE"},{"gtasId":"22655019","tamrId":"d2c5c3c1-9153-316c-8b6e-3a950120c2c2","version":342,"action":"UPDATE"},{"gtasId":"6316859","tamrId":"09a94431-6c4e-38d4-a000-50df489b4073","version":342,"action":"UPDATE"},{"gtasId":"22858952","tamrId":"e94ad3bd-bb8a-31cd-a0ac-272829e5283a","version":342,"action":"UPDATE"},{"gtasId":"232897","tamrId":"d44d1765-f1d2-3bf1-a3d4-a4c5454b7105","version":342,"action":"UPDATE"},{"gtasId":"10700542","tamrId":"91d929d7-3799-3027-96f7-38bd54762642","version":342,"action":"UPDATE"},{"gtasId":"24889342","tamrId":"bbf8c178-2fd0-399f-bd7f-0082676d9169","version":342,"action":"UPDATE"},{"gtasId":"16469054","tamrId":"2a64c411-346f-3671-b696-ccf04ba6ae7d","version":342,"action":"UPDATE"},{"gtasId":"22597448","tamrId":"df7dc28e-1962-345a-946c-de8b58f91783","version":342,"action":"UPDATE"},{"gtasId":"5851705","tamrId":"36b43647-5b1f-380a-9109-93aa54a9fa54","version":342,"action":"UPDATE"},{"gtasId":"99329","tamrId":"1d57b84b-97c8-3930-a32e-9a477bfd5e67","version":342,"action":"UPDATE"},{"gtasId":"7786269","tamrId":"642a09f2-1c2b-347e-8785-1f2f09f92f8a","version":342,"action":"UPDATE"},{"gtasId":"1989503","tamrId":"961ca36b-4253-3969-904d-20b4596890b5","version":342,"action":"UPDATE"},{"gtasId":"22568961","tamrId":"5182d99f-f73d-3e64-a5cc-a9283b26b612","version":342,"action":"UPDATE"},{"gtasId":"23613450","tamrId":"72453975-ba64-3df4-bc89-17cb0823eab5","version":342,"action":"UPDATE"},{"gtasId":"13880430","tamrId":"709811ec-ae68-3e47-907a-5a899ba93b7d","version":342,"action":"UPDATE"},{"gtasId":"20846412","tamrId":"8286daa5-c430-3741-86df-ba538248792a","version":342,"action":"UPDATE"},{"gtasId":"17845894","tamrId":"3310f649-0d5e-390a-bebb-ac7be3ffab9d","version":342,"action":"UPDATE"},{"gtasId":"6748900","tamrId":"fbb8cf3b-4c85-3aa2-a36b-aa1cb6ec0e7f","version":342,"action":"UPDATE"},{"gtasId":"22949435","tamrId":"f3219022-a3c3-3a1b-a206-c21bfe2fd44f","version":342,"action":"UPDATE"},{"gtasId":"9416586","tamrId":"33042cc6-80e6-32f9-9ee1-18e21b336541","version":342,"action":"UPDATE"},{"gtasId":"3351613","tamrId":"db340cb5-ab02-30c2-a1eb-af236cb2351c","version":342,"action":"UPDATE"},{"gtasId":"22286405","tamrId":"99c113bd-6ed3-3439-ae5e-0ead823b17a5","version":342,"action":"UPDATE"},{"gtasId":"6648214","tamrId":"3768e7dd-da37-3cda-a56b-4000647b20df","version":342,"action":"UPDATE"},{"gtasId":"4788441","tamrId":"cf90c649-87fe-3640-87b0-82412869164b","version":342,"action":"UPDATE"},{"gtasId":"23947132","tamrId":"2e011834-7507-3c5f-b3e8-be13abcad4c7","version":342,"action":"UPDATE"},{"gtasId":"1504874","tamrId":"d5e4537c-b3b3-3fb3-8356-7dd8384996db","version":342,"action":"UPDATE"},{"gtasId":"4590350","tamrId":"43ddc9b9-f2cd-3810-82de-22222a20be1b","version":342,"action":"UPDATE"},{"gtasId":"2760812","tamrId":"4d6d247a-b23d-3a58-be3b-8fa68e2b0bbc","version":342,"action":"UPDATE"},{"gtasId":"15889356","tamrId":"c06ef2b5-252c-382b-815e-b8d923fd38b7","version":342,"action":"UPDATE"},{"gtasId":"3504947","tamrId":"29b8d797-8ffd-3d48-864e-bb07e578b554","version":342,"action":"UPDATE"},{"gtasId":"2350989","tamrId":"ebf6bfb8-bac2-3495-96a8-7ba06ed8a884","version":342,"action":"UPDATE"},{"gtasId":"3871202","tamrId":"e1cac8ba-0a37-3bf0-9408-b85ae2d01bd2","version":342,"action":"UPDATE"},{"gtasId":"4789782","tamrId":"4d8b11c6-9238-3f85-ae02-3a9a9b423702","version":342,"action":"UPDATE"},{"gtasId":"21599795","tamrId":"b9340946-bff2-3224-abfb-1b2630a094e0","version":342,"action":"UPDATE"},{"gtasId":"371889","tamrId":"5058c699-f293-32cf-8dc7-0dff1f877807","version":342,"action":"UPDATE"},{"gtasId":"698708","tamrId":"3d3cc06d-f82c-34f0-80c8-de9c86f12358","version":342,"action":"UPDATE"},{"gtasId":"7522564","tamrId":"575dd41a-cfa1-3ef1-a8b0-37ac79ca69e2","version":342,"action":"UPDATE"},{"gtasId":"7868248","tamrId":"74d2b077-7e6f-3e20-82ed-a8b4ff24c98a","version":342,"action":"UPDATE"},{"gtasId":"11174941","tamrId":"8da193d3-4227-3a11-90d6-937300eba750","version":342,"action":"UPDATE"},{"gtasId":"12594908","tamrId":"fd4c6c3c-3e44-31c7-af0a-a2a449204d17","version":342,"action":"UPDATE"},{"gtasId":"9221843","tamrId":"9df5e1c8-0f1c-3f72-97fc-1ff361851631","version":342,"action":"UPDATE"},{"gtasId":"20928437","tamrId":"9ac4f770-be99-30c9-a288-748c401732db","version":342,"action":"UPDATE"},{"gtasId":"8658125","tamrId":"2542782d-5630-311c-9e5b-f5547027cb43","version":342,"action":"UPDATE"},{"gtasId":"25202269","tamrId":"044ca0ef-0081-3677-b9a9-98b653c7d9cf","version":342,"action":"UPDATE"},{"gtasId":"21319159","tamrId":"8f2fcaa4-c288-3280-96d2-c437c2774164","version":342,"action":"UPDATE"},{"gtasId":"6316826","tamrId":"c06729af-23c7-35bf-9987-5a32ee9f8469","version":342,"action":"UPDATE"},{"gtasId":"13613133","tamrId":"60ec752d-7dcb-32f2-bbc4-690fe8cca075","version":342,"action":"UPDATE"},{"gtasId":"9475725","tamrId":"987aaff4-626a-34e1-99ae-8ebf62715e70","version":342,"action":"UPDATE"},{"gtasId":"13418756","tamrId":"f5485dfb-9cb3-3c20-a771-e43726eea650","version":342,"action":"UPDATE"},{"gtasId":"23659632","tamrId":"a0e20b90-726d-3a1c-abb8-0cbb0924b73e","version":342,"action":"UPDATE"},{"gtasId":"9637004","tamrId":"964abb36-7b46-3fe4-9229-fc27c7b4464e","version":342,"action":"UPDATE"},{"gtasId":"10345733","tamrId":"9db76f26-b52e-3618-9ef5-f49b19431ca1","version":342,"action":"UPDATE"},{"gtasId":"7266714","tamrId":"8d02f5e1-4b53-3a50-bbb7-e90c75b26778","version":342,"action":"UPDATE"},{"gtasId":"21677441","tamrId":"0defc518-93e2-3001-b4df-f648f154166e","version":342,"action":"UPDATE"},{"gtasId":"22273943","tamrId":"1aedb035-3d30-3498-9715-62951196d63c","version":342,"action":"UPDATE"},{"gtasId":"18610425","tamrId":"b999bd42-85da-3667-acc3-e948a7004c59","version":342,"action":"UPDATE"},{"gtasId":"9570342","tamrId":"1a69b945-764a-397d-b174-2261a99f2ec6","version":342,"action":"UPDATE"},{"gtasId":"19767810","tamrId":"23c52d08-664d-3e5b-bc7d-113931f6e6b6","version":342,"action":"UPDATE"},{"gtasId":"19648564","tamrId":"0ade1c92-a820-3815-a746-9d3987391028","version":342,"action":"UPDATE"},{"gtasId":"12471937","tamrId":"b493362c-a49b-3980-8aa0-0fb13f165bf1","version":342,"action":"UPDATE"},{"gtasId":"8246406","tamrId":"36c51760-d913-34e8-a380-49c2cbb3e1fb","version":342,"action":"UPDATE"},{"gtasId":"8986065","tamrId":"3ccd7bb8-1d79-3f9e-99f0-fd96ed39b1da","version":342,"action":"UPDATE"},{"gtasId":"18806861","tamrId":"10c8cf54-8213-371b-a888-b1333212787c","version":342,"action":"UPDATE"},{"gtasId":"17320623","tamrId":"c8058d3f-df0b-322f-8946-0a78f5ee502a","version":342,"action":"UPDATE"},{"gtasId":"13785945","tamrId":"f34d1aee-370e-3653-ab19-a49917f4d31e","version":342,"action":"UPDATE"},{"gtasId":"20489571","tamrId":"bebcbd24-ec5e-3077-8904-39009ed1512f","version":342,"action":"UPDATE"},{"gtasId":"15709333","tamrId":"d06fb1bd-ebeb-3f0e-9b56-920f627197b6","version":342,"action":"UPDATE"},{"gtasId":"5598551","tamrId":"302d8468-4790-3cf4-8eb9-b534157df402","version":342,"action":"UPDATE"},{"gtasId":"16626810","tamrId":"0499ce37-9c26-3f76-92b1-b1cd906f752c","version":342,"action":"UPDATE"},{"gtasId":"11175454","tamrId":"9495f4e7-1af6-3eed-95af-aa34ef78b7cb","version":342,"action":"UPDATE"},{"gtasId":"16843841","tamrId":"36331cfd-cdc8-326f-a0e3-44982389320f","version":342,"action":"UPDATE"},{"gtasId":"12418033","tamrId":"c98fd1d3-a6fb-3fba-9cb5-8b007f622b45","version":342,"action":"UPDATE"},{"gtasId":"21013519","tamrId":"53ad91d6-159e-3fe5-81a4-e933f1b2caeb","version":342,"action":"UPDATE"},{"gtasId":"2158353","tamrId":"f673dde4-181d-3f9a-a87f-6365b8d824d0","version":342,"action":"UPDATE"},{"gtasId":"21964784","tamrId":"f186c303-b15e-3570-ba11-787e314656b9","version":342,"action":"UPDATE"},{"gtasId":"4879418","tamrId":"e5c4ae50-6f2d-378e-9f58-ae2dba2c95d2","version":342,"action":"UPDATE"},{"gtasId":"14326366","tamrId":"a07b64dc-bbc2-316f-acbc-edbdf8650f62","version":342,"action":"UPDATE"},{"gtasId":"4763141","tamrId":"8d669df4-0e07-37b3-980e-727c921579e5","version":342,"action":"UPDATE"},{"gtasId":"14408861","tamrId":"1b2283ad-c75c-3f68-91ae-662945f768b3","version":342,"action":"UPDATE"},{"gtasId":"14844984","tamrId":"7e9e9d23-866e-3942-901d-5be183ecde1c","version":342,"action":"UPDATE"},{"gtasId":"4916809","tamrId":"d93330bf-231b-3cf9-81fc-0e74e2645350","version":342,"action":"UPDATE"},{"gtasId":"669311","tamrId":"3f5bc688-2c4f-39a2-94f1-880fb6181adb","version":342,"action":"UPDATE"},{"gtasId":"10123034","tamrId":"eca04778-3e88-3606-83ca-5c6943bd638a","version":342,"action":"UPDATE"},{"gtasId":"19844522","tamrId":"9f0293bc-adbf-38fe-ac72-cfb8c879304a","version":342,"action":"UPDATE"},{"gtasId":"3528039","tamrId":"6e351dfe-7b3a-3ef3-a918-abcd176fc4ad","version":342,"action":"UPDATE"},{"gtasId":"4057730","tamrId":"03e73275-c58f-3c8b-81e5-cae19f9ffe30","version":342,"action":"UPDATE"},{"gtasId":"14224453","tamrId":"6942c8b4-e547-3e22-873a-24704a73956d","version":342,"action":"UPDATE"},{"gtasId":"5838685","tamrId":"310c9a8a-8d66-35eb-931f-ecbc46e05190","version":342,"action":"UPDATE"},{"gtasId":"16536804","tamrId":"4e985b21-6f65-355d-a980-180e64f2d4f1","version":342,"action":"UPDATE"},{"gtasId":"1854565","tamrId":"29a68053-0dd0-3018-8283-bfa4b066a001","version":342,"action":"UPDATE"},{"gtasId":"17033626","tamrId":"fcce25aa-ad85-3ada-b2c6-a6cd0d18db0b","version":342,"action":"UPDATE"},{"gtasId":"21219799","tamrId":"b90995e3-2785-3c66-9e2f-7e30ac5c331f","version":342,"action":"UPDATE"},{"gtasId":"13086837","tamrId":"7e260a57-8743-3ac0-a4a9-ff3335d50a34","version":342,"action":"UPDATE"},{"gtasId":"11038525","tamrId":"3457abbf-0d09-3455-8d27-ab33ac791071","version":342,"action":"UPDATE"},{"gtasId":"22189330","tamrId":"44f9bcd9-292f-3ea9-8519-47908fa756d2","version":342,"action":"UPDATE"},{"gtasId":"3258855","tamrId":"19e0f178-8e0b-349e-9104-8fea7ca9fc14","version":342,"action":"UPDATE"},{"gtasId":"23220972","tamrId":"affe567a-4b0c-3441-a579-66d1a3f705ac","version":342,"action":"UPDATE"},{"gtasId":"17544272","tamrId":"8c71217a-afd6-345f-a121-12d51dfa64fc","version":342,"action":"UPDATE"},{"gtasId":"14429796","tamrId":"e7d93bcd-f12d-3d06-bf4f-958078a30af6","version":342,"action":"UPDATE"},{"gtasId":"21931873","tamrId":"e6e24bce-dc53-325f-8224-9cc640c470b2","version":342,"action":"UPDATE"},{"gtasId":"8169818","tamrId":"da3b5fe1-a61a-307e-936e-c2882459bf97","version":342,"action":"UPDATE"},{"gtasId":"8716530","tamrId":"eaaabcee-189e-38f2-94b4-ca6fee73c09a","version":342,"action":"UPDATE"},{"gtasId":"22864026","tamrId":"b96dec91-3065-36f0-929d-390fc7b6b150","version":342,"action":"UPDATE"},{"gtasId":"8527190","tamrId":"90f22b1e-c50e-3096-aaf6-b541d24ebd80","version":342,"action":"UPDATE"},{"gtasId":"21413349","tamrId":"4428c27d-574c-3b30-acab-d819499bde65","version":342,"action":"UPDATE"},{"gtasId":"1419659","tamrId":"0748a5c1-6e70-38c1-872d-705948a3f337","version":342,"action":"UPDATE"},{"gtasId":"21310788","tamrId":"00d1dfd5-040b-362d-ac87-b5e3c962c025","version":342,"action":"UPDATE"},{"gtasId":"8418957","tamrId":"8d353cd6-752e-38b3-86e6-22c079fd16c2","version":342,"action":"UPDATE"},{"gtasId":"451552","tamrId":"068d5300-ee91-3bad-bc46-b15bc6d62566","version":342,"action":"UPDATE"},{"gtasId":"6007679","tamrId":"ff2d65bc-9170-3c89-a575-c1cb7b6177fa","version":342,"action":"UPDATE"},{"gtasId":"25136308","tamrId":"929b3f66-b390-3041-be4a-1f57d3320ead","version":342,"action":"UPDATE"},{"gtasId":"8103141","tamrId":"2cb13703-c13d-31eb-8404-680fc7496fee","version":342,"action":"UPDATE"},{"gtasId":"12327690","tamrId":"e4d550b3-b983-3957-bdf2-9ffe4cdd2ef0","version":342,"action":"UPDATE"},{"gtasId":"8896180","tamrId":"389cb62d-166a-30fc-9a0a-803331229cf4","version":342,"action":"UPDATE"},{"gtasId":"12788357","tamrId":"0e60c9ec-70e0-3d6e-84bd-67828b212f09","version":342,"action":"UPDATE"},{"gtasId":"11776833","tamrId":"7cd49946-225b-3b54-a576-7267a1e62d7f","version":342,"action":"UPDATE"},{"gtasId":"10824748","tamrId":"e3e2b653-c4a2-3eb9-8984-2a3ddf09d159","version":342,"action":"UPDATE"},{"gtasId":"4078609","tamrId":"fdb60455-0080-3cdb-be3d-6eb7b9c9cc7d","version":342,"action":"UPDATE"},{"gtasId":"8573049","tamrId":"788b8fe1-599b-3956-b08d-41b7f5bfb0cd","version":342,"action":"UPDATE"},{"gtasId":"8975374","tamrId":"90a7c89c-ae6f-34d6-bddf-06da72f7088e","version":342,"action":"UPDATE"},{"gtasId":"13989553","tamrId":"210e9602-840b-3822-8446-3297b0095539","version":342,"action":"UPDATE"},{"gtasId":"17493707","tamrId":"ec8efa4c-b234-32ff-be72-ef73bae8c584","version":342,"action":"UPDATE"},{"gtasId":"14981480","tamrId":"e8cbefb4-ca53-3baf-aa7e-dffcc159ff05","version":342,"action":"UPDATE"},{"gtasId":"21232790","tamrId":"5f39c029-8d0d-3843-a845-fce354641de9","version":342,"action":"UPDATE"},{"gtasId":"17318365","tamrId":"7cb0bdf6-2490-3c8f-8188-5f622729fd94","version":342,"action":"UPDATE"},{"gtasId":"1978039","tamrId":"4f4f7155-c78e-3250-85eb-9d717b647dcf","version":342,"action":"UPDATE"},{"gtasId":"9808696","tamrId":"8624a791-08d5-3608-acc0-de0170fb9548","version":342,"action":"UPDATE"},{"gtasId":"24049993","tamrId":"d1c04a1f-b4da-3f47-af8e-6b34cb239289","version":342,"action":"UPDATE"},{"gtasId":"22418335","tamrId":"342f911e-eae9-31f5-8801-ab21b69805df","version":342,"action":"UPDATE"},{"gtasId":"2918636","tamrId":"21814161-ccdc-3d52-b6ae-6a76b934715d","version":342,"action":"UPDATE"},{"gtasId":"8930470","tamrId":"482ebbd1-99e3-3e41-8bd9-6a97e8cc3664","version":342,"action":"UPDATE"},{"gtasId":"8946819","tamrId":"2afe6c80-8d8c-3d97-a213-54be835ef573","version":342,"action":"UPDATE"},{"gtasId":"16569734","tamrId":"1532276a-ad4b-3622-8fd7-9f968ca047cf","version":342,"action":"UPDATE"},{"gtasId":"551074","tamrId":"21851c00-8619-39db-99a0-111db1de8451","version":342,"action":"UPDATE"},{"gtasId":"9905768","tamrId":"aff7200d-94b7-3235-89c8-c04b9b386680","version":342,"action":"UPDATE"},{"gtasId":"1958434","tamrId":"94d30dd3-f529-39fb-bb78-caffbf93f183","version":342,"action":"UPDATE"},{"gtasId":"19534861","tamrId":"1dd943f7-46a7-3ad9-b98b-ac7323082fea","version":342,"action":"UPDATE"},{"gtasId":"19409715","tamrId":"8c25cfd4-ccaf-3958-a860-c92241efa375","version":342,"action":"UPDATE"},{"gtasId":"4095189","tamrId":"e05eb603-05cb-370e-825c-76df7bf7900e","version":342,"action":"UPDATE"},{"gtasId":"15804408","tamrId":"d9b16edb-c8fe-3008-9695-cbe7fba66bb2","version":342,"action":"UPDATE"},{"gtasId":"24127048","tamrId":"42161f90-bd75-38a2-aeef-298b1a77566d","version":342,"action":"UPDATE"},{"gtasId":"15722322","tamrId":"e2367d50-751e-3f3e-98b6-b3e5a9547da5","version":342,"action":"UPDATE"},{"gtasId":"12513595","tamrId":"2161cb9a-98c2-3227-96ea-b1c751a5228e","version":342,"action":"UPDATE"},{"gtasId":"8339646","tamrId":"67b47ab2-d44b-3e90-8f68-9d63eb456926","version":342,"action":"UPDATE"},{"gtasId":"9341349","tamrId":"0cb727ac-2bd5-3596-9fc8-58d10f60c289","version":342,"action":"UPDATE"},{"gtasId":"6102093","tamrId":"898dec57-352b-36a3-8385-0d1d9261e8fe","version":342,"action":"UPDATE"},{"gtasId":"12421651","tamrId":"0586bf9f-1470-344f-a823-927331c98ad6","version":342,"action":"UPDATE"},{"gtasId":"20377629","tamrId":"175567f9-ffaa-3297-a361-4f6a3465d013","version":342,"action":"UPDATE"},{"gtasId":"2032409","tamrId":"df729483-8bbf-3383-a92f-ed99b3986437","version":342,"action":"UPDATE"},{"gtasId":"22313306","tamrId":"992f901b-ca60-3009-b37d-a24326e29e13","version":342,"action":"UPDATE"},{"gtasId":"19580753","tamrId":"8c99010b-fb76-3110-b985-f813a8f3bb1f","version":342,"action":"UPDATE"},{"gtasId":"10070891","tamrId":"8ec7b600-9537-324f-a1fb-c190764f3f00","version":342,"action":"UPDATE"},{"gtasId":"7871010","tamrId":"42038561-dfa6-3804-a052-8a9be9c3693b","version":342,"action":"UPDATE"},{"gtasId":"18762859","tamrId":"cd113d35-1a4f-34ae-a4ea-b047ac40e3f4","version":342,"action":"UPDATE"},{"gtasId":"6899000","tamrId":"3018fadd-0b5d-3219-820d-4d8c1b1fbcb8","version":342,"action":"UPDATE"},{"gtasId":"23755537","tamrId":"072575e1-9b5d-3ea5-a4e6-6b3f5f6f838a","version":342,"action":"UPDATE"},{"gtasId":"2228008","tamrId":"1cdef8e4-b862-36e6-9873-3f0a39639882","version":342,"action":"UPDATE"},{"gtasId":"1958404","tamrId":"93f64036-1710-35d9-a560-a5c04e8083ee","version":342,"action":"UPDATE"},{"gtasId":"1829599","tamrId":"4d1004b1-e057-34e5-9bf3-b9f2593369d1","version":342,"action":"UPDATE"},{"gtasId":"13609828","tamrId":"46c2764a-a63e-37aa-a963-a11445b247cf","version":342,"action":"UPDATE"},{"gtasId":"13517363","tamrId":"835281ac-be6c-3743-82e9-7ffcdea3ffb0","version":342,"action":"UPDATE"},{"gtasId":"1209066","tamrId":"72cc9a0c-3350-339f-82a2-8ed1f8a5ab21","version":342,"action":"UPDATE"},{"gtasId":"10559567","tamrId":"7d507a37-3137-3495-ab7f-ef6d2d11ee50","version":342,"action":"UPDATE"},{"gtasId":"11027829","tamrId":"b5601127-c326-3d65-b376-51d7cf1124a1","version":342,"action":"UPDATE"},{"gtasId":"21561115","tamrId":"e38cf21e-213c-31ff-8a37-4e8dd992300f","version":342,"action":"UPDATE"},{"gtasId":"5448349","tamrId":"b09163bc-c0b4-350e-ac08-47c296fd7363","version":342,"action":"UPDATE"},{"gtasId":"12718770","tamrId":"84f58012-0893-3002-967d-7d31f7353ef8","version":342,"action":"UPDATE"},{"gtasId":"16526032","tamrId":"0fe75e62-fd05-3df4-a6e5-d7905c0d7e5e","version":342,"action":"UPDATE"},{"gtasId":"9755692","tamrId":"818ed556-af48-37ea-ab8e-18cf67ac55f5","version":342,"action":"UPDATE"},{"gtasId":"16408883","tamrId":"df5aa4bd-0ded-3d09-8747-3f79a56a0db8","version":342,"action":"UPDATE"},{"gtasId":"19012725","tamrId":"d1102669-4608-372a-89be-ed322187dd73","version":342,"action":"UPDATE"},{"gtasId":"21035743","tamrId":"6b3c764a-a977-3f1c-bfbf-edbd1d290669","version":342,"action":"UPDATE"},{"gtasId":"8402553","tamrId":"bee05d5e-6036-3b43-b472-c0f6e34ae1bd","version":342,"action":"UPDATE"},{"gtasId":"5734171","tamrId":"08dad6ad-d811-3c7d-b415-83069f420b57","version":342,"action":"UPDATE"},{"gtasId":"3470229","tamrId":"de87c1e8-7741-31ff-8484-eda9ca59d50e","version":342,"action":"UPDATE"},{"gtasId":"24610975","tamrId":"d9d9ce63-e9d8-3f08-8bb3-7d771fb28eeb","version":342,"action":"UPDATE"},{"gtasId":"1425478","tamrId":"925c39b2-3960-3de3-adaa-2a7f7185680b","version":342,"action":"UPDATE"},{"gtasId":"13330239","tamrId":"d97b1438-a581-3beb-8f24-4d1385aef5f4","version":342,"action":"UPDATE"},{"gtasId":"11822501","tamrId":"648fa6f3-67b0-321d-80d4-f2419c8d7899","version":342,"action":"UPDATE"},{"gtasId":"9166579","tamrId":"394cc0e0-13a8-3c0d-b7f5-82f417d31464","version":342,"action":"UPDATE"},{"gtasId":"12080463","tamrId":"aaf6b703-9cb9-33b3-b81f-5457d5f62208","version":342,"action":"UPDATE"},{"gtasId":"14292527","tamrId":"3c053d79-256d-3a62-a025-38425527d17b","version":342,"action":"UPDATE"},{"gtasId":"16594744","tamrId":"fee269e6-919e-34c5-b681-ee8faf0698b9","version":342,"action":"UPDATE"},{"gtasId":"10623974","tamrId":"2a771702-22a7-3841-b893-8b3bd2a22568","version":342,"action":"UPDATE"},{"gtasId":"961828","tamrId":"5ef48ce3-1f1b-35f7-9bc8-5f5e66a7c460","version":342,"action":"UPDATE"},{"gtasId":"21966578","tamrId":"e175d903-f114-30ba-ab98-27a88cebd01f","version":342,"action":"UPDATE"},{"gtasId":"23583975","tamrId":"fa294904-05fe-3f7b-ba0d-496f3b269dbf","version":342,"action":"UPDATE"},{"gtasId":"14715404","tamrId":"439f849c-e6c0-32ff-9648-6eb90c1847bc","version":342,"action":"UPDATE"},{"gtasId":"11795965","tamrId":"90a81b0a-0f29-3ad6-89b8-e6f1ed21ce2a","version":342,"action":"UPDATE"},{"gtasId":"7045291","tamrId":"cc975bf3-6d9b-3e52-b7dd-d8754f2ea195","version":342,"action":"UPDATE"},{"gtasId":"7564307","tamrId":"6f397f9d-220c-3c09-b66f-63e2738f0700","version":342,"action":"UPDATE"},{"gtasId":"13512493","tamrId":"c963b50f-e72d-30d0-96e3-d70930be5648","version":342,"action":"UPDATE"},{"gtasId":"7456519","tamrId":"9004e347-3d4b-3cb7-ba9c-fb36de5f9320","version":342,"action":"UPDATE"},{"gtasId":"7023008","tamrId":"dfb793b1-2495-3e3e-963c-748fa1072b0f","version":342,"action":"UPDATE"},{"gtasId":"12620886","tamrId":"b676f8c0-226d-3e96-8e31-864bc7701145","version":342,"action":"UPDATE"},{"gtasId":"22624701","tamrId":"0438e96b-c33d-3590-a1fb-a315889cb0c9","version":342,"action":"UPDATE"},{"gtasId":"22411735","tamrId":"bff1c914-0b7a-3058-a67c-3e56bb8549dc","version":342,"action":"UPDATE"},{"gtasId":"4785327","tamrId":"00b27e34-5176-3285-baa3-6803506e8373","version":342,"action":"UPDATE"},{"gtasId":"493330","tamrId":"29024fd2-a328-3e97-aac8-68cf9bbe8e7c","version":342,"action":"UPDATE"},{"gtasId":"20363823","tamrId":"deb54c54-f3e5-3d8c-ac9e-5cf5312796d4","version":342,"action":"UPDATE"},{"gtasId":"5619055","tamrId":"a392acd8-0a84-3e20-8c77-841e1cc6916c","version":342,"action":"UPDATE"},{"gtasId":"11609881","tamrId":"7d0bd236-7ebb-3211-baa5-0d4436f2f815","version":342,"action":"UPDATE"},{"gtasId":"7072880","tamrId":"0defc518-93e2-3001-b4df-f648f154166e","version":342,"action":"UPDATE"},{"gtasId":"5760485","tamrId":"9fe83c61-5f59-32d3-91a2-437fcc68d316","version":342,"action":"UPDATE"},{"gtasId":"8615067","tamrId":"545a0f25-9220-3d54-9bd3-1a2ba91e1287","version":342,"action":"UPDATE"},{"gtasId":"16685183","tamrId":"a1322721-6828-3075-8675-c9211969f92b","version":342,"action":"UPDATE"},{"gtasId":"24549815","tamrId":"91c50a63-12b1-3e03-9725-afc82f6b64bc","version":342,"action":"UPDATE"},{"gtasId":"6602805","tamrId":"bc62984f-5557-39bf-ba79-5a02d4c50188","version":342,"action":"UPDATE"},{"gtasId":"6626818","tamrId":"5337752d-82b5-3403-bd5b-0d490e2fb130","version":342,"action":"UPDATE"},{"gtasId":"2602679","tamrId":"ad47f41b-5ea1-376d-a581-c37c92d9a2ea","version":342,"action":"UPDATE"},{"gtasId":"4887001","tamrId":"59b4aa23-4cfb-3014-83cd-323f45e8b7df","version":342,"action":"UPDATE"},{"gtasId":"4055954","tamrId":"7ec22352-a9a1-36b7-b90c-85243f8f5184","version":342,"action":"UPDATE"},{"gtasId":"1708533","tamrId":"2fcc966f-28da-34e9-95b0-c3fbd038227b","version":342,"action":"UPDATE"},{"gtasId":"24464486","tamrId":"d8fd3f88-8ff2-30a8-8bec-167e4e60f9fe","version":342,"action":"UPDATE"},{"gtasId":"11912440","tamrId":"8beaaf4b-2b30-3f5f-809b-abea26410f0f","version":342,"action":"UPDATE"},{"gtasId":"12328169","tamrId":"1ea455bf-322b-3af2-969f-7f110777cdd4","version":342,"action":"UPDATE"},{"gtasId":"23154804","tamrId":"47f1927d-4710-3681-b1d5-f643c815f240","version":342,"action":"UPDATE"},{"gtasId":"696060","tamrId":"53ccacc5-8da4-34c3-97fc-be9c955754c6","version":342,"action":"UPDATE"},{"gtasId":"6319866","tamrId":"462b006d-6990-33fd-97e0-26598f3b47fc","version":342,"action":"UPDATE"},{"gtasId":"16998241","tamrId":"ca81ac90-9dbc-38d2-97b2-e48a00c4aa6a","version":342,"action":"UPDATE"},{"gtasId":"22818951","tamrId":"66d0d79e-b39c-39ba-a5cc-881a62d559ae","version":342,"action":"UPDATE"},{"gtasId":"20862497","tamrId":"10e79173-70bc-3cbf-88ea-cb4bc360c60c","version":342,"action":"UPDATE"},{"gtasId":"6885204","tamrId":"31689c65-fbfa-3a31-829a-dd7f2927d32a","version":342,"action":"UPDATE"},{"gtasId":"4506014","tamrId":"091b852c-4725-3d5d-bd18-a35ee850ded9","version":342,"action":"UPDATE"},{"gtasId":"1538249","tamrId":"d88b9c59-851c-346e-8069-d08a249a25e5","version":342,"action":"UPDATE"},{"gtasId":"2427651","tamrId":"8fe8f310-2da4-3870-9b3c-f776ada5a03b","version":342,"action":"UPDATE"},{"gtasId":"22581139","tamrId":"8d6eaf3a-680c-3b69-b785-49b8a6534deb","version":342,"action":"UPDATE"},{"gtasId":"7377521","tamrId":"b27534e2-370f-33d4-a377-bf109d3a787a","version":342,"action":"UPDATE"},{"gtasId":"10371153","tamrId":"c472bfdf-6c04-3b18-9c7a-6993e8d15c7f","version":342,"action":"UPDATE"},{"gtasId":"14852513","tamrId":"e41e8e56-9479-3619-a035-9cc6766f5a0c","version":342,"action":"UPDATE"},{"gtasId":"20631880","tamrId":"3129c77d-284a-3ec3-8270-ddd82fbd555e","version":342,"action":"UPDATE"},{"gtasId":"5924253","tamrId":"4cc75b1e-b552-33fb-bd15-fd7b25fd7a75","version":342,"action":"UPDATE"},{"gtasId":"20329961","tamrId":"f2ff24cd-9269-383b-9d03-d63b04fa99d8","version":342,"action":"UPDATE"},{"gtasId":"5129355","tamrId":"14c7ab6b-e2e7-3f0e-88f5-11ba0c2938fd","version":342,"action":"UPDATE"},{"gtasId":"21736215","tamrId":"ffbbd3f3-3a4b-331f-9b4b-354c1ad49022","version":342,"action":"UPDATE"},{"gtasId":"1601121","tamrId":"fd1f966f-0aa5-34e4-be21-df1f7aedbaa4","version":342,"action":"UPDATE"},{"gtasId":"6808243","tamrId":"2568f363-a359-393a-adb4-dad445503048","version":342,"action":"UPDATE"},{"gtasId":"20456694","tamrId":"5eb0f238-1ded-3d3d-ae5f-9cb9ed60088f","version":342,"action":"UPDATE"},{"gtasId":"8339661","tamrId":"643cbbcc-eca3-3622-ad7d-7c7c2877295d","version":342,"action":"UPDATE"},{"gtasId":"8623503","tamrId":"caa449a0-b994-37c7-afc8-1d2793193f5f","version":342,"action":"UPDATE"},{"gtasId":"22634961","tamrId":"7caaa25b-cb7e-3402-9ad5-d7a05abc946c","version":342,"action":"UPDATE"},{"gtasId":"15946444","tamrId":"9aa8ba44-e4e3-33b3-b12a-21123b10df9e","version":342,"action":"UPDATE"},{"gtasId":"7174131","tamrId":"8f5be2fe-cff6-369d-881b-c768a0bdf355","version":342,"action":"UPDATE"},{"gtasId":"2507304","tamrId":"54038583-fac0-388e-a532-208dd9565fb8","version":342,"action":"UPDATE"},{"gtasId":"16804298","tamrId":"308159db-05de-39e8-9e1c-03fa45b55590","version":342,"action":"UPDATE"},{"gtasId":"12008906","tamrId":"cb104241-3349-3fc8-a380-0c458766fcc9","version":342,"action":"UPDATE"},{"gtasId":"13641102","tamrId":"1131a28e-d545-3de9-aa81-d964edfe778d","version":342,"action":"UPDATE"},{"gtasId":"2268077","tamrId":"cecb1f9d-1fc0-35bc-b5ab-cae6b4315fba","version":342,"action":"UPDATE"},{"gtasId":"23313146","tamrId":"4dc80846-42a4-39b8-928a-c5b3212c9a38","version":342,"action":"UPDATE"},{"gtasId":"22920585","tamrId":"cf54c491-a903-3e6a-98b4-e1d9ca2bf09a","version":342,"action":"UPDATE"},{"gtasId":"15095758","tamrId":"89828b32-ff8b-3b55-a5e4-2916867f0036","version":342,"action":"UPDATE"},{"gtasId":"4102935","tamrId":"f227857f-b450-36ad-9949-08ffa93204a8","version":342,"action":"UPDATE"},{"gtasId":"3472830","tamrId":"13341dd1-bd36-3287-9f09-94938734ac82","version":342,"action":"UPDATE"},{"gtasId":"10621359","tamrId":"390bc04f-0795-3ec9-8ebf-f55984769f20","version":342,"action":"UPDATE"},{"gtasId":"9727876","tamrId":"d4350ae7-dfe5-3c8b-9b3f-0a5a71b791a6","version":342,"action":"UPDATE"},{"gtasId":"727412","tamrId":"90663cbd-d15d-3166-882a-a75b471ef011","version":342,"action":"UPDATE"},{"gtasId":"18316316","tamrId":"e1676121-a90b-3c3c-9f49-68d6dfb21762","version":342,"action":"UPDATE"},{"gtasId":"7876754","tamrId":"50e872ac-74b7-33d5-b58b-862e247be552","version":342,"action":"UPDATE"},{"gtasId":"16388806","tamrId":"dbc44908-aae2-3058-b838-22ceb1490f84","version":342,"action":"UPDATE"},{"gtasId":"3945140","tamrId":"29728481-84d5-3e25-b0c1-1008d914fe09","version":342,"action":"UPDATE"},{"gtasId":"23474249","tamrId":"63024397-60bf-3e22-8075-b9e52b61f7d9","version":342,"action":"UPDATE"},{"gtasId":"9350256","tamrId":"ed26cdcf-8894-3dce-ad0b-df0ff7dbc428","version":342,"action":"UPDATE"},{"gtasId":"14607029","tamrId":"e2325f78-5d61-3eb1-b225-c8b4a637fd15","version":342,"action":"UPDATE"},{"gtasId":"9884349","tamrId":"472f7736-7177-35e5-b481-c95702a2dc66","version":342,"action":"UPDATE"},{"gtasId":"19923999","tamrId":"1c558011-be40-3f74-be9a-179e5ede165b","version":342,"action":"UPDATE"},{"gtasId":"21505886","tamrId":"6b3cf72c-663c-332d-9913-db2316ce12d5","version":342,"action":"UPDATE"},{"gtasId":"7946213","tamrId":"cf5da2b2-b2eb-3fd1-8068-3a326af41651","version":342,"action":"UPDATE"},{"gtasId":"481303","tamrId":"9c132a0b-945a-3c2d-b092-9433616a3d49","version":342,"action":"UPDATE"},{"gtasId":"19908358","tamrId":"5c7fb7e8-bed7-3143-8c4c-c060fb9a685d","version":342,"action":"UPDATE"},{"gtasId":"3061580","tamrId":"cecd3622-2319-36bb-a99f-85881e78f48c","version":342,"action":"UPDATE"},{"gtasId":"9050875","tamrId":"fdcc7edc-13f0-344f-8da8-882fb50d304b","version":342,"action":"UPDATE"},{"gtasId":"6617065","tamrId":"cf56af74-3c6f-3f60-aab9-b4f4f5273c00","version":342,"action":"UPDATE"},{"gtasId":"23088061","tamrId":"eee3a73d-423f-30b2-bc2b-d1a57f25fc95","version":342,"action":"UPDATE"},{"gtasId":"23570687","tamrId":"51fa82be-ce14-3fba-adbc-4fa9c61a4d50","version":342,"action":"UPDATE"},{"gtasId":"9568042","tamrId":"5c95ab7c-f16a-38c1-8f2b-7a4fd05ee980","version":342,"action":"UPDATE"},{"gtasId":"20779126","tamrId":"933dc1a3-eb45-32fc-811a-18560bbf89f9","version":342,"action":"UPDATE"},{"gtasId":"9821610","tamrId":"f43a9d9a-9847-3f89-be79-ef4da403b320","version":342,"action":"UPDATE"},{"gtasId":"14643558","tamrId":"c8707c19-93cf-37bd-8037-b2ce6939fa6b","version":342,"action":"UPDATE"},{"gtasId":"2316198","tamrId":"1bb876dd-f298-3837-bacc-ab59f7257570","version":342,"action":"UPDATE"},{"gtasId":"5332631","tamrId":"8c4e3c0e-ca81-3d3f-a3c9-cd22caea812f","version":342,"action":"UPDATE"},{"gtasId":"12663159","tamrId":"0bacfa0d-7490-35fe-bb70-d51dbe50cae8","version":342,"action":"UPDATE"},{"gtasId":"23184696","tamrId":"4f80a427-8822-30f8-9c14-99c61b5d6b16","version":342,"action":"UPDATE"},{"gtasId":"24947812","tamrId":"bcda71ff-214e-348a-b95b-92aa4098bfb6","version":342,"action":"UPDATE"},{"gtasId":"13865641","tamrId":"d16203c3-3968-3e36-a2fc-1b1dbca19791","version":342,"action":"UPDATE"},{"gtasId":"2071165","tamrId":"6caa0279-9412-38b0-b285-d2e441b01659","version":342,"action":"UPDATE"},{"gtasId":"20988131","tamrId":"3b5ebc5d-663f-3f24-9a2a-60ddc72b740c","version":342,"action":"UPDATE"},{"gtasId":"24985299","tamrId":"c76ef513-e632-3ca8-a78e-b0e8baf05d0e","version":342,"action":"UPDATE"},{"gtasId":"15808879","tamrId":"660d7fc1-a722-3ec3-8b2b-2aff56ea9dc2","version":342,"action":"UPDATE"},{"gtasId":"4890623","tamrId":"ccd2717a-799c-33ea-9261-ae7ab18c8d1d","version":342,"action":"UPDATE"},{"gtasId":"15254049","tamrId":"d983a2d7-2048-3ed6-b156-ccbb4fc84875","version":342,"action":"UPDATE"},{"gtasId":"2169859","tamrId":"0dcb0fe6-5ea7-335a-9e95-2b7a41b15c58","version":342,"action":"UPDATE"},{"gtasId":"2638805","tamrId":"3ffd740c-c406-3cb1-91a0-f190ac3d1bb2","version":342,"action":"UPDATE"},{"gtasId":"12337050","tamrId":"0879ce94-18e8-3d3f-98cb-c6ee57e59f18","version":342,"action":"UPDATE"},{"gtasId":"17243370","tamrId":"48123206-6687-34f9-9d09-af6687c20d52","version":342,"action":"UPDATE"},{"gtasId":"4647727","tamrId":"de373bf9-edc5-3aa2-bc7f-9ec27aa0caf8","version":342,"action":"UPDATE"},{"gtasId":"23780542","tamrId":"e3e5a8a2-7287-3137-b635-81fe67ebe730","version":342,"action":"UPDATE"},{"gtasId":"13935786","tamrId":"f2851405-7af9-362c-b068-39fe231951ea","version":342,"action":"UPDATE"},{"gtasId":"8048921","tamrId":"fcdef62a-7bff-3529-a374-53941b92d9df","version":342,"action":"UPDATE"},{"gtasId":"4085986","tamrId":"7ae1651c-8186-3b21-931d-66b4152c16b0","version":342,"action":"UPDATE"},{"gtasId":"23323265","tamrId":"d4db9b9a-7e0e-3e6a-aadf-06dd2ecb6c0f","version":342,"action":"UPDATE"},{"gtasId":"6316096","tamrId":"e62bc822-570e-3414-9b32-284e5bc9bd08","version":342,"action":"UPDATE"},{"gtasId":"16734735","tamrId":"316309b3-cc5f-3877-ae97-ffc5e5d5fdda","version":342,"action":"UPDATE"},{"gtasId":"1535040","tamrId":"eb7749b7-7824-38d4-8726-46d5ca73a6f5","version":342,"action":"UPDATE"},{"gtasId":"13553095","tamrId":"ed371983-7998-3b7a-89df-67faee6a30e3","version":342,"action":"UPDATE"},{"gtasId":"22266721","tamrId":"72482928-e76c-3ac6-a761-0f37661965d0","version":342,"action":"UPDATE"},{"gtasId":"3411778","tamrId":"9f40d213-986f-3ee9-aad3-6bbd9be1f6fc","version":342,"action":"UPDATE"},{"gtasId":"18877140","tamrId":"677cb115-3651-37bc-9356-46a684bc4840","version":342,"action":"UPDATE"},{"gtasId":"14644866","tamrId":"ce855168-da56-34a0-8b82-8aa429f686ca","version":342,"action":"UPDATE"},{"gtasId":"24677844","tamrId":"3f3d3c1e-9a1b-393b-8e72-c038825fb78f","version":342,"action":"UPDATE"},{"gtasId":"12336655","tamrId":"73ede877-1c20-3aed-b23a-a9f8196afc5a","version":342,"action":"UPDATE"},{"gtasId":"4507515","tamrId":"15581b1d-5ef9-3061-9b53-7c838cc34724","version":342,"action":"UPDATE"},{"gtasId":"13893612","tamrId":"9369b1ec-e600-3fe5-9ed6-11f271e337f8","version":342,"action":"UPDATE"},{"gtasId":"2048025","tamrId":"f85ad58f-1822-3364-b363-9b43aaacd057","version":342,"action":"UPDATE"},{"gtasId":"21612115","tamrId":"6d3a77b7-fd7c-3df3-b98d-364f01207de1","version":342,"action":"UPDATE"},{"gtasId":"16673248","tamrId":"589263bf-f09d-368a-b1b3-0ab0f5b3e5c9","version":342,"action":"UPDATE"},{"gtasId":"21305540","tamrId":"ef113528-236c-3ab2-86de-384bdb105d84","version":342,"action":"UPDATE"},{"gtasId":"14599744","tamrId":"631b4b2f-c751-36a7-b927-25a207064f64","version":342,"action":"UPDATE"},{"gtasId":"16800562","tamrId":"e2c2169a-f51f-3477-9ba8-84769482fd9e","version":342,"action":"UPDATE"},{"gtasId":"10339845","tamrId":"09d39c22-0d42-3f6d-bef9-29505d3310d1","version":342,"action":"UPDATE"},{"gtasId":"2564005","tamrId":"f11cd335-7e2b-38f3-bae5-578eff9620f8","version":342,"action":"UPDATE"},{"gtasId":"14357636","tamrId":"643354be-6c06-3b4d-bc3d-85eb6d670cec","version":342,"action":"UPDATE"},{"gtasId":"10900760","tamrId":"87221451-0f59-3bcc-acc3-d1ff5aa252e7","version":342,"action":"UPDATE"},{"gtasId":"15029540","tamrId":"43b7a29c-212f-3163-ac1a-3ba20806b422","version":342,"action":"UPDATE"},{"gtasId":"23828006","tamrId":"bf0ef402-37a7-3c5a-9902-11ea43ff7d90","version":342,"action":"UPDATE"},{"gtasId":"8674334","tamrId":"04b547ab-1371-32d2-a712-176d9a45997e","version":342,"action":"UPDATE"},{"gtasId":"8444240","tamrId":"9dd0bfd3-5b30-3b30-9be3-7686c0c3c6a7","version":342,"action":"UPDATE"},{"gtasId":"6996131","tamrId":"f82e32dc-6007-332d-ba56-10a222c035be","version":342,"action":"UPDATE"},{"gtasId":"20403323","tamrId":"be8db6be-701e-3f87-a96d-81e48b4e46f4","version":342,"action":"UPDATE"},{"gtasId":"8387131","tamrId":"f483bfa9-b826-3671-bbf2-c827631a18f8","version":342,"action":"UPDATE"},{"gtasId":"22122045","tamrId":"eba74bf6-a21d-3fb7-9651-2e6bf8fc95b6","version":342,"action":"UPDATE"},{"gtasId":"6595141","tamrId":"f3f0a1ff-7feb-3c12-9551-05c5b50dc5a6","version":342,"action":"UPDATE"},{"gtasId":"8477178","tamrId":"7dc837c6-0e4d-3a3d-836a-521be68e9731","version":342,"action":"UPDATE"},{"gtasId":"8604486","tamrId":"a04db1a1-afa6-3427-a752-4056ef5a92c8","version":342,"action":"UPDATE"},{"gtasId":"24249245","tamrId":"c3f4b9ce-9c5e-367f-8eee-9800a7be9902","version":342,"action":"UPDATE"},{"gtasId":"3111219","tamrId":"94d1d837-25b6-3c64-b3c9-3332fa65514b","version":342,"action":"UPDATE"},{"gtasId":"4714976","tamrId":"91ea7829-9787-3736-be75-039426ccdc14","version":342,"action":"UPDATE"},{"gtasId":"7482086","tamrId":"9953479e-ce9f-3c4a-acdd-6e9c012529be","version":342,"action":"UPDATE"},{"gtasId":"22274326","tamrId":"132fc434-2ba7-3a61-94df-0d55d7245ebb","version":342,"action":"UPDATE"},{"gtasId":"25503166","tamrId":"153e8ab5-1f73-3a96-b3cd-bc0e9e182dda","version":342,"action":"UPDATE"},{"gtasId":"15162160","tamrId":"19f3059c-92d4-3eff-bb18-0bac14d710f8","version":342,"action":"UPDATE"},{"gtasId":"11628202","tamrId":"6d918357-2e28-38dd-a141-3ccafc17529c","version":342,"action":"UPDATE"},{"gtasId":"17977776","tamrId":"fda787b1-89b6-3a30-ae10-d58d9187cced","version":342,"action":"UPDATE"},{"gtasId":"13164094","tamrId":"56e15e46-2e1d-3b58-aecf-611575bf71ee","version":342,"action":"UPDATE"},{"gtasId":"9585257","tamrId":"3f47b809-777c-3039-80c1-513b7fec0938","version":342,"action":"UPDATE"},{"gtasId":"18009413","tamrId":"728614d9-aac9-3a42-8605-038bc0a5ec8b","version":342,"action":"UPDATE"},{"gtasId":"9245790","tamrId":"83aa3d97-8e97-3946-8daa-06a5bea3cd68","version":342,"action":"UPDATE"},{"gtasId":"12933775","tamrId":"a8a5f531-7176-36ab-abdd-76423f606df7","version":342,"action":"UPDATE"},{"gtasId":"2426335","tamrId":"bebfc021-4e6a-3b6c-a4dd-eeb7dc0fe667","version":342,"action":"UPDATE"},{"gtasId":"1295004","tamrId":"f0ff6e9c-f591-3a33-a9a6-6d96f304003a","version":342,"action":"UPDATE"},{"gtasId":"1030276","tamrId":"b6adeb74-81d4-3f7e-bded-63ef588ea50e","version":342,"action":"UPDATE"},{"gtasId":"21784062","tamrId":"aad99e3d-02ca-35e8-b5e6-f70ec17ffd69","version":342,"action":"UPDATE"},{"gtasId":"14482655","tamrId":"61086651-c546-36e7-8428-1710cde6950b","version":342,"action":"UPDATE"},{"gtasId":"2226964","tamrId":"d765a0de-f574-39c5-be55-d97411bc928c","version":342,"action":"UPDATE"},{"gtasId":"18775142","tamrId":"16935c6d-75b7-3a44-bd75-0dcd519ce51f","version":342,"action":"UPDATE"},{"gtasId":"12439955","tamrId":"5b4665a2-cf04-326f-afae-b584f606ad30","version":342,"action":"UPDATE"},{"gtasId":"15625971","tamrId":"06d2b012-23e4-3fd5-910a-3f1113132cfd","version":342,"action":"UPDATE"},{"gtasId":"5417177","tamrId":"6cccd076-de9b-3b79-9486-126b7fbf04a5","version":342,"action":"UPDATE"},{"gtasId":"18606517","tamrId":"9897eed9-2128-3e90-81f0-0895a9d7e1f4","version":342,"action":"UPDATE"},{"gtasId":"11581221","tamrId":"0851bec8-b689-3353-8d23-a35b40a471fc","version":342,"action":"UPDATE"},{"gtasId":"10334197","tamrId":"9033c5e2-1259-3927-a11a-247ee6f36f9b","version":342,"action":"UPDATE"},{"gtasId":"11755227","tamrId":"c609cab3-42ea-3096-8159-510fff9b714f","version":342,"action":"UPDATE"},{"gtasId":"18017044","tamrId":"51ba29df-6677-394c-b6e9-f1e227d6028a","version":342,"action":"UPDATE"},{"gtasId":"443200","tamrId":"c2a4b30c-e770-3be3-8655-107e098ae269","version":342,"action":"UPDATE"},{"gtasId":"21487414","tamrId":"8d3d51df-ed36-37c0-a891-4c101ba85af0","version":342,"action":"UPDATE"},{"gtasId":"25266260","tamrId":"fb1bb202-f041-35ba-8a3f-9dfe343ff63d","version":342,"action":"UPDATE"},{"gtasId":"9957924","tamrId":"187ef2f3-c8b0-303b-8e36-9a46253527d1","version":342,"action":"UPDATE"},{"gtasId":"2257237","tamrId":"fad7a430-80ef-37a9-b7ee-8516d0855192","version":342,"action":"UPDATE"},{"gtasId":"374181","tamrId":"4c2305d3-458c-3892-84b3-2cdd8a17be67","version":342,"action":"UPDATE"},{"gtasId":"11422611","tamrId":"f0fd73b2-c74c-34ca-83c7-c544ed9df932","version":342,"action":"UPDATE"},{"gtasId":"16226328","tamrId":"c7503e92-93ad-3074-bfc3-7889840083ab","version":342,"action":"UPDATE"},{"gtasId":"17853575","tamrId":"b59fcdd1-e855-3e0c-a94f-c5cb51bba7b2","version":342,"action":"UPDATE"},{"gtasId":"10797421","tamrId":"28d4252f-3a5a-33ba-a4e2-c14700be948a","version":342,"action":"UPDATE"},{"gtasId":"6755383","tamrId":"8e19c1ab-2bcf-3557-b156-7349292228d7","version":342,"action":"UPDATE"},{"gtasId":"21131349","tamrId":"238aa4f9-c5ae-33c6-b8e6-5a318542c48b","version":342,"action":"UPDATE"},{"gtasId":"14519644","tamrId":"2ecb17f3-662f-3d1d-be03-f845fb43acaf","version":342,"action":"UPDATE"},{"gtasId":"19875663","tamrId":"17f44bc9-5fa3-3e21-9e56-d0fb385a68fe","version":342,"action":"UPDATE"},{"gtasId":"19486612","tamrId":"c2be5588-366f-3427-b492-5376a716bea7","version":342,"action":"UPDATE"},{"gtasId":"10358155","tamrId":"eabe1aa2-3436-37d0-a846-31ca853bcb9f","version":342,"action":"UPDATE"},{"gtasId":"18032672","tamrId":"80d96124-ed3d-3396-896c-cd6717950c4a","version":342,"action":"UPDATE"},{"gtasId":"6893023","tamrId":"c7b7f0df-d1dd-3b07-bdf0-70af58f76080","version":342,"action":"UPDATE"},{"gtasId":"1520801","tamrId":"256fc211-e26a-3d0c-93c7-7b8efe458cec","version":342,"action":"UPDATE"},{"gtasId":"22859542","tamrId":"48b35ca6-47ef-35f3-b949-a1300cc48fb0","version":342,"action":"UPDATE"},{"gtasId":"5836864","tamrId":"17b49db8-cc02-3420-ac0d-e75265bf9f67","version":342,"action":"UPDATE"},{"gtasId":"5836867","tamrId":"80be0946-73d3-354d-ac27-3b3c8baaaf0f","version":342,"action":"UPDATE"},{"gtasId":"19100054","tamrId":"c48ad8dd-bc3b-3eba-b8dd-faa5c190ef9e","version":342,"action":"UPDATE"},{"gtasId":"16413313","tamrId":"2520e422-a626-3060-8f4f-137fa4fddbf0","version":342,"action":"UPDATE"},{"gtasId":"16934127","tamrId":"a025e7f2-5e86-3b71-951d-30ba5e3b4887","version":342,"action":"UPDATE"},{"gtasId":"22411007","tamrId":"b999bd42-85da-3667-acc3-e948a7004c59","version":342,"action":"UPDATE"},{"gtasId":"15378180","tamrId":"5e97f00d-8838-312b-946f-8abc2989cbe9","version":342,"action":"UPDATE"},{"gtasId":"17988290","tamrId":"ec979883-9bca-3ade-ae68-9ef9de234a52","version":342,"action":"UPDATE"},{"gtasId":"14507663","tamrId":"fef66c45-704b-3e75-ae5b-4b01ca336140","version":342,"action":"UPDATE"},{"gtasId":"2556416","tamrId":"62c1f00f-6e75-3101-8f54-916400cea226","version":342,"action":"UPDATE"},{"gtasId":"10566872","tamrId":"2139de8a-15ce-3057-929c-b3439d8b70c8","version":342,"action":"UPDATE"},{"gtasId":"11535348","tamrId":"677f0762-a347-3eeb-9e80-eed11cf8660e","version":342,"action":"UPDATE"},{"gtasId":"1839930","tamrId":"cc18d499-d9ba-303b-88f0-c6005609a518","version":342,"action":"UPDATE"},{"gtasId":"5011952","tamrId":"62ec5e5a-9a46-386a-ab0b-fea18d6cb00b","version":342,"action":"UPDATE"},{"gtasId":"10943003","tamrId":"720ce483-74b6-3d1f-a4a6-fc9393af3215","version":342,"action":"UPDATE"},{"gtasId":"6199828","tamrId":"b38e3ac4-d0ec-373b-abbf-9d84a2e8e678","version":342,"action":"UPDATE"},{"gtasId":"1370887","tamrId":"763b65c6-367a-35aa-9061-ee1929a0d550","version":342,"action":"UPDATE"},{"gtasId":"9554986","tamrId":"6965d95c-7792-3706-9ba5-d4f12801e253","version":342,"action":"UPDATE"},{"gtasId":"8068560","tamrId":"cc18d499-d9ba-303b-88f0-c6005609a518","version":342,"action":"UPDATE"},{"gtasId":"3675223","tamrId":"9c9fb04b-b948-33f5-8aba-50c4cd85b7b9","version":342,"action":"UPDATE"},{"gtasId":"14682952","tamrId":"b2f9ba16-f1f6-37aa-88cf-e3268c93a5d5","version":342,"action":"UPDATE"},{"gtasId":"7031630","tamrId":"49938a74-b1f8-35d5-8b11-aa292fa8d375","version":342,"action":"UPDATE"},{"gtasId":"21629874","tamrId":"8013f9e1-5892-3a49-9073-1dae50ffb204","version":342,"action":"UPDATE"},{"gtasId":"13410756","tamrId":"5a3d4618-540d-3c34-8ab6-c43dd9d470cc","version":342,"action":"UPDATE"},{"gtasId":"14881258","tamrId":"0b905d8c-5b4d-3de6-b3dc-e4be2e67bfb9","version":342,"action":"UPDATE"},{"gtasId":"8743495","tamrId":"72b95292-a7ba-3839-b182-864abc8325d9","version":342,"action":"UPDATE"},{"gtasId":"4565206","tamrId":"3ada178a-719c-3f53-b24a-4f707ccd224d","version":342,"action":"UPDATE"},{"gtasId":"18253883","tamrId":"7b421a5f-1d49-3f26-ba2d-1cc64967b306","version":342,"action":"UPDATE"},{"gtasId":"17729639","tamrId":"c9839790-94e4-33d5-81e3-466abf8bf0ea","version":342,"action":"UPDATE"},{"gtasId":"4297344","tamrId":"93a388d8-f23f-341a-808d-90ec4a038519","version":342,"action":"UPDATE"},{"gtasId":"2317412","tamrId":"35989191-bc24-38b0-aa4a-b2e86b55cff8","version":342,"action":"UPDATE"},{"gtasId":"13928638","tamrId":"222b8781-0620-3b2a-a93f-9f861a7a6788","version":342,"action":"UPDATE"},{"gtasId":"7877253","tamrId":"2dae80b4-153b-3217-99af-377b9e123fcc","version":342,"action":"UPDATE"},{"gtasId":"786679","tamrId":"9ef0bd35-f63a-38e4-993f-1ca89668396b","version":342,"action":"UPDATE"},{"gtasId":"523649","tamrId":"cf2b80c6-c2f7-35d5-8238-948e7c6ba86a","version":342,"action":"UPDATE"},{"gtasId":"16065674","tamrId":"e53efa35-47f9-3230-b399-2556de0e3b90","version":342,"action":"UPDATE"},{"gtasId":"11914168","tamrId":"8438a67f-8611-3be6-9701-c90cd215ab77","version":342,"action":"UPDATE"},{"gtasId":"1500337","tamrId":"95244c8b-22e8-39af-a60b-881aae4897ee","version":342,"action":"UPDATE"},{"gtasId":"13871417","tamrId":"ac763ce9-bd3b-33fd-acea-a6af570ec4db","version":342,"action":"UPDATE"},{"gtasId":"7497999","tamrId":"5c1971da-dfe9-3696-b034-012bea044b7b","version":342,"action":"UPDATE"},{"gtasId":"7849335","tamrId":"33a82c85-3f14-3f14-b2d4-e679fb9aad07","version":342,"action":"UPDATE"},{"gtasId":"4157044","tamrId":"115a0f93-d8f5-37ea-8747-7f86c2b2b612","version":342,"action":"UPDATE"},{"gtasId":"16241114","tamrId":"45a78d6a-03bf-3064-aa00-9557b64b3297","version":342,"action":"UPDATE"},{"gtasId":"22890351","tamrId":"11530aca-ded4-390a-83c9-3b1400933b72","version":342,"action":"UPDATE"},{"gtasId":"5524353","tamrId":"eecbff90-600b-3e2b-a07e-6b96ca7410fa","version":342,"action":"UPDATE"},{"gtasId":"4417567","tamrId":"8598087e-329f-3b29-936f-9f6f4dd13c9f","version":342,"action":"UPDATE"},{"gtasId":"14947377","tamrId":"5adb25f7-2d4b-30b3-9eab-e2da11bb4d53","version":342,"action":"UPDATE"},{"gtasId":"14077584","tamrId":"498bc961-321f-320e-a81e-1aec25a789f3","version":342,"action":"UPDATE"},{"gtasId":"1099102","tamrId":"0de737a0-4d2d-3330-9b13-f488e0452717","version":342,"action":"UPDATE"},{"gtasId":"15938054","tamrId":"be6a3d6c-b52d-3ed1-9560-3da135d28642","version":342,"action":"UPDATE"},{"gtasId":"11578474","tamrId":"ebca4448-c564-39a6-ab6a-56391f742442","version":342,"action":"UPDATE"},{"gtasId":"5774061","tamrId":"4b5f37fa-9e21-31d3-a9a0-dbe4e2089c2e","version":342,"action":"UPDATE"},{"gtasId":"1563923","tamrId":"aed6c5de-b995-39d2-b24d-103a782a04f4","version":342,"action":"UPDATE"},{"gtasId":"1011174","tamrId":"10923578-01bb-32eb-b1cf-4d1a9dd1e797","version":342,"action":"UPDATE"},{"gtasId":"20167087","tamrId":"dd830793-8653-3d5b-9ba8-ed7e13e57353","version":342,"action":"UPDATE"},{"gtasId":"24968596","tamrId":"c23f2c1b-182d-333c-abd5-9a6a004bc0ea","version":342,"action":"UPDATE"},{"gtasId":"20683738","tamrId":"6775e9b6-fea7-3689-97e9-1912fe69de76","version":342,"action":"UPDATE"},{"gtasId":"8738005","tamrId":"f025e0c9-876c-35f5-a4ee-28bf8afdc241","version":342,"action":"UPDATE"},{"gtasId":"737721","tamrId":"8cc3d6bb-9092-30a0-b367-7663db29e011","version":342,"action":"UPDATE"},{"gtasId":"7126489","tamrId":"8602ff53-dedd-3958-a0b6-10b4711636bb","version":342,"action":"UPDATE"},{"gtasId":"3428595","tamrId":"fb2aaad9-ab93-366d-bcc3-6715eca82d86","version":342,"action":"UPDATE"},{"gtasId":"19388338","tamrId":"fbe366ac-d7a0-3628-a9cf-f37ead41d25f","version":342,"action":"UPDATE"},{"gtasId":"18802431","tamrId":"e96791d6-c460-3f90-98f8-a85276d80bd5","version":342,"action":"UPDATE"},{"gtasId":"4624093","tamrId":"7e7c253b-624f-35fd-abd6-ef183d26f3f0","version":342,"action":"UPDATE"},{"gtasId":"24261763","tamrId":"b4f1e749-c6cb-3b31-ae36-84b0dc75fd55","version":342,"action":"UPDATE"},{"gtasId":"8124147","tamrId":"3a8dc924-e55b-3310-9b93-263728f51dfc","version":342,"action":"UPDATE"},{"gtasId":"19200066","tamrId":"04a80775-c2d3-306a-aef6-9c756bcddbfb","version":342,"action":"UPDATE"},{"gtasId":"15171964","tamrId":"8995bbdb-b20c-36ca-9111-2693acdd68c2","version":342,"action":"UPDATE"},{"gtasId":"6065388","tamrId":"d642ebb3-f77d-3aed-ab92-c7344de6b8d5","version":342,"action":"UPDATE"},{"gtasId":"19858400","tamrId":"fcd83fd7-8883-3db3-bb0f-3fcc9b0c4b2f","version":342,"action":"UPDATE"},{"gtasId":"14281045","tamrId":"eb3aca61-085f-3f0d-aceb-28de0ccdb7d8","version":342,"action":"UPDATE"},{"gtasId":"7220341","tamrId":"ab5ff54e-cab6-3a50-8434-429f15d3e5dc","version":342,"action":"UPDATE"},{"gtasId":"10719057","tamrId":"1dbd32ab-cb0d-3e29-b95b-7302e59acd0f","version":342,"action":"UPDATE"},{"gtasId":"5203921","tamrId":"703ae681-9a98-3711-a985-7ff0cb0764fd","version":342,"action":"UPDATE"},{"gtasId":"19205749","tamrId":"0f9b171b-b76d-333d-b063-de772d9ebd43","version":342,"action":"UPDATE"},{"gtasId":"16993338","tamrId":"9d7805eb-2ab1-37e7-999a-09663fa7af7c","version":342,"action":"UPDATE"},{"gtasId":"17394938","tamrId":"9f40d213-986f-3ee9-aad3-6bbd9be1f6fc","version":342,"action":"UPDATE"},{"gtasId":"19001197","tamrId":"5c971d66-f0ee-3916-8b29-575dd29c2589","version":342,"action":"UPDATE"},{"gtasId":"21577462","tamrId":"db7cc901-d04c-3836-9d4b-5deb51f94e14","version":342,"action":"UPDATE"},{"gtasId":"8440738","tamrId":"a3c2cd63-ee66-383d-b761-bfb4ceea3941","version":342,"action":"UPDATE"},{"gtasId":"20483402","tamrId":"447e048d-aff2-3beb-a257-047566784b25","version":342,"action":"UPDATE"},{"gtasId":"8088996","tamrId":"7c4ada15-e9c7-3ea9-ae01-cd5c0658c230","version":342,"action":"UPDATE"},{"gtasId":"7800066","tamrId":"6d71762d-cc91-3043-bc36-0f4de0a5dc5a","version":342,"action":"UPDATE"},{"gtasId":"14891489","tamrId":"aa6b64d7-26e6-3856-b90b-553f47c601f9","version":342,"action":"UPDATE"},{"gtasId":"21709655","tamrId":"0a728c66-404a-34f6-b1c5-01a1e1d52bb9","version":342,"action":"UPDATE"},{"gtasId":"5516700","tamrId":"a00e3f36-6e29-3ec0-8e89-6e9a8c1b9da6","version":342,"action":"UPDATE"},{"gtasId":"13065122","tamrId":"896017f6-5dd3-3b61-8138-8c7944c3828f","version":342,"action":"UPDATE"},{"gtasId":"12693787","tamrId":"922fd23e-bcaa-3b75-ab19-421f3ecb031f","version":342,"action":"UPDATE"},{"gtasId":"23562222","tamrId":"6901097f-fbf9-3669-8b3f-6cbd4b600a06","version":342,"action":"UPDATE"},{"gtasId":"23588833","tamrId":"07f99a02-d416-30ad-a97c-fe7e5e35360a","version":342,"action":"UPDATE"},{"gtasId":"5786062","tamrId":"8d954f7d-e43d-374c-badc-c84248df1ae7","version":342,"action":"UPDATE"},{"gtasId":"7221605","tamrId":"dab4fe2a-acd5-33f7-9f96-e7294aa17f9b","version":342,"action":"UPDATE"},{"gtasId":"13379423","tamrId":"427f1685-2d2b-3e5a-af85-21e64c4730ad","version":342,"action":"UPDATE"},{"gtasId":"1127791","tamrId":"2e6e5c7e-2e3b-30e5-9e24-d2ec0560bf60","version":342,"action":"UPDATE"},{"gtasId":"3173514","tamrId":"41830534-bcf0-33d2-937e-30d3cdf5aa03","version":342,"action":"UPDATE"},{"gtasId":"4615118","tamrId":"1ab54e84-5d03-3106-a98b-2df76cb75267","version":342,"action":"UPDATE"},{"gtasId":"20272470","tamrId":"bd9501f3-ee2e-3e6a-97e6-8ec87aa72e50","version":342,"action":"UPDATE"},{"gtasId":"3826579","tamrId":"dcbd0b98-d565-367a-85c3-ea4dd0b54136","version":342,"action":"UPDATE"},{"gtasId":"9603670","tamrId":"62ce5f2d-3f64-38f9-b012-dcde6cef1188","version":342,"action":"UPDATE"},{"gtasId":"16190681","tamrId":"4c616323-a6fe-34ac-b5a3-d52b76158185","version":342,"action":"UPDATE"},{"gtasId":"17889587","tamrId":"a21fe6c5-f9f8-362b-92c7-c3e340253159","version":342,"action":"UPDATE"},{"gtasId":"1243007","tamrId":"22fccc4d-9c67-3c49-a26b-4f8cd2daa426","version":342,"action":"UPDATE"},{"gtasId":"2805308","tamrId":"7cdc037a-9574-3b72-8e36-f461cea63595","version":342,"action":"UPDATE"},{"gtasId":"6230115","tamrId":"7125d63a-6db7-3a14-aa3f-6627f2586ff5","version":342,"action":"UPDATE"},{"gtasId":"9483450","tamrId":"949ba460-abfa-39ea-8002-6276200590df","version":342,"action":"UPDATE"},{"gtasId":"2582719","tamrId":"9fc186d6-7011-3d98-8f0d-0ba218d31d29","version":342,"action":"UPDATE"},{"gtasId":"3500443","tamrId":"27a69326-417a-3157-80b7-974c732fa8ec","version":342,"action":"UPDATE"},{"gtasId":"5190160","tamrId":"f6be5be6-265b-31d4-82a2-ddeeee833074","version":342,"action":"UPDATE"},{"gtasId":"16967089","tamrId":"26527633-94de-3b80-b254-c569f060de1f","version":342,"action":"UPDATE"},{"gtasId":"1943220","tamrId":"f0219955-024a-34b8-b1a5-dea94f374ed7","version":342,"action":"UPDATE"},{"gtasId":"14265874","tamrId":"657a684b-fabb-31b8-ac64-c37766451acb","version":342,"action":"UPDATE"},{"gtasId":"74169","tamrId":"1de10cf5-db3e-3756-be57-09357301e43c","version":342,"action":"UPDATE"},{"gtasId":"11392321","tamrId":"fd079acd-9586-3675-9e12-aaf0b46de9aa","version":342,"action":"UPDATE"},{"gtasId":"3105413","tamrId":"271b3b34-41d3-3380-8529-dac56c8be071","version":342,"action":"UPDATE"},{"gtasId":"2151884","tamrId":"dc1b6984-1faf-31e2-9b80-ea9ee0aa2c4e","version":342,"action":"UPDATE"},{"gtasId":"5615694","tamrId":"97f1b901-233f-30b0-9d80-7f2f9f14c50f","version":342,"action":"UPDATE"},{"gtasId":"24589857","tamrId":"f9eafa32-448e-3199-9dbc-8f5f26584533","version":342,"action":"UPDATE"},{"gtasId":"4209692","tamrId":"0499ce37-9c26-3f76-92b1-b1cd906f752c","version":342,"action":"UPDATE"},{"gtasId":"14719895","tamrId":"45812af3-b9b3-37ef-b7ee-32cae4f013d0","version":342,"action":"UPDATE"},{"gtasId":"16204118","tamrId":"5444458d-2c06-31f7-a694-f7b695dd4875","version":342,"action":"UPDATE"},{"gtasId":"3719371","tamrId":"6942c8b4-e547-3e22-873a-24704a73956d","version":342,"action":"UPDATE"},{"gtasId":"11637127","tamrId":"ae032e4a-4999-39ba-84ac-43300babcd50","version":342,"action":"UPDATE"},{"gtasId":"4848313","tamrId":"75a1c985-853c-3574-a0aa-1c180b42dd31","version":342,"action":"UPDATE"},{"gtasId":"10729298","tamrId":"325b9810-1bbb-313b-b34e-d574e77c9310","version":342,"action":"UPDATE"},{"gtasId":"9064480","tamrId":"04a80775-c2d3-306a-aef6-9c756bcddbfb","version":342,"action":"UPDATE"},{"gtasId":"24985975","tamrId":"1debd66c-4712-3825-b2a9-b5837e52ae46","version":342,"action":"UPDATE"},{"gtasId":"17563232","tamrId":"a060fb96-97d6-3a89-95ba-c0c8da03304f","version":342,"action":"UPDATE"},{"gtasId":"3101086","tamrId":"7eec8a6b-c65a-342a-a7c5-070526361eae","version":342,"action":"UPDATE"},{"gtasId":"2730074","tamrId":"72453975-ba64-3df4-bc89-17cb0823eab5","version":342,"action":"UPDATE"},{"gtasId":"11647376","tamrId":"65c8822e-67a8-310e-bd0e-3ea2526440eb","version":342,"action":"UPDATE"},{"gtasId":"13860734","tamrId":"1a2d9981-bc6c-3e6d-b45d-5650dc776d1f","version":342,"action":"UPDATE"},{"gtasId":"18972301","tamrId":"706e17bf-3d36-3d23-b940-9034cee7002e","version":342,"action":"UPDATE"},{"gtasId":"44312","tamrId":"922fd23e-bcaa-3b75-ab19-421f3ecb031f","version":342,"action":"UPDATE"},{"gtasId":"21577422","tamrId":"a22f4041-8c78-3297-9cbf-d296e21412a0","version":342,"action":"UPDATE"},{"gtasId":"3500472","tamrId":"da556efb-3c5e-310f-bb56-105d1b47af8f","version":342,"action":"UPDATE"},{"gtasId":"1160387","tamrId":"515bfcf3-9c0f-373f-8856-9704816ae423","version":342,"action":"UPDATE"},{"gtasId":"486304","tamrId":"4c7b1777-a253-3d49-a742-4faf2d877d4f","version":342,"action":"UPDATE"},{"gtasId":"3571613","tamrId":"37af3253-a685-3c1f-8c29-241bd9568556","version":342,"action":"UPDATE"},{"gtasId":"15960015","tamrId":"a8cde752-0c84-3c9b-a133-d1d589e60b51","version":342,"action":"UPDATE"},{"gtasId":"7615568","tamrId":"e3b9bcd3-d5fe-3f8c-ad6b-63511e60aec1","version":342,"action":"UPDATE"},{"gtasId":"1745559","tamrId":"eb17cc8e-6eba-38e5-a3ae-970309f8381c","version":342,"action":"UPDATE"},{"gtasId":"1298137","tamrId":"356c00a9-7c21-3c5d-91cc-e4ef3f3b0df8","version":342,"action":"UPDATE"},{"gtasId":"3892010","tamrId":"b44b651e-8663-3c82-ad88-4457febd4f3f","version":342,"action":"UPDATE"},{"gtasId":"16684711","tamrId":"91ea7829-9787-3736-be75-039426ccdc14","version":342,"action":"UPDATE"},{"gtasId":"1081886","tamrId":"030f0093-1594-33bb-bb00-e9196701909a","version":342,"action":"UPDATE"},{"gtasId":"21685923","tamrId":"1fecb508-5672-3025-ba19-adf7c3064c72","version":342,"action":"UPDATE"},{"gtasId":"21959381","tamrId":"b6dc76ac-fded-3555-b2c7-4ecc33abf461","version":342,"action":"UPDATE"},{"gtasId":"15833006","tamrId":"0acd318e-bab8-32ae-b334-23d421b9f2bc","version":342,"action":"UPDATE"},{"gtasId":"7246904","tamrId":"7d3461ee-6507-3fa6-b02d-f1c9d900540f","version":342,"action":"UPDATE"},{"gtasId":"18826344","tamrId":"93289d4a-7200-32fe-85be-d452331d1c25","version":342,"action":"UPDATE"},{"gtasId":"8965003","tamrId":"1ea455bf-322b-3af2-969f-7f110777cdd4","version":342,"action":"UPDATE"},{"gtasId":"10243708","tamrId":"aa2eee49-7321-3edf-9619-e264dd715b5e","version":342,"action":"UPDATE"},{"gtasId":"9776698","tamrId":"7ebc827a-abb7-3130-90b0-9d8212ed6426","version":342,"action":"UPDATE"},{"gtasId":"18389168","tamrId":"5444458d-2c06-31f7-a694-f7b695dd4875","version":342,"action":"UPDATE"},{"gtasId":"16863348","tamrId":"0f928ed7-7c8f-34ea-a04a-d76a45951f00","version":342,"action":"UPDATE"},{"gtasId":"13392311","tamrId":"0f82fdb0-baa6-3c68-91d9-994a5d16f726","version":342,"action":"UPDATE"},{"gtasId":"17650101","tamrId":"b6cb8e49-cdd2-35d9-b9f2-886e4d84bf52","version":342,"action":"UPDATE"},{"gtasId":"23321512","tamrId":"1ea08903-0136-3f4a-96a8-383f5c2dcb02","version":342,"action":"UPDATE"},{"gtasId":"10929613","tamrId":"d66c609b-9bb8-3ddc-89c9-6fb4ee9f5560","version":342,"action":"UPDATE"},{"gtasId":"3760320","tamrId":"7ad2c6ba-229e-3f4f-a3b7-7ce0e7c94755","version":342,"action":"UPDATE"},{"gtasId":"21223908","tamrId":"5fc3d523-945a-3435-b3fc-f3f1773d5846","version":342,"action":"UPDATE"},{"gtasId":"13990617","tamrId":"62e34283-3d47-3790-888d-9f9558928d8f","version":342,"action":"UPDATE"},{"gtasId":"19304681","tamrId":"96477016-dead-3fe7-883c-3018e07560f6","version":342,"action":"UPDATE"},{"gtasId":"13355389","tamrId":"b37e539b-6ba2-3cf8-b050-3db3954d58b2","version":342,"action":"UPDATE"},{"gtasId":"2024954","tamrId":"115a0f93-d8f5-37ea-8747-7f86c2b2b612","version":342,"action":"UPDATE"},{"gtasId":"6130031","tamrId":"77e9daa2-d413-3e4a-a999-629c506dc838","version":342,"action":"UPDATE"},{"gtasId":"24689030","tamrId":"0d251ac5-f614-3285-8281-b091e61a44f5","version":342,"action":"UPDATE"},{"gtasId":"5871139","tamrId":"9e2b9933-e2b6-36ee-9b50-2f53e47e5283","version":342,"action":"UPDATE"},{"gtasId":"20578264","tamrId":"1dca53ed-c81e-31d3-a43f-0394a180b376","version":342,"action":"UPDATE"},{"gtasId":"2114887","tamrId":"0bbf8cc6-e1d0-3dee-a086-0970a1386405","version":342,"action":"UPDATE"},{"gtasId":"2407288","tamrId":"fa782af2-9927-3460-a3dd-95608ffa459e","version":342,"action":"UPDATE"},{"gtasId":"9288821","tamrId":"63f74422-ba88-395c-9e2c-df201f3860a2","version":342,"action":"UPDATE"},{"gtasId":"19558779","tamrId":"24c51a6d-e2d6-3c40-8b94-2948f4ceb240","version":342,"action":"UPDATE"},{"gtasId":"12615346","tamrId":"dc8c3edd-de32-3344-91bb-a27b1c2f1c85","version":342,"action":"UPDATE"},{"gtasId":"11018800","tamrId":"301c056a-0d08-30f7-a9d2-8dcdb60333ed","version":342,"action":"UPDATE"},{"gtasId":"13163564","tamrId":"69cb65ca-2293-3fc7-acca-3a14ee1d6dfa","version":342,"action":"UPDATE"},{"gtasId":"11314983","tamrId":"39503e02-ed81-3e48-ad81-0462ae5637fc","version":342,"action":"UPDATE"},{"gtasId":"131549","tamrId":"77e9daa2-d413-3e4a-a999-629c506dc838","version":342,"action":"UPDATE"},{"gtasId":"7953502","tamrId":"4a21e700-ad1f-38f4-bdb9-624973f5c2da","version":342,"action":"UPDATE"},{"gtasId":"20443418","tamrId":"072660dd-9fe8-3504-bc0c-82cd54e0a5d2","version":342,"action":"UPDATE"},{"gtasId":"3215097","tamrId":"e40437ae-11ae-3ec9-b44a-265851e0a240","version":342,"action":"UPDATE"},{"gtasId":"5096952","tamrId":"bf70ace4-f99b-3809-919d-6148b3cf6c8a","version":342,"action":"UPDATE"},{"gtasId":"634576","tamrId":"98090cf6-7aa2-32d6-8246-634adf03c094","version":342,"action":"UPDATE"},{"gtasId":"18889932","tamrId":"433a4c03-024d-33fb-a0e9-850284d93043","version":342,"action":"UPDATE"},{"gtasId":"5200818","tamrId":"08ea0caf-1053-3384-b08f-0c8e16e07446","version":342,"action":"UPDATE"},{"gtasId":"4556397","tamrId":"63d3b32e-898b-3097-a8e2-0c5481a7f1d0","version":342,"action":"UPDATE"},{"gtasId":"2401979","tamrId":"065f5ceb-7768-3195-b609-b55e4df8756d","version":342,"action":"UPDATE"},{"gtasId":"16404371","tamrId":"05cd807a-95a7-322c-9560-a3576c163962","version":342,"action":"UPDATE"},{"gtasId":"802392","tamrId":"d852bab1-d034-32d0-9392-fd39332a7f25","version":342,"action":"UPDATE"},{"gtasId":"15998514","tamrId":"e14e36a2-8b0e-36f1-bbe1-c4e8e232f262","version":342,"action":"UPDATE"},{"gtasId":"11139026","tamrId":"111e5698-a18c-3e81-b2a5-b472f7710b81","version":342,"action":"UPDATE"},{"gtasId":"21504460","tamrId":"1749e0e6-d6dc-395e-b3cf-35b4305d040b","version":342,"action":"UPDATE"},{"gtasId":"20765203","tamrId":"0ca0b792-8504-3f70-958d-082da962d4ff","version":342,"action":"UPDATE"},{"gtasId":"16415009","tamrId":"62217f35-53a8-312d-a843-bb5d4ab246e0","version":342,"action":"UPDATE"},{"gtasId":"1841376","tamrId":"c7b2e7c5-71f5-3d99-a9bb-567ac57c75be","version":342,"action":"UPDATE"},{"gtasId":"12354534","tamrId":"f5b22127-4659-3b18-8c5e-91907d8c9e89","version":342,"action":"UPDATE"},{"gtasId":"15126545","tamrId":"10af01d2-a0ce-371f-9372-217ef31eb148","version":342,"action":"UPDATE"},{"gtasId":"16105293","tamrId":"d6050dd8-a264-3593-b6ba-35e2184c7203","version":342,"action":"UPDATE"},{"gtasId":"23868047","tamrId":"e7a12817-801f-385b-8d8d-c3a64d8ad995","version":342,"action":"UPDATE"},{"gtasId":"393267","tamrId":"6f109665-7429-3e98-a145-40365e3dcd7c","version":342,"action":"UPDATE"},{"gtasId":"2158422","tamrId":"5148b9cc-bf6d-398f-9f7a-0cab7253fa12","version":342,"action":"UPDATE"},{"gtasId":"18165785","tamrId":"3d6d6465-3508-3bd5-8ebe-a8009ee000cf","version":342,"action":"UPDATE"},{"gtasId":"311453","tamrId":"716d94f1-562c-3b56-b499-ee23cad09563","version":342,"action":"UPDATE"},{"gtasId":"24195026","tamrId":"c1eef887-441f-3a29-a0d8-641a8fc39019","version":342,"action":"UPDATE"},{"gtasId":"7745577","tamrId":"3f5bc688-2c4f-39a2-94f1-880fb6181adb","version":342,"action":"UPDATE"},{"gtasId":"12568567","tamrId":"5cedf324-2289-3959-835b-37dbb9fc135c","version":342,"action":"UPDATE"},{"gtasId":"12305535","tamrId":"80d2850d-9748-3189-ab30-6c548f2d941d","version":342,"action":"UPDATE"},{"gtasId":"6583981","tamrId":"12ab18b0-e7c4-33af-aa01-915a9f60e4fa","version":342,"action":"UPDATE"},{"gtasId":"1363666","tamrId":"b3199768-5c40-31bf-8186-3dfeb002f9bd","version":342,"action":"UPDATE"},{"gtasId":"22980354","tamrId":"177698b1-9ea4-36a1-bfe2-f099b9c5627b","version":342,"action":"UPDATE"},{"gtasId":"12901271","tamrId":"6942c8b4-e547-3e22-873a-24704a73956d","version":342,"action":"UPDATE"},{"gtasId":"14591786","tamrId":"e93600bf-66d8-3f75-bdca-75fe82c7f3d5","version":342,"action":"UPDATE"},{"gtasId":"14633246","tamrId":"002fec8b-8ac7-37a2-80c9-9386f9bdb430","version":342,"action":"UPDATE"},{"gtasId":"8167306","tamrId":"4012377f-ec81-3339-99f6-68aceb54aa1f","version":342,"action":"UPDATE"},{"gtasId":"1027550","tamrId":"f677032e-fd5c-33ab-9589-199a13defeca","version":342,"action":"UPDATE"},{"gtasId":"1452300","tamrId":"a4862021-b36f-3558-a385-9ca9786ae16f","version":342,"action":"UPDATE"},{"gtasId":"12092309","tamrId":"46d1efb7-f4e0-3682-8381-57529731d0d7","version":342,"action":"UPDATE"},{"gtasId":"24289375","tamrId":"22e28cf3-8dc1-3478-ba54-3bd1d705642b","version":342,"action":"UPDATE"},{"gtasId":"7832483","tamrId":"9ea3d2fc-d2cd-3d97-a04a-f22837cf2ba8","version":342,"action":"UPDATE"},{"gtasId":"10066074","tamrId":"a93669f1-e795-35c0-9c6e-ef9122f97072","version":342,"action":"UPDATE"},{"gtasId":"2661091","tamrId":"5f3afdd7-7c94-356e-9e3f-668444001202","version":342,"action":"UPDATE"},{"gtasId":"25181695","tamrId":"6299ac57-14cd-334d-8dba-a5b4ecb13182","version":342,"action":"UPDATE"},{"gtasId":"23731453","tamrId":"ca6b2082-3163-3a70-934c-c23855cc4a34","version":342,"action":"UPDATE"},{"gtasId":"7237258","tamrId":"7af00e22-d13b-3828-ad93-e6ec884d9a1c","version":342,"action":"UPDATE"},{"gtasId":"12811316","tamrId":"b42234a5-74e9-31ff-bb4f-5a2848aca92f","version":342,"action":"UPDATE"},{"gtasId":"22891709","tamrId":"ae49eb02-2708-3755-840b-a5805a1712ba","version":342,"action":"UPDATE"},{"gtasId":"8943679","tamrId":"810c5646-d893-3866-946a-85bdc0195c5d","version":342,"action":"UPDATE"},{"gtasId":"9819489","tamrId":"5e62f45c-4f6f-3468-b65c-74f2a506f2d9","version":342,"action":"UPDATE"},{"gtasId":"117248","tamrId":"901e8d28-1ed5-395c-a69d-dd97cbf341cd","version":342,"action":"UPDATE"},{"gtasId":"6314258","tamrId":"46776473-8800-3de5-923a-aad9c221ad65","version":342,"action":"UPDATE"},{"gtasId":"15386596","tamrId":"fd075795-b7f1-37cb-8fb2-800906ef679c","version":342,"action":"UPDATE"},{"gtasId":"11369143","tamrId":"0e551a29-4513-3c59-b50e-43afdee49a1c","version":342,"action":"UPDATE"},{"gtasId":"23896921","tamrId":"bd126646-42b6-36b9-b1c3-a95887deab89","version":342,"action":"UPDATE"},{"gtasId":"19901691","tamrId":"dd8aa34f-767d-32b7-9415-26e90258a304","version":342,"action":"UPDATE"},{"gtasId":"1973911","tamrId":"fba4e4bb-35d6-3eb7-8de9-4bf654bf8113","version":342,"action":"UPDATE"},{"gtasId":"8583179","tamrId":"a4000d60-ba6a-3b66-954f-61b3f2c6dd87","version":342,"action":"UPDATE"},{"gtasId":"22542290","tamrId":"4829033a-2ca9-34c2-9c8e-d306c1c08ec6","version":342,"action":"UPDATE"},{"gtasId":"5265270","tamrId":"9e7abc3c-4c90-3d0a-8490-cd35d6023450","version":342,"action":"UPDATE"},{"gtasId":"7164614","tamrId":"1ab507c7-7c59-3b42-bce3-6908360a4ba6","version":342,"action":"UPDATE"},{"gtasId":"463606","tamrId":"6e1d59c3-46eb-308d-8d52-6b0a6d075161","version":342,"action":"UPDATE"},{"gtasId":"3235430","tamrId":"5654b0b9-2a33-371c-936f-7da982473950","version":342,"action":"UPDATE"},{"gtasId":"11894002","tamrId":"2b6cf4ec-4545-349a-bcf3-b561b3fd6940","version":342,"action":"UPDATE"},{"gtasId":"15584226","tamrId":"3ef51b14-01ce-301c-9c36-60965ef89f57","version":342,"action":"UPDATE"},{"gtasId":"11022018","tamrId":"a0efd19f-b812-3720-acf8-0ede288853d0","version":342,"action":"UPDATE"},{"gtasId":"1555560","tamrId":"32335df5-e338-392a-9531-e2af223ca7ef","version":342,"action":"UPDATE"},{"gtasId":"12695493","tamrId":"818ecd3f-80a3-3071-9242-1cff08980cdb","version":342,"action":"UPDATE"},{"gtasId":"2678754","tamrId":"068c5be3-5e23-3fdf-ac77-077ba2221dd7","version":342,"action":"UPDATE"},{"gtasId":"15723516","tamrId":"7b554798-51ff-3899-ae8d-ab9b476cd247","version":342,"action":"UPDATE"},{"gtasId":"12517810","tamrId":"ec47d7b5-0ff9-321d-8539-1218af80176b","version":342,"action":"UPDATE"},{"gtasId":"6799839","tamrId":"ac9d600a-1114-3b97-b009-79fb6ca4e5b0","version":342,"action":"UPDATE"},{"gtasId":"22212020","tamrId":"fd8d2d01-ddcc-3972-ae00-261088356993","version":342,"action":"UPDATE"},{"gtasId":"1854636","tamrId":"66ee0a02-2f54-38f3-a37f-ad6ddb6c78e6","version":342,"action":"UPDATE"},{"gtasId":"13682609","tamrId":"bb22655c-efec-315e-a157-e00cd034b8f3","version":342,"action":"UPDATE"},{"gtasId":"4845338","tamrId":"772a5f6d-65dc-3a92-9fe4-acd89968ad27","version":342,"action":"UPDATE"},{"gtasId":"11477782","tamrId":"1a72629b-6829-31be-aca0-8ddb5df00469","version":342,"action":"UPDATE"},{"gtasId":"16251280","tamrId":"9904d33d-6d66-3f48-a4a3-6e1a88e1fbbd","version":342,"action":"UPDATE"},{"gtasId":"11959872","tamrId":"c504cc60-a94a-353b-a1b8-0b3d7557e9dc","version":342,"action":"UPDATE"},{"gtasId":"1730566","tamrId":"0f91fc28-8b78-372e-b40d-5c25d8a98212","version":342,"action":"UPDATE"},{"gtasId":"624346","tamrId":"f4740422-1c83-35b3-9172-953c4c17f193","version":342,"action":"UPDATE"},{"gtasId":"13573530","tamrId":"acbbbf13-8f15-392e-bf85-723e05742d9e","version":342,"action":"UPDATE"},{"gtasId":"15738605","tamrId":"01d80017-1931-3269-b024-dc039145990b","version":342,"action":"UPDATE"},{"gtasId":"24757670","tamrId":"bb22655c-efec-315e-a157-e00cd034b8f3","version":342,"action":"UPDATE"},{"gtasId":"8867537","tamrId":"2ceaa419-c0c4-3565-976d-007d503ce06d","version":342,"action":"UPDATE"},{"gtasId":"12358032","tamrId":"0fd3b236-af27-3242-8a94-93f3d54b6cf2","version":342,"action":"UPDATE"},{"gtasId":"23480863","tamrId":"19c7e278-9911-36b4-99b8-892989002ef4","version":342,"action":"UPDATE"},{"gtasId":"16288564","tamrId":"5640c8e3-5ac0-3d1e-ae81-17b8752be5ed","version":342,"action":"UPDATE"},{"gtasId":"11621638","tamrId":"f0cd7619-95e0-33d3-bfaf-1626ac934497","version":342,"action":"UPDATE"},{"gtasId":"401325","tamrId":"aa618125-166b-3908-b319-b4fdbfc5ffda","version":342,"action":"UPDATE"},{"gtasId":"5059140","tamrId":"7ff981cb-dac4-3a49-b6f5-c6417393a050","version":342,"action":"UPDATE"},{"gtasId":"23349008","tamrId":"4eff630a-d896-3d60-86d3-8ad0d06df6f0","version":342,"action":"UPDATE"},{"gtasId":"9736608","tamrId":"a4bc8291-b03f-3982-8724-5c9e179266c3","version":342,"action":"UPDATE"},{"gtasId":"13798291","tamrId":"611bd604-834c-352a-8cc5-7471af374b14","version":342,"action":"UPDATE"},{"gtasId":"25234686","tamrId":"41cb935a-01ca-3c89-b162-e96cdb4312ae","version":342,"action":"UPDATE"},{"gtasId":"1100673","tamrId":"926be401-f9fb-31e1-9418-2c64cd02df12","version":342,"action":"UPDATE"},{"gtasId":"7570200","tamrId":"f37a8d7a-f638-3b2f-8ed9-b61f88fa39a6","version":342,"action":"UPDATE"},{"gtasId":"289088","tamrId":"d33d3d83-25aa-3da0-85fb-fb1598c0f6cd","version":342,"action":"UPDATE"},{"gtasId":"25180","tamrId":"2de40618-7a54-3fe0-974c-b4f928b13f4e","version":342,"action":"UPDATE"},{"gtasId":"7431359","tamrId":"a00c1377-8a0e-337a-b608-409680dfe556","version":342,"action":"UPDATE"},{"gtasId":"19711500","tamrId":"eb766145-2e08-3521-acd6-c3df8e72caa6","version":342,"action":"UPDATE"},{"gtasId":"16498256","tamrId":"caab75df-1d86-3416-9118-1993b5fa8543","version":342,"action":"UPDATE"},{"gtasId":"16296180","tamrId":"e577b796-5fc3-3d98-9ac8-8a4f6d17f6e4","version":342,"action":"UPDATE"},{"gtasId":"6495802","tamrId":"b911f4c2-e0ff-3030-ac01-855eeec13083","version":342,"action":"UPDATE"},{"gtasId":"6635635","tamrId":"1288dece-b432-3bbb-8991-34fe0b8e2128","version":342,"action":"UPDATE"},{"gtasId":"21699737","tamrId":"3a0cd7d0-ea44-3962-a394-1e187b642dfa","version":342,"action":"UPDATE"},{"gtasId":"2529669","tamrId":"0d907f7b-f0b6-36d1-ba08-b2ad6472264d","version":342,"action":"UPDATE"},{"gtasId":"23685993","tamrId":"982fb3a2-c693-3b13-ab0e-d508855847d0","version":342,"action":"UPDATE"},{"gtasId":"16885526","tamrId":"c53c09e7-3293-30d9-9d5e-9dd6cad8dec1","version":342,"action":"UPDATE"},{"gtasId":"20897005","tamrId":"912735a1-8c4c-38dd-b9e7-1ed7bb08cf47","version":342,"action":"UPDATE"},{"gtasId":"8714852","tamrId":"32b201c4-2af7-340b-8900-956a8f1a411a","version":342,"action":"UPDATE"},{"gtasId":"15911027","tamrId":"f9dea787-fcac-3e8a-907a-922247aa6658","version":342,"action":"UPDATE"},{"gtasId":"20410591","tamrId":"c68c7454-5734-3dd2-a23a-ab871188ff5a","version":342,"action":"UPDATE"},{"gtasId":"6791054","tamrId":"20ceb21c-b7d4-30c2-a1a4-2c8e57e697cd","version":342,"action":"UPDATE"},{"gtasId":"8656521","tamrId":"148a1462-b799-3c71-b7ec-b8c6e98e6e3a","version":342,"action":"UPDATE"},{"gtasId":"2225663","tamrId":"fa2ad750-95be-3f78-888a-72c970ca9bdc","version":342,"action":"UPDATE"},{"gtasId":"3743817","tamrId":"576a7271-8060-335f-b633-47d434f4feaf","version":342,"action":"UPDATE"},{"gtasId":"4583112","tamrId":"1bf8c1a9-fb34-3b6f-bc8a-ced77b17f830","version":342,"action":"UPDATE"},{"gtasId":"17201430","tamrId":"0f333689-df4d-391e-bf09-00932ce8c029","version":342,"action":"UPDATE"},{"gtasId":"13526324","tamrId":"61798d8b-ddb4-32b7-b916-69cd28d77277","version":342,"action":"UPDATE"},{"gtasId":"10146658","tamrId":"393d2ca7-881b-30ab-847c-7da151bfb602","version":342,"action":"UPDATE"},{"gtasId":"7206945","tamrId":"7822a82f-0b83-3ebb-abcf-cc444171ebc2","version":342,"action":"UPDATE"},{"gtasId":"11628264","tamrId":"0040c3f9-5ffd-3c1e-bf60-45df094db9f9","version":342,"action":"UPDATE"},{"gtasId":"19548544","tamrId":"5d693a2b-c56e-32f9-834e-091614e19be5","version":342,"action":"UPDATE"},{"gtasId":"20357060","tamrId":"cdfdd4e2-cfa6-3cf6-be96-6cbef6982c84","version":342,"action":"UPDATE"},{"gtasId":"2257241","tamrId":"a678d8cb-b9e8-39c5-a9b9-2bc330dfb3b1","version":342,"action":"UPDATE"},{"gtasId":"5252861","tamrId":"d11f3efe-3613-308b-ac85-0a84e91654b0","version":342,"action":"UPDATE"},{"gtasId":"4494547","tamrId":"faddd654-ece8-343f-92ba-6488c022df34","version":342,"action":"UPDATE"},{"gtasId":"11362548","tamrId":"460d81c8-e341-3234-ac5c-30ad63aa7228","version":342,"action":"UPDATE"},{"gtasId":"8794971","tamrId":"d841fde5-4c52-39bc-99a3-7006ae115d9b","version":342,"action":"UPDATE"},{"gtasId":"11730731","tamrId":"c5f944a8-dc4c-35e7-a64f-74593f7d3d89","version":342,"action":"UPDATE"},{"gtasId":"17163525","tamrId":"0969e8f5-066a-3b7e-a827-1d00df400d3d","version":342,"action":"UPDATE"},{"gtasId":"23644632","tamrId":"f065faa0-515c-3add-9e3d-ccae3b162fa2","version":342,"action":"UPDATE"},{"gtasId":"21263192","tamrId":"eb3c705e-d79d-32b4-867c-b991893f3550","version":342,"action":"UPDATE"},{"gtasId":"11246327","tamrId":"57aa6472-5233-3314-a6a7-08d6666efc86","version":342,"action":"UPDATE"},{"gtasId":"3989494","tamrId":"fbffecb0-b4a4-3835-ac45-70c6558e218c","version":342,"action":"UPDATE"},{"gtasId":"9456618","tamrId":"79a6d37a-593d-3005-a7c4-18e91616b554","version":342,"action":"UPDATE"},{"gtasId":"5119208","tamrId":"f058c906-bba6-36fd-bfe1-c300c8cdc7e1","version":342,"action":"UPDATE"},{"gtasId":"14307315","tamrId":"10177281-5e82-3724-adb6-446444173748","version":342,"action":"UPDATE"},{"gtasId":"10427981","tamrId":"7e9e9d23-866e-3942-901d-5be183ecde1c","version":342,"action":"UPDATE"},{"gtasId":"14242393","tamrId":"1a18734f-50e0-3fb9-a875-273804b81bfd","version":342,"action":"UPDATE"},{"gtasId":"13331419","tamrId":"c7743fcb-dadd-31d9-8cd7-9e1e01949496","version":342,"action":"UPDATE"},{"gtasId":"16675005","tamrId":"b27534e2-370f-33d4-a377-bf109d3a787a","version":342,"action":"UPDATE"},{"gtasId":"22212854","tamrId":"94661c03-b220-3263-9a71-039400152cbc","version":342,"action":"UPDATE"},{"gtasId":"20188774","tamrId":"075a8ef5-af6f-3baa-ac4a-dfe7782ffc3f","version":342,"action":"UPDATE"},{"gtasId":"13942155","tamrId":"df4dbf22-3ce8-373d-8c72-24cbb5c0cf34","version":342,"action":"UPDATE"},{"gtasId":"12740516","tamrId":"aa57266d-cc58-3513-8751-ac921a29fa4a","version":342,"action":"UPDATE"},{"gtasId":"10491647","tamrId":"dda82675-ebce-3dd9-978a-a508f03d3c54","version":342,"action":"UPDATE"},{"gtasId":"15447906","tamrId":"1d09fffb-8feb-30b1-a53e-64ab86306aaf","version":342,"action":"UPDATE"},{"gtasId":"22209218","tamrId":"d91b2205-01b0-3760-88ed-66c571e6ef29","version":342,"action":"UPDATE"},{"gtasId":"2753612","tamrId":"b19762c7-4c0a-3c77-a14f-13dc4c1e4728","version":342,"action":"UPDATE"},{"gtasId":"16888605","tamrId":"b91dea65-6432-3150-bb48-9b33d82e4eac","version":342,"action":"UPDATE"},{"gtasId":"11958586","tamrId":"a726b586-5652-359d-9528-bc4b5ab81dfd","version":342,"action":"UPDATE"},{"gtasId":"19013985","tamrId":"0efa2dfd-8150-30d0-a5f5-4851bffca910","version":342,"action":"UPDATE"},{"gtasId":"11671935","tamrId":"28c39037-fd2d-38e9-93d6-d931ef80f987","version":342,"action":"UPDATE"},{"gtasId":"4189510","tamrId":"24777624-c9c4-3ef1-8122-53c529881163","version":342,"action":"UPDATE"},{"gtasId":"15047311","tamrId":"6213d648-cef3-38ac-aabd-7a1c94650c45","version":342,"action":"UPDATE"},{"gtasId":"43815","tamrId":"f0219955-024a-34b8-b1a5-dea94f374ed7","version":342,"action":"UPDATE"},{"gtasId":"6610368","tamrId":"fa82b11d-6bff-3c4f-a720-26c6a22443bb","version":342,"action":"UPDATE"},{"gtasId":"17792995","tamrId":"16a64a1f-b90e-371e-89c9-828075939ddc","version":342,"action":"UPDATE"},{"gtasId":"1877347","tamrId":"e2d62ae1-f977-367a-8cbc-351d0e3b6e5a","version":342,"action":"UPDATE"},{"gtasId":"13900385","tamrId":"6e08c87c-7df0-3f81-8211-2a7265246723","version":342,"action":"UPDATE"},{"gtasId":"15037984","tamrId":"719be961-57ef-3b73-9528-103a56e6fa62","version":342,"action":"UPDATE"},{"gtasId":"2308452","tamrId":"ac9d10d9-c964-3271-9adc-dd9bd3b5f9b7","version":342,"action":"UPDATE"},{"gtasId":"19557479","tamrId":"fb7a1ecf-332a-3795-91c9-6701f8b9f0af","version":342,"action":"UPDATE"},{"gtasId":"17625193","tamrId":"c05f5865-1967-3e40-8cba-1da7738c2a6b","version":342,"action":"UPDATE"},{"gtasId":"8226958","tamrId":"b2580faa-bcc9-30a0-9219-1482cc5270dd","version":342,"action":"UPDATE"},{"gtasId":"22715803","tamrId":"0c6bc974-089e-36b5-bed6-5f0b356233d6","version":342,"action":"UPDATE"},{"gtasId":"12508952","tamrId":"01914bb5-8005-34e5-a036-70b0da8aae0a","version":342,"action":"UPDATE"},{"gtasId":"1366778","tamrId":"61ce5bd0-93f7-3478-b57c-2e7c6cb5b210","version":342,"action":"UPDATE"},{"gtasId":"2832006","tamrId":"e42fcbc3-5fb6-3e76-bc4f-d46cd87cc834","version":342,"action":"UPDATE"},{"gtasId":"15946557","tamrId":"2161cb9a-98c2-3227-96ea-b1c751a5228e","version":342,"action":"UPDATE"},{"gtasId":"10477368","tamrId":"d06c82b3-f40f-3200-84b9-2f1b34e13d05","version":342,"action":"UPDATE"},{"gtasId":"9795863","tamrId":"cae1da15-2b2f-344f-8f6c-45bc2e9627f3","version":342,"action":"UPDATE"},{"gtasId":"9281304","tamrId":"415aaf8b-6f49-3cec-87cf-8323b1f6cb1d","version":342,"action":"UPDATE"},{"gtasId":"5081020","tamrId":"d7c1af5f-1990-3d0b-8fc1-1a7a28e90df6","version":342,"action":"UPDATE"},{"gtasId":"10947468","tamrId":"fcbabb06-dfaf-3c4b-80e1-ea2f9181f002","version":342,"action":"UPDATE"},{"gtasId":"15378902","tamrId":"96a9b6eb-5bb8-3a3a-9f99-2ade56734a35","version":342,"action":"UPDATE"},{"gtasId":"11746292","tamrId":"30edafd6-89f9-3c25-9517-e92c5b6e024a","version":342,"action":"UPDATE"},{"gtasId":"14720089","tamrId":"390fadc3-ef1e-3ca1-a111-be70fcaf31f0","version":342,"action":"UPDATE"},{"gtasId":"854417","tamrId":"aa19fb81-737d-3581-9ccf-7ee9718a01ed","version":342,"action":"UPDATE"},{"gtasId":"11950602","tamrId":"04820e70-0b4e-3753-b753-e9863808afe9","version":342,"action":"UPDATE"},{"gtasId":"913202","tamrId":"57acc3df-9956-3fef-9988-d60e5f5ddbca","version":342,"action":"UPDATE"},{"gtasId":"19151572","tamrId":"aeef7752-4597-36a4-9840-5418e5e4d83d","version":342,"action":"UPDATE"},{"gtasId":"11255282","tamrId":"f69dde8c-0de9-3847-a13a-9461cb87adab","version":342,"action":"UPDATE"},{"gtasId":"11966148","tamrId":"c339052f-0594-3250-a52e-0770177f5d71","version":342,"action":"UPDATE"},{"gtasId":"9430079","tamrId":"09d7ffb1-daf6-36f4-bea9-a1da168d4d5e","version":342,"action":"UPDATE"},{"gtasId":"17490729","tamrId":"3b98a745-7933-3891-bfdc-208f8c032bcc","version":342,"action":"UPDATE"},{"gtasId":"21666882","tamrId":"b345fb72-9a62-3e42-896d-7db708c65065","version":342,"action":"UPDATE"},{"gtasId":"4015135","tamrId":"a602319f-40cc-32b3-bcb4-8068c713b56a","version":342,"action":"UPDATE"},{"gtasId":"2601424","tamrId":"1ea52cb9-a961-3c2e-ba0b-174bd037f04c","version":342,"action":"UPDATE"},{"gtasId":"2670880","tamrId":"85e4ad59-2177-3070-9d39-b82794453b72","version":342,"action":"UPDATE"},{"gtasId":"23514664","tamrId":"ab19fda9-ee21-3bad-9428-65b492da4dce","version":342,"action":"UPDATE"},{"gtasId":"4422013","tamrId":"d47967d7-7430-35b8-b93a-1cb6e62e42a0","version":342,"action":"UPDATE"},{"gtasId":"21185204","tamrId":"1ca4a2db-e0a4-3f36-af42-06acb1fb676e","version":342,"action":"UPDATE"},{"gtasId":"10244187","tamrId":"e06fc2a9-d24d-3425-b47c-504ec36885e2","version":342,"action":"UPDATE"},{"gtasId":"16626096","tamrId":"26d83022-b295-3dc8-9fa7-9dbbe2023081","version":342,"action":"UPDATE"},{"gtasId":"5362362","tamrId":"f1815798-1990-306b-ba2c-bf9598c1cd2c","version":342,"action":"UPDATE"},{"gtasId":"574417","tamrId":"987c4047-934e-31b3-9d6d-34cf413e6004","version":342,"action":"UPDATE"},{"gtasId":"3595594","tamrId":"cedae951-5bed-380b-9b8a-210d5e2f572a","version":342,"action":"UPDATE"},{"gtasId":"1297735","tamrId":"c7c6902d-40bf-3656-bf6c-fcc891428476","version":342,"action":"UPDATE"},{"gtasId":"25163865","tamrId":"5210ce51-20a0-3953-a54a-08490bb425d6","version":342,"action":"UPDATE"},{"gtasId":"11444012","tamrId":"b9808382-910a-35aa-80ad-3ffc4fede227","version":342,"action":"UPDATE"},{"gtasId":"24305877","tamrId":"521f96a4-d8e4-3839-a528-4dc5acccf25d","version":342,"action":"UPDATE"},{"gtasId":"7989497","tamrId":"2b3b47b2-86b0-3c6d-9310-a1da0feea644","version":342,"action":"UPDATE"},{"gtasId":"24266686","tamrId":"a94d2ee6-3b0b-3f99-bd21-1c59bc84dd6a","version":342,"action":"UPDATE"},{"gtasId":"1996615","tamrId":"63262113-3c88-3941-b698-c930933a7a39","version":342,"action":"UPDATE"},{"gtasId":"10768057","tamrId":"39c255a3-dc09-3eca-a361-3a898a1a56a9","version":342,"action":"UPDATE"},{"gtasId":"15484096","tamrId":"044b6c84-3248-3c16-889c-f0478e83db3d","version":342,"action":"UPDATE"},{"gtasId":"11040744","tamrId":"161c180b-b995-34e9-9c7a-2a0833db9dae","version":342,"action":"UPDATE"},{"gtasId":"249891","tamrId":"224ca75c-0649-3eb9-a162-8a37fd4e017b","version":342,"action":"UPDATE"},{"gtasId":"469797","tamrId":"688588f4-8351-31a3-993d-88dff634129f","version":342,"action":"UPDATE"},{"gtasId":"8851129","tamrId":"c2c9ee4e-b9c7-3459-88f5-c0f13ef4832b","version":342,"action":"UPDATE"},{"gtasId":"4664173","tamrId":"c3467284-d10f-3d5f-97a6-eaa456888695","version":342,"action":"UPDATE"},{"gtasId":"1551124","tamrId":"dc30b721-548f-3118-96f2-b0698ab34956","version":342,"action":"UPDATE"},{"gtasId":"11433361","tamrId":"252ef467-9a14-3d89-9e34-394dac36cd02","version":342,"action":"UPDATE"},{"gtasId":"12542829","tamrId":"4ec8e3c7-8515-36de-93f4-eb0473740b83","version":342,"action":"UPDATE"},{"gtasId":"21219061","tamrId":"844c0822-8cf9-3392-94ce-11b93bd84490","version":342,"action":"UPDATE"},{"gtasId":"8936514","tamrId":"e6b70f24-65f4-3aff-bc7a-fcd27da53a53","version":342,"action":"UPDATE"},{"gtasId":"19050925","tamrId":"76fb0a1b-624f-33f8-8022-b66ef45d87f9","version":342,"action":"UPDATE"},{"gtasId":"18440066","tamrId":"1f4c2e0b-6989-37fe-aa62-74a2a7b58c6d","version":342,"action":"UPDATE"},{"gtasId":"1018072","tamrId":"9bbe80dc-a52b-328a-93f5-e4c8e69100ae","version":342,"action":"UPDATE"},{"gtasId":"16103511","tamrId":"3de124ab-eba0-3c80-9c41-77068557d8ba","version":342,"action":"UPDATE"},{"gtasId":"21175069","tamrId":"4734f1c8-a1ec-33b7-bc51-4ce3ff6a7598","version":342,"action":"UPDATE"},{"gtasId":"6289743","tamrId":"0301480f-fb37-375e-920a-9bf3a41c9a45","version":342,"action":"UPDATE"},{"gtasId":"16433220","tamrId":"b38e3ac4-d0ec-373b-abbf-9d84a2e8e678","version":342,"action":"UPDATE"},{"gtasId":"23853307","tamrId":"be068f09-54f2-30e1-8abe-dbb043e328dd","version":342,"action":"UPDATE"},{"gtasId":"23553490","tamrId":"36a858b2-435f-3c1e-bc84-e88cc93338b0","version":342,"action":"UPDATE"},{"gtasId":"5328307","tamrId":"c77d1de5-0ba2-38cc-893f-36557c107e9a","version":342,"action":"UPDATE"},{"gtasId":"6389119","tamrId":"4835413c-532e-33ca-9799-f6e3c9631959","version":342,"action":"UPDATE"},{"gtasId":"2096209","tamrId":"52922b96-6f70-3ad9-914a-3427daf9fb4a","version":342,"action":"UPDATE"},{"gtasId":"2106100","tamrId":"617b22f5-7981-38fd-8f9f-dedb877e71de","version":342,"action":"UPDATE"},{"gtasId":"9385938","tamrId":"40bcc4fa-91f6-3bb5-9d43-75f9ab332e7f","version":342,"action":"UPDATE"},{"gtasId":"15923515","tamrId":"474faf8c-0551-3262-9914-371190dc4b91","version":342,"action":"UPDATE"},{"gtasId":"10014122","tamrId":"557087a2-3949-3bf8-9ab9-08a07b796671","version":342,"action":"UPDATE"},{"gtasId":"9534814","tamrId":"aa8fc0bf-67c2-38ba-88f3-f88e8fa1a749","version":342,"action":"UPDATE"},{"gtasId":"2905061","tamrId":"10af01d2-a0ce-371f-9372-217ef31eb148","version":342,"action":"UPDATE"},{"gtasId":"6505999","tamrId":"4f5c75e1-b917-30e9-ba1b-c345e956f6d0","version":342,"action":"UPDATE"},{"gtasId":"16162737","tamrId":"c34433fd-e91e-37d7-a64f-bebad15f2017","version":342,"action":"UPDATE"},{"gtasId":"16820074","tamrId":"fe890654-37be-327e-bdb4-fcd6741f4e83","version":342,"action":"UPDATE"},{"gtasId":"24617886","tamrId":"8c346d9f-f638-339a-86f0-7e9171fcac4f","version":342,"action":"UPDATE"},{"gtasId":"6171379","tamrId":"6e539738-5fb5-3c64-87fd-63c0296a19db","version":342,"action":"UPDATE"},{"gtasId":"2361419","tamrId":"99e4f0f5-c8e5-3ce9-aaf7-c336496ead18","version":342,"action":"UPDATE"},{"gtasId":"4286187","tamrId":"9df080b5-0ea1-3d11-80d0-2ba538a2e2f0","version":342,"action":"UPDATE"},{"gtasId":"3157571","tamrId":"44784b92-625e-3536-927f-f74c6d7022f9","version":342,"action":"UPDATE"},{"gtasId":"13852194","tamrId":"b7bdb934-f676-3b69-bc7e-8c35ec8414bd","version":342,"action":"UPDATE"},{"gtasId":"11896914","tamrId":"0e0057a6-115c-302a-bbaa-72bcad4a6bd8","version":342,"action":"UPDATE"},{"gtasId":"4096752","tamrId":"a77355f3-1749-3133-a775-13b2f2698c0b","version":342,"action":"UPDATE"},{"gtasId":"22000797","tamrId":"25504e9e-04f3-325d-8ba0-7102daf4a6f2","version":342,"action":"UPDATE"},{"gtasId":"18668085","tamrId":"9e5931ad-2995-33ce-a3af-e4476743e3ec","version":342,"action":"UPDATE"},{"gtasId":"17049300","tamrId":"aed59421-49c2-37f9-9fbd-afc0cf1f713d","version":342,"action":"UPDATE"},{"gtasId":"22151750","tamrId":"7007c127-b8a5-39d8-9458-9214a7b235ba","version":342,"action":"UPDATE"},{"gtasId":"16010448","tamrId":"3648ca4e-80f8-3154-b272-442d33201f54","version":342,"action":"UPDATE"},{"gtasId":"21944150","tamrId":"bb568959-5ad5-3171-99a7-32a9abeeae99","version":342,"action":"UPDATE"},{"gtasId":"22023412","tamrId":"a5cc517f-0717-35db-84ec-576bf5c3d9a7","version":342,"action":"UPDATE"},{"gtasId":"1610729","tamrId":"a8b5c28e-ea8f-3d53-81a3-6fb8149568aa","version":342,"action":"UPDATE"},{"gtasId":"9884149","tamrId":"73318c15-f517-348e-b729-a2a66a69a4cd","version":342,"action":"UPDATE"},{"gtasId":"15107227","tamrId":"3a1bf187-5324-3f6c-9ed0-7c1a313aa8b8","version":342,"action":"UPDATE"},{"gtasId":"3470404","tamrId":"1ce701a8-7b31-3721-8412-7b64e0bec01f","version":342,"action":"UPDATE"},{"gtasId":"9244328","tamrId":"4859692c-6a9d-3e78-9dbc-5dac66c16161","version":342,"action":"UPDATE"},{"gtasId":"17907127","tamrId":"1a1f27cd-e497-3e19-8ce8-4bf6fb9b3ade","version":342,"action":"UPDATE"},{"gtasId":"10970759","tamrId":"42b0c849-1b2e-3fef-a446-3f4911f8ee69","version":342,"action":"UPDATE"},{"gtasId":"6300604","tamrId":"42e308f3-f2f4-3631-9bc2-e2ac1eec0019","version":342,"action":"UPDATE"},{"gtasId":"24825990","tamrId":"69619f99-f792-33cf-88df-4d1419757406","version":342,"action":"UPDATE"},{"gtasId":"23014390","tamrId":"a4bc4394-a546-3e09-ba68-1f332319378b","version":342,"action":"UPDATE"},{"gtasId":"1473812","tamrId":"80843050-44b5-3439-ab96-f49b3d87de02","version":342,"action":"UPDATE"},{"gtasId":"4382868","tamrId":"2962ae28-af50-3002-8afa-6c94d59c3fc5","version":342,"action":"UPDATE"},{"gtasId":"13314376","tamrId":"ca21148b-2fa2-341a-bb47-bb27227bbe18","version":342,"action":"UPDATE"},{"gtasId":"15981429","tamrId":"a59096dd-8393-31c8-af42-bdc1a99846a1","version":342,"action":"UPDATE"},{"gtasId":"675880","tamrId":"a4612966-25e5-3882-af6f-6d46d4d0a2f6","version":342,"action":"UPDATE"},{"gtasId":"2943363","tamrId":"fa782af2-9927-3460-a3dd-95608ffa459e","version":342,"action":"UPDATE"},{"gtasId":"22214190","tamrId":"4c1cd19a-f6cb-3e0e-9cbf-b191b0005f2e","version":342,"action":"UPDATE"},{"gtasId":"22986651","tamrId":"e0848bf2-c15e-36f1-80b6-a1cf47af8993","version":342,"action":"UPDATE"},{"gtasId":"8323817","tamrId":"8bea8dee-fb4b-3dbd-89ab-0a4cd8d2a275","version":342,"action":"UPDATE"},{"gtasId":"11655908","tamrId":"fb599ad8-20c2-3bc4-8486-5e08b5e1e8d7","version":342,"action":"UPDATE"},{"gtasId":"1782636","tamrId":"c8058d3f-df0b-322f-8946-0a78f5ee502a","version":342,"action":"UPDATE"},{"gtasId":"23759258","tamrId":"a7881d1d-e8df-3f2e-a94f-b29e18668cd6","version":342,"action":"UPDATE"},{"gtasId":"11745942","tamrId":"37d32ab3-e042-3a95-9ffc-c728be39aa0f","version":342,"action":"UPDATE"},{"gtasId":"14393873","tamrId":"5bdd95ea-2e47-361a-9786-110a40da64bc","version":342,"action":"UPDATE"},{"gtasId":"23854606","tamrId":"ff69ab9d-73a3-329d-8b53-7200cf1b7b86","version":342,"action":"UPDATE"},{"gtasId":"10488521","tamrId":"f2c9f52e-90d0-3cec-812a-15e8192d9e39","version":342,"action":"UPDATE"},{"gtasId":"1481420","tamrId":"901eacee-df9c-3c05-a06b-70a122f3ec84","version":342,"action":"UPDATE"},{"gtasId":"14098807","tamrId":"1e0a0969-c3c9-3f8a-9daa-8e3b3dd0a001","version":342,"action":"UPDATE"},{"gtasId":"11871616","tamrId":"24e630a0-aad6-3524-9997-b943e757334b","version":342,"action":"UPDATE"},{"gtasId":"21887012","tamrId":"f35d44e9-11b9-3b64-b640-134da689c9d4","version":342,"action":"UPDATE"},{"gtasId":"13062132","tamrId":"c88e9231-8648-3648-832a-72b0e7fdea70","version":342,"action":"UPDATE"},{"gtasId":"5101644","tamrId":"d6c74da9-0a6b-3e64-a48e-c14d5dd29c3c","version":342,"action":"UPDATE"},{"gtasId":"5798318","tamrId":"3ebc17ad-b838-3b95-a6e1-cd8aed7c12bf","version":342,"action":"UPDATE"},{"gtasId":"21317619","tamrId":"448def5e-6a32-380c-9950-c90a79a673ae","version":342,"action":"UPDATE"},{"gtasId":"6779003","tamrId":"53d64cb0-ba6d-3be2-bc77-ba1ff0d845e6","version":342,"action":"UPDATE"},{"gtasId":"5716457","tamrId":"d784a3a1-975b-3dae-85f4-e420f71a76d4","version":342,"action":"UPDATE"},{"gtasId":"540984","tamrId":"98fd76b5-c883-3291-87ed-36c089d8ecac","version":342,"action":"UPDATE"},{"gtasId":"2883157","tamrId":"1d57b84b-97c8-3930-a32e-9a477bfd5e67","version":342,"action":"UPDATE"},{"gtasId":"19319071","tamrId":"9d3ba530-88e3-39d5-825f-6a2c576105b7","version":342,"action":"UPDATE"},{"gtasId":"5932127","tamrId":"58e66d4c-c3b3-3f5a-9147-d1ed93af9549","version":342,"action":"UPDATE"},{"gtasId":"14001865","tamrId":"77637fb6-ce25-37ce-99aa-c216fffef263","version":342,"action":"UPDATE"},{"gtasId":"19986424","tamrId":"9610f17b-c758-3acc-8dff-2651dbb31f11","version":342,"action":"UPDATE"},{"gtasId":"10240079","tamrId":"3ca2bd65-f6d3-31b7-83d2-4ffe9f5cb238","version":342,"action":"UPDATE"},{"gtasId":"14450936","tamrId":"6a138458-7976-39c0-90ab-18c44ddb0fe3","version":342,"action":"UPDATE"},{"gtasId":"19228579","tamrId":"1f78da13-9594-3764-a6dd-7a1ebd935d18","version":342,"action":"UPDATE"},{"gtasId":"23727608","tamrId":"501da572-3dbb-383b-b9a1-b16f023d5154","version":342,"action":"UPDATE"},{"gtasId":"25312106","tamrId":"b3a747fd-50b4-358d-811c-99c70513255c","version":342,"action":"UPDATE"},{"gtasId":"3377698","tamrId":"482ebbd1-99e3-3e41-8bd9-6a97e8cc3664","version":342,"action":"UPDATE"},{"gtasId":"6035470","tamrId":"985a7063-1faf-36fa-88ee-2ab732a6b40d","version":342,"action":"UPDATE"},{"gtasId":"10418602","tamrId":"f1f3b8a5-8de8-393d-99e3-80ed3e4307ce","version":342,"action":"UPDATE"},{"gtasId":"2003660","tamrId":"2a83bc9d-55c8-3cda-82bd-3b2438c6dfee","version":342,"action":"UPDATE"},{"gtasId":"20596219","tamrId":"6b572ce0-401a-313c-a0ff-72c33d8c4f1a","version":342,"action":"UPDATE"},{"gtasId":"10438218","tamrId":"37a2058a-66b7-3799-a847-0527c028daee","version":342,"action":"UPDATE"},{"gtasId":"5184824","tamrId":"69fdf5e6-f35f-32b9-b33c-c21494a08057","version":342,"action":"UPDATE"},{"gtasId":"23671552","tamrId":"57d35098-f5a2-3c14-8e76-bad070cc998f","version":342,"action":"UPDATE"},{"gtasId":"7465205","tamrId":"1efa4a51-4116-38b5-b9c6-de945cb47060","version":342,"action":"UPDATE"},{"gtasId":"5204911","tamrId":"ea18520f-ac77-32ce-afa5-9adf7ac01475","version":342,"action":"UPDATE"},{"gtasId":"9445287","tamrId":"77cf0ab6-41ab-3b94-bd46-832f15544e1f","version":342,"action":"UPDATE"},{"gtasId":"19312423","tamrId":"362da2fd-237f-3c56-ad1c-937c972c4be6","version":342,"action":"UPDATE"},{"gtasId":"6697465","tamrId":"389de747-2ad4-3b50-941a-2982feefaedb","version":342,"action":"UPDATE"},{"gtasId":"7453205","tamrId":"f3886911-c944-3550-99a3-8777440fa33f","version":342,"action":"UPDATE"},{"gtasId":"6587899","tamrId":"aedee352-9060-34ec-99c0-3a1e75ab0e3e","version":342,"action":"UPDATE"},{"gtasId":"691938","tamrId":"6ea3f25b-a2cb-33ef-9bb0-2f8b5f2dc9b2","version":342,"action":"UPDATE"},{"gtasId":"11377468","tamrId":"bcab139d-2e60-3c26-b1a4-196508561056","version":342,"action":"UPDATE"},{"gtasId":"23048567","tamrId":"0feb7f84-bf56-3d87-a530-7ed6a0b51a74","version":342,"action":"UPDATE"},{"gtasId":"917890","tamrId":"979fd6cc-acc3-3bf3-9b39-398349ad27ec","version":342,"action":"UPDATE"},{"gtasId":"936171","tamrId":"01cbafee-7970-3e46-81f5-09f966580cf6","version":342,"action":"UPDATE"},{"gtasId":"1489356","tamrId":"bd126646-42b6-36b9-b1c3-a95887deab89","version":342,"action":"UPDATE"},{"gtasId":"1330431","tamrId":"d07e6c26-247c-3d98-9a04-abd79acb011f","version":342,"action":"UPDATE"},{"gtasId":"5835895","tamrId":"8dd7e562-e78c-3a59-bc30-8cab6bfdba92","version":342,"action":"UPDATE"},{"gtasId":"13420412","tamrId":"b0442ccc-80bc-34cc-bc25-43f27ac71d24","version":342,"action":"UPDATE"},{"gtasId":"10140687","tamrId":"ed84b45a-55ed-3551-99a8-6f311a2edb60","version":342,"action":"UPDATE"},{"gtasId":"7090901","tamrId":"4ec81c65-3ae5-390a-8729-a6e2670a7b7f","version":342,"action":"UPDATE"},{"gtasId":"19759209","tamrId":"af32ca4d-2d63-334e-9cc6-b0c5ad120237","version":342,"action":"UPDATE"},{"gtasId":"15472156","tamrId":"39671fdc-2d16-37d9-80cc-abd8cb934e29","version":342,"action":"UPDATE"},{"gtasId":"22092029","tamrId":"dc49c9ef-6a3e-32d8-8c85-22de0c0d2bdb","version":342,"action":"UPDATE"},{"gtasId":"16597516","tamrId":"ffbbd3f3-3a4b-331f-9b4b-354c1ad49022","version":342,"action":"UPDATE"},{"gtasId":"951770","tamrId":"c617fe14-f70b-3295-8693-63b5f4de3912","version":342,"action":"UPDATE"},{"gtasId":"21613984","tamrId":"5444458d-2c06-31f7-a694-f7b695dd4875","version":342,"action":"UPDATE"},{"gtasId":"8317177","tamrId":"85baece0-1515-3f1a-bedb-2d600e8ebb90","version":342,"action":"UPDATE"},{"gtasId":"19252219","tamrId":"bebd795d-90c0-3645-a6f7-e862ce85de60","version":342,"action":"UPDATE"},{"gtasId":"3942734","tamrId":"81d1c6fe-6cef-3683-baa4-8c4a56661aa6","version":342,"action":"UPDATE"},{"gtasId":"89382","tamrId":"81789390-9496-3639-82ee-10d4f3daa6f9","version":342,"action":"UPDATE"},{"gtasId":"5872802","tamrId":"e100b062-0f41-3aee-b738-f4ec2c351e36","version":342,"action":"UPDATE"},{"gtasId":"20717080","tamrId":"62444000-c8d2-3c8b-81fc-bf54d6f980ea","version":342,"action":"UPDATE"},{"gtasId":"20655116","tamrId":"79c99682-3406-3961-b074-3ab6c0a47ea1","version":342,"action":"UPDATE"},{"gtasId":"12424124","tamrId":"ee0e9e2e-b2cc-342c-b8df-f2eebe0e5bf1","version":342,"action":"UPDATE"},{"gtasId":"6906514","tamrId":"a0654d00-a1fc-31e3-a629-ba547f9453ff","version":342,"action":"UPDATE"},{"gtasId":"21877659","tamrId":"5298f180-9ed3-34b0-b2c3-31f8640df7a1","version":342,"action":"UPDATE"},{"gtasId":"13760372","tamrId":"15b2450f-f753-3d66-a631-2f33e254c207","version":342,"action":"UPDATE"},{"gtasId":"11347609","tamrId":"3018fadd-0b5d-3219-820d-4d8c1b1fbcb8","version":342,"action":"UPDATE"},{"gtasId":"14776591","tamrId":"03be114f-fafb-397d-a57e-3089a0580bf6","version":342,"action":"UPDATE"},{"gtasId":"9472873","tamrId":"17b48f5a-8e37-3272-8c2a-8f1eba613559","version":342,"action":"UPDATE"},{"gtasId":"7919655","tamrId":"698c9df1-d60f-3ca3-932f-6bcb2530071b","version":342,"action":"UPDATE"},{"gtasId":"8776405","tamrId":"9aa6b1cf-e8fd-316a-a5a6-f4eb2d957f9d","version":342,"action":"UPDATE"},{"gtasId":"19377798","tamrId":"eee5cfd0-5f22-3dc7-89ef-46ec108fe421","version":342,"action":"UPDATE"},{"gtasId":"17941898","tamrId":"ba9e35ad-81ec-38ef-8a77-74f9b3895f4b","version":342,"action":"UPDATE"},{"gtasId":"23919648","tamrId":"7394c7fa-e6e9-3f75-a757-425ac0e33923","version":342,"action":"UPDATE"},{"gtasId":"9685839","tamrId":"f0219955-024a-34b8-b1a5-dea94f374ed7","version":342,"action":"UPDATE"},{"gtasId":"8190106","tamrId":"f54e117b-14cb-3220-ab80-bcad4f3bd2ae","version":342,"action":"UPDATE"},{"gtasId":"7384952","tamrId":"958b087c-3092-3945-86a1-2edca9949ceb","version":342,"action":"UPDATE"},{"gtasId":"17764999","tamrId":"10226e3a-32a7-3039-8e86-e931992b4a60","version":342,"action":"UPDATE"},{"gtasId":"2534323","tamrId":"0fbda675-3b8b-3e6b-95db-8adb47bf5f97","version":342,"action":"UPDATE"},{"gtasId":"15625496","tamrId":"61692313-9b58-3d33-88e0-3a82dd24eeb2","version":342,"action":"UPDATE"},{"gtasId":"9558845","tamrId":"043167cb-0b53-36e2-94b5-3ae9a3041a90","version":342,"action":"UPDATE"},{"gtasId":"4844065","tamrId":"41749384-9e94-33fb-8be0-08ecc3106152","version":342,"action":"UPDATE"},{"gtasId":"8633061","tamrId":"8ae24a7e-b7b4-362f-b8e4-f98a3e3204b9","version":342,"action":"UPDATE"},{"gtasId":"5580505","tamrId":"ff1ccbd1-30da-35dd-a329-70c0ec0f90e1","version":342,"action":"UPDATE"},{"gtasId":"11579684","tamrId":"e8a0618e-aa66-3d55-a98c-7653a839e48e","version":342,"action":"UPDATE"},{"gtasId":"1799433","tamrId":"a7a9e5d5-e22d-3ed4-a992-b60c3b4c39e0","version":342,"action":"UPDATE"},{"gtasId":"11254549","tamrId":"5c9198ee-f118-3299-9e0e-aecc17d1884c","version":342,"action":"UPDATE"},{"gtasId":"14406872","tamrId":"fd4c6c3c-3e44-31c7-af0a-a2a449204d17","version":342,"action":"UPDATE"},{"gtasId":"14135438","tamrId":"0e5c8426-b0d8-39e9-bb72-9d15f03b4015","version":342,"action":"UPDATE"},{"gtasId":"14573055","tamrId":"ab11bc74-1be9-386e-b862-fbf1993aaffd","version":342,"action":"UPDATE"},{"gtasId":"22810343","tamrId":"ec9ac0db-fbd8-3293-9032-9c350dc5c172","version":342,"action":"UPDATE"},{"gtasId":"1018922","tamrId":"155fe5df-a071-3397-b4c5-397653484465","version":342,"action":"UPDATE"},{"gtasId":"12243619","tamrId":"bf4a6616-d1b9-3db0-8d13-bd1416fd423d","version":342,"action":"UPDATE"},{"gtasId":"14869681","tamrId":"18eb94a9-a50c-3796-bd0b-0a670d639a65","version":342,"action":"UPDATE"},{"gtasId":"18785653","tamrId":"2192a131-944f-3897-8c73-23f5dd35d023","version":342,"action":"UPDATE"},{"gtasId":"19553488","tamrId":"ed154822-6a9c-3fa1-b89a-6adfc8e326c2","version":342,"action":"UPDATE"},{"gtasId":"6846300","tamrId":"8995ca86-7ea9-384a-b1bf-9ba6427ad42f","version":342,"action":"UPDATE"},{"gtasId":"19103855","tamrId":"493f46b8-a1cd-37b5-a690-a450ab0cb6de","version":342,"action":"UPDATE"},{"gtasId":"8543049","tamrId":"6e7914ca-86a6-3406-aef3-d0ed1d17defa","version":342,"action":"UPDATE"},{"gtasId":"23050080","tamrId":"a31e41fd-237e-311d-b6cb-a00d167a9bfa","version":342,"action":"UPDATE"},{"gtasId":"15777753","tamrId":"7bc3304d-77ba-3e09-ab0f-e5df3fd5357f","version":342,"action":"UPDATE"},{"gtasId":"25400333","tamrId":"63262113-3c88-3941-b698-c930933a7a39","version":342,"action":"UPDATE"},{"gtasId":"22092059","tamrId":"7e93ff7e-61b0-334f-8be2-fff178175dc7","version":342,"action":"UPDATE"},{"gtasId":"17358970","tamrId":"48faec10-2e75-3291-acef-0a83018d5b52","version":342,"action":"UPDATE"},{"gtasId":"7159517","tamrId":"4f607213-8b6f-3a53-8d7e-a00f9810e6cc","version":342,"action":"UPDATE"},{"gtasId":"4770994","tamrId":"9dbbd3b3-afda-3973-8757-ebe458c6ef6d","version":342,"action":"UPDATE"},{"gtasId":"24625450","tamrId":"4efc5d5b-f699-3072-8047-7966d9e703b2","version":342,"action":"UPDATE"},{"gtasId":"5359464","tamrId":"55c37187-52cf-31be-9ccb-672e6297f193","version":342,"action":"UPDATE"},{"gtasId":"17238254","tamrId":"ffb421be-2a5e-3566-a13c-e64e0445a182","version":342,"action":"UPDATE"},{"gtasId":"1183397","tamrId":"fc872e94-d48b-3b3d-954b-ffb250ce4b04","version":342,"action":"UPDATE"},{"gtasId":"7266891","tamrId":"38252327-25de-3614-b3b1-5af4756b05f9","version":342,"action":"UPDATE"},{"gtasId":"3456970","tamrId":"eb75ac9e-66d4-3486-a16a-1179696ece60","version":342,"action":"UPDATE"},{"gtasId":"24908820","tamrId":"d70ec42f-d4ee-366b-ad95-a5aceed68b59","version":342,"action":"UPDATE"},{"gtasId":"8614776","tamrId":"c72c17a5-e56d-3038-9f4e-b13accddede7","version":342,"action":"UPDATE"},{"gtasId":"1039838","tamrId":"4d630bed-8d7a-37bd-b318-12a1d8f49ce2","version":342,"action":"UPDATE"},{"gtasId":"17357655","tamrId":"e903ba24-0fd9-31d1-8a2b-70209f50f9d5","version":342,"action":"UPDATE"},{"gtasId":"19904501","tamrId":"9ade4bd7-9a20-330d-8850-5368e12fe583","version":342,"action":"UPDATE"},{"gtasId":"21183501","tamrId":"61d0a7e6-69a4-3445-a19c-ed1664b19c8b","version":342,"action":"UPDATE"},{"gtasId":"4723714","tamrId":"7b554798-51ff-3899-ae8d-ab9b476cd247","version":342,"action":"UPDATE"},{"gtasId":"6155294","tamrId":"1722bda4-8abe-3ab9-8ea6-1e466f51fa1f","version":342,"action":"UPDATE"},{"gtasId":"10106784","tamrId":"0488df36-9a1d-3d82-8598-60d1e9497df3","version":342,"action":"UPDATE"},{"gtasId":"22018009","tamrId":"a62c70e9-68d0-35d3-ae27-a8a54b9a4177","version":342,"action":"UPDATE"},{"gtasId":"3175405","tamrId":"f2984f9d-19ce-3466-ba4f-20d762b1ebda","version":342,"action":"UPDATE"},{"gtasId":"1040808","tamrId":"c7e55e05-59d7-3519-8597-96cdc9d12f8f","version":342,"action":"UPDATE"},{"gtasId":"17974790","tamrId":"9cf26431-a1fb-39a3-b770-979abc12ae7d","version":342,"action":"UPDATE"},{"gtasId":"8158022","tamrId":"353f38ea-da53-3582-82e4-6d0164ee2145","version":342,"action":"UPDATE"},{"gtasId":"7037091","tamrId":"0ed9b4a5-c273-3b4b-b5a0-6cd2558dbf30","version":342,"action":"UPDATE"},{"gtasId":"11217587","tamrId":"d19578a9-f54c-3c44-98d8-896e66d425cb","version":342,"action":"UPDATE"},{"gtasId":"13576287","tamrId":"a2a87f4d-7334-3911-8e0f-3af3d05f320b","version":342,"action":"UPDATE"},{"gtasId":"86235","tamrId":"d99609b6-50ab-38fc-bfdf-dcb6ce79112d","version":342,"action":"UPDATE"},{"gtasId":"9692152","tamrId":"bd3584f6-024e-3354-a0d5-eb61599f2771","version":342,"action":"UPDATE"},{"gtasId":"1103238","tamrId":"5f5c7c0b-ee36-3fd5-aa56-df5ced71263e","version":342,"action":"UPDATE"},{"gtasId":"17283799","tamrId":"7148d751-6497-374c-967a-1a09ee3008a5","version":342,"action":"UPDATE"},{"gtasId":"14405576","tamrId":"89361b51-79d9-3163-a127-a6be6a621d05","version":342,"action":"UPDATE"},{"gtasId":"5442892","tamrId":"7f82cd8a-38a1-36c5-a981-ffa425ab4084","version":342,"action":"UPDATE"},{"gtasId":"11587285","tamrId":"495346ac-d15d-34b0-92ac-3d3348c209bc","version":342,"action":"UPDATE"},{"gtasId":"8784073","tamrId":"964a2a09-a037-30a3-8039-4252ae1a82ba","version":342,"action":"UPDATE"},{"gtasId":"7966849","tamrId":"06a846f3-1a59-3d9a-843d-df8b1f5e1ec7","version":342,"action":"UPDATE"},{"gtasId":"10595921","tamrId":"2c050071-11e1-30ad-ac6a-a99c837511bf","version":342,"action":"UPDATE"},{"gtasId":"11850725","tamrId":"f66d51c9-d7e2-3d53-8a30-f7fdac4748d5","version":342,"action":"UPDATE"},{"gtasId":"17187073","tamrId":"1b2fd604-671b-34a5-b4e6-e94895b477e7","version":342,"action":"UPDATE"},{"gtasId":"19192966","tamrId":"9fa4003c-18c0-3c68-bb19-823a16820ae0","version":342,"action":"UPDATE"},{"gtasId":"3906180","tamrId":"3a1bf187-5324-3f6c-9ed0-7c1a313aa8b8","version":342,"action":"UPDATE"},{"gtasId":"9088325","tamrId":"4428c27d-574c-3b30-acab-d819499bde65","version":342,"action":"UPDATE"},{"gtasId":"11085199","tamrId":"b43394ba-7f58-3278-acdd-fd63038be6b9","version":342,"action":"UPDATE"},{"gtasId":"14814502","tamrId":"73ad74ed-a092-31f3-8f06-d30c862a6e4e","version":342,"action":"UPDATE"},{"gtasId":"8146026","tamrId":"2670873a-58bb-3cc5-aacd-8e6296f18156","version":342,"action":"UPDATE"},{"gtasId":"4921669","tamrId":"73a40a97-56d6-3be2-8b36-fa55512f39b8","version":342,"action":"UPDATE"},{"gtasId":"19542797","tamrId":"41973827-f82e-3d11-b3d7-263e8e610e82","version":342,"action":"UPDATE"},{"gtasId":"24292174","tamrId":"39a68dc2-2995-3b45-aae3-751e74e88ac8","version":342,"action":"UPDATE"},{"gtasId":"4422600","tamrId":"2f7b8204-94d8-315b-8659-be9256c76159","version":342,"action":"UPDATE"},{"gtasId":"11057958","tamrId":"6108414a-9739-3724-bf04-9a96aebe909b","version":342,"action":"UPDATE"},{"gtasId":"5150673","tamrId":"a8cca362-c4bd-3dea-9ea0-172641f833b3","version":342,"action":"UPDATE"},{"gtasId":"10743547","tamrId":"31dc5eef-0b82-3a65-b29c-50f03ad6fe79","version":342,"action":"UPDATE"},{"gtasId":"8219561","tamrId":"8f10342d-2a9b-3c85-a15c-e250fe158103","version":342,"action":"UPDATE"},{"gtasId":"17522639","tamrId":"a029ab67-fedf-3b16-a1d0-15e41dfdb041","version":342,"action":"UPDATE"},{"gtasId":"741065","tamrId":"017b1fd5-579d-35c8-afde-f1a4780e6b0b","version":342,"action":"UPDATE"},{"gtasId":"19687048","tamrId":"29774025-497a-3217-916a-1ca6b2cc07e7","version":342,"action":"UPDATE"},{"gtasId":"18808050","tamrId":"e84dca1b-2823-3978-8262-6b9c9a196c6e","version":342,"action":"UPDATE"},{"gtasId":"13834386","tamrId":"2d0b7b69-d9ec-37df-8dae-f4d1862f36da","version":342,"action":"UPDATE"},{"gtasId":"6272043","tamrId":"f232b778-5cf0-3692-986d-c8525ae3ac23","version":342,"action":"UPDATE"},{"gtasId":"17740110","tamrId":"59a6b70c-fa98-38d7-bfd3-35f1e9e674c3","version":342,"action":"UPDATE"},{"gtasId":"25484816","tamrId":"72fb907d-fcaa-37e9-9713-398cfc8b1890","version":342,"action":"UPDATE"},{"gtasId":"16673713","tamrId":"774bed09-f305-3689-baf0-b27502b0adce","version":342,"action":"UPDATE"},{"gtasId":"19739689","tamrId":"febd06c5-de3d-3107-90b6-cd7a247ee997","version":342,"action":"UPDATE"},{"gtasId":"23269196","tamrId":"3086fb4c-0e73-3701-bd43-98bfe64b2537","version":342,"action":"UPDATE"},{"gtasId":"23124876","tamrId":"e572531f-2852-3b5b-bddf-299382039037","version":342,"action":"UPDATE"},{"gtasId":"2864810","tamrId":"02216d9e-3c81-359c-bbef-7aa0bad1bd7e","version":342,"action":"UPDATE"},{"gtasId":"12367003","tamrId":"7ff8fa01-643f-3e85-83de-e3845e1fb6c0","version":342,"action":"UPDATE"},{"gtasId":"3383515","tamrId":"b0c7f540-ad90-368e-94c0-8a5e5416bb3d","version":342,"action":"UPDATE"},{"gtasId":"6151733","tamrId":"0f62d9bb-db21-338d-a4bd-6fff29bab08e","version":342,"action":"UPDATE"},{"gtasId":"5287336","tamrId":"ecda3812-1f56-356f-afdf-c6b51a0fda65","version":342,"action":"UPDATE"},{"gtasId":"1681097","tamrId":"2b83779f-fda7-3d4a-9c5c-e03d861a472c","version":342,"action":"UPDATE"},{"gtasId":"16113774","tamrId":"21764ac7-fd97-30b2-849e-03bce3f31996","version":342,"action":"UPDATE"},{"gtasId":"2181392","tamrId":"92997989-dabb-3eec-b0a2-2baa02f4776a","version":342,"action":"UPDATE"},{"gtasId":"18687193","tamrId":"730422d9-273e-38da-8768-9f6aede88a8c","version":342,"action":"UPDATE"},{"gtasId":"8464622","tamrId":"91369da5-5230-3d32-bb05-0e2df128286c","version":342,"action":"UPDATE"},{"gtasId":"15541271","tamrId":"082e9387-b7d8-3359-863d-d4df811436a3","version":342,"action":"UPDATE"},{"gtasId":"23506248","tamrId":"ffb489c2-b0d0-38f0-ae89-87985f5c4690","version":342,"action":"UPDATE"},{"gtasId":"1951175","tamrId":"bc5b05cf-8b6c-3175-a343-3a4c1464cd1e","version":342,"action":"UPDATE"},{"gtasId":"11835129","tamrId":"d0484b0a-af2f-3cce-9e47-3017e140e6fa","version":342,"action":"UPDATE"},{"gtasId":"10474795","tamrId":"5e2a14bf-f377-33a1-bf54-778cd0a2700e","version":342,"action":"UPDATE"},{"gtasId":"22232804","tamrId":"ff93502b-d059-30d6-8937-4eec0fa93d25","version":342,"action":"UPDATE"},{"gtasId":"3802497","tamrId":"1b05903f-3bb1-3e4c-a543-5320c5324811","version":342,"action":"UPDATE"},{"gtasId":"5850633","tamrId":"468e4fb1-e7af-39b8-9e4b-7dbbd12cadfb","version":342,"action":"UPDATE"},{"gtasId":"8962345","tamrId":"a92750c1-d79c-35c1-a660-3d788a5ff29e","version":342,"action":"UPDATE"},{"gtasId":"25199235","tamrId":"d51be5bb-9d3f-3b0c-be42-2966bba2bca0","version":342,"action":"UPDATE"},{"gtasId":"1821902","tamrId":"4f11d155-bc13-34e5-a7e2-347efe321d29","version":342,"action":"UPDATE"},{"gtasId":"10002953","tamrId":"3ea168d8-94af-35e6-abb6-ccd4b4f44af4","version":342,"action":"UPDATE"},{"gtasId":"13720307","tamrId":"e8f88919-a929-36eb-97f7-878ffa02a561","version":342,"action":"UPDATE"},{"gtasId":"6989703","tamrId":"ca3f9a7d-8737-38ff-b9c0-7aa76716acb7","version":342,"action":"UPDATE"},{"gtasId":"56404","tamrId":"dbec9306-0cc0-3ccf-8714-e1bf35abd24e","version":342,"action":"UPDATE"},{"gtasId":"5733895","tamrId":"4bdb33a5-14e2-3946-8348-76fecbfc6226","version":342,"action":"UPDATE"},{"gtasId":"10717187","tamrId":"c28d92ab-b324-340b-89f6-5d8a948fbd76","version":342,"action":"UPDATE"},{"gtasId":"24719857","tamrId":"393d2ca7-881b-30ab-847c-7da151bfb602","version":342,"action":"UPDATE"},{"gtasId":"5711642","tamrId":"c1e94a04-c2e9-3b2a-b446-78a6f6d6fe65","version":342,"action":"UPDATE"},{"gtasId":"8334573","tamrId":"1e2e89d4-aa9c-3ff0-ba2e-1e1a0b4d3279","version":342,"action":"UPDATE"},{"gtasId":"3985026","tamrId":"64966d7d-96e0-3126-a14d-d1796d7763ee","version":342,"action":"UPDATE"},{"gtasId":"9869308","tamrId":"15823acf-127f-3a55-bbec-27897ec7924f","version":342,"action":"UPDATE"},{"gtasId":"7262594","tamrId":"2bc49aa7-917d-3d26-9ba9-cfcf69036fd8","version":342,"action":"UPDATE"},{"gtasId":"9402921","tamrId":"5b93b40d-617c-31c4-92d1-e816a1502004","version":342,"action":"UPDATE"},{"gtasId":"12235148","tamrId":"9f274292-452b-3570-86ba-b639ecc0b0f6","version":342,"action":"UPDATE"},{"gtasId":"11588567","tamrId":"5fd0b094-d842-3108-b64c-25e8e493dd1a","version":342,"action":"UPDATE"},{"gtasId":"20501897","tamrId":"d8ede490-2029-3d67-a42b-cd70f08fc5ed","version":342,"action":"UPDATE"},{"gtasId":"25525875","tamrId":"13b6a573-442b-3fe0-a9dc-bfd157f74687","version":342,"action":"UPDATE"},{"gtasId":"4273653","tamrId":"7f9599a5-9cce-300f-b702-5a2ec9f2b741","version":342,"action":"UPDATE"},{"gtasId":"12032412","tamrId":"32edbf76-fda2-38b2-ba86-40741855a7f5","version":342,"action":"UPDATE"},{"gtasId":"14084288","tamrId":"a69492f9-4e81-3c9c-8991-1e5724fe69a0","version":342,"action":"UPDATE"},{"gtasId":"24289483","tamrId":"b98188c6-71e1-3ebe-9fbe-ae6174ebf80d","version":342,"action":"UPDATE"},{"gtasId":"9318316","tamrId":"d33ee07c-d04f-3d95-bba6-dbae6c542379","version":342,"action":"UPDATE"},{"gtasId":"10215108","tamrId":"c94e5663-945d-3964-a838-628a043a80b3","version":342,"action":"UPDATE"},{"gtasId":"6244046","tamrId":"53880547-aad8-3a0f-b4fb-ab166b10bf2a","version":342,"action":"UPDATE"},{"gtasId":"24978779","tamrId":"e7b2bedd-5085-3e30-a4f2-c2482f977171","version":342,"action":"UPDATE"},{"gtasId":"9192593","tamrId":"9502c4b7-7550-3da3-82e8-3ac658594110","version":342,"action":"UPDATE"},{"gtasId":"16745066","tamrId":"e2dac9cd-0b10-36f1-9916-83f3c0a12a45","version":342,"action":"UPDATE"},{"gtasId":"6313010","tamrId":"5864fd08-19b0-3d3b-ba28-ec64afc8d8f4","version":342,"action":"UPDATE"},{"gtasId":"4040270","tamrId":"45812af3-b9b3-37ef-b7ee-32cae4f013d0","version":342,"action":"UPDATE"},{"gtasId":"20519179","tamrId":"c1259066-04cb-30dd-ae62-644f599c1b9b","version":342,"action":"UPDATE"},{"gtasId":"13692505","tamrId":"6b671864-223e-3f2e-9f44-a6aa8e62c7c0","version":342,"action":"UPDATE"},{"gtasId":"22877546","tamrId":"57208aaf-ce02-3f9a-bd17-57ec6471201e","version":342,"action":"UPDATE"},{"gtasId":"21904012","tamrId":"04924a98-6a29-373e-931c-8ba1203c2c19","version":342,"action":"UPDATE"},{"gtasId":"5175871","tamrId":"598cc7ca-3f1a-32a9-a2f0-f66f9f94a49a","version":342,"action":"UPDATE"},{"gtasId":"8921768","tamrId":"00b27e34-5176-3285-baa3-6803506e8373","version":342,"action":"UPDATE"},{"gtasId":"14645140","tamrId":"00c9b01d-b78c-3c5b-adca-72e0b346b095","version":342,"action":"UPDATE"},{"gtasId":"6306703","tamrId":"66fc9e1f-33b7-370b-af61-9f8b029882cc","version":342,"action":"UPDATE"},{"gtasId":"7512056","tamrId":"4ab00f18-7c44-3d3a-9817-bfa99fdffff2","version":342,"action":"UPDATE"},{"gtasId":"12228873","tamrId":"db5c729d-0361-3c71-8cc3-2bf33043abc3","version":342,"action":"UPDATE"},{"gtasId":"14008513","tamrId":"f912dc0c-24d7-3300-afc1-fad2d15c6ecc","version":342,"action":"UPDATE"},{"gtasId":"21024883","tamrId":"f8236613-bc2e-39c4-a4e1-9e382cc1a1bd","version":342,"action":"UPDATE"},{"gtasId":"13874308","tamrId":"513aedf7-5b13-3089-b02e-4ef05ab5d9a6","version":342,"action":"UPDATE"},{"gtasId":"14908143","tamrId":"4d4300ea-ee8e-3e2a-a7e5-37371630d409","version":342,"action":"UPDATE"},{"gtasId":"6514908","tamrId":"26b4ae9e-d75b-3ee6-b351-e74baab79669","version":342,"action":"UPDATE"},{"gtasId":"10309429","tamrId":"65d246d3-6ece-392c-9211-62fe95046da1","version":342,"action":"UPDATE"},{"gtasId":"19052579","tamrId":"d1c97fbf-663c-3620-a4f1-c6a0f9fde629","version":342,"action":"UPDATE"},{"gtasId":"10925353","tamrId":"d328ab63-86f8-3896-b103-ab57317f51bf","version":342,"action":"UPDATE"},{"gtasId":"10802300","tamrId":"f483bfa9-b826-3671-bbf2-c827631a18f8","version":342,"action":"UPDATE"},{"gtasId":"9994566","tamrId":"7f448bb6-2d53-3ae1-90ce-171dd1ee845b","version":342,"action":"UPDATE"},{"gtasId":"6870818","tamrId":"21ab222e-9174-3ac9-9301-43f87e6f0de7","version":342,"action":"UPDATE"},{"gtasId":"24579827","tamrId":"889d4839-60cb-304f-b7fa-affe883c6465","version":342,"action":"UPDATE"},{"gtasId":"11310255","tamrId":"ebef883a-2da3-3c96-b980-5b66110dcfde","version":342,"action":"UPDATE"},{"gtasId":"6173091","tamrId":"95f4ed26-20d9-3066-9fba-40e040e2d59d","version":342,"action":"UPDATE"},{"gtasId":"1267591","tamrId":"2ce1c1ed-ae36-3d53-b4b2-bed8feaf9d0b","version":342,"action":"UPDATE"},{"gtasId":"18251176","tamrId":"4eaeb316-456f-3970-b109-9ada730d63d8","version":342,"action":"UPDATE"},{"gtasId":"1132572","tamrId":"215e8cbb-3519-3fbf-b068-c4de3d8d2daa","version":342,"action":"UPDATE"},{"gtasId":"21790399","tamrId":"5124e4f7-1bb5-31a4-bbc8-67036e21a6cc","version":342,"action":"UPDATE"},{"gtasId":"4880634","tamrId":"c6e9a0c8-9f0c-38fd-9952-4c0929b204a3","version":342,"action":"UPDATE"},{"gtasId":"19650682","tamrId":"50a66403-7a00-37e2-bd41-e9a6eead2afb","version":342,"action":"UPDATE"},{"gtasId":"2861751","tamrId":"d048e95e-e7ff-37a4-a2b1-a26cd6a6fc9a","version":342,"action":"UPDATE"},{"gtasId":"5013410","tamrId":"0eeca889-54b3-367b-a83a-591c0f3174be","version":342,"action":"UPDATE"},{"gtasId":"2375166","tamrId":"35198ca4-ee0d-3346-b753-c3a7a03e8fb2","version":342,"action":"UPDATE"},{"gtasId":"13756364","tamrId":"f09c8a9d-10b8-385a-bcef-30dd98e85c2d","version":342,"action":"UPDATE"},{"gtasId":"5457009","tamrId":"127f2de0-3ea5-3bb7-89cd-de0baefa58d5","version":342,"action":"UPDATE"},{"gtasId":"6752866","tamrId":"f1d3a874-89a6-39ed-8343-b74ae1e2a0d3","version":342,"action":"UPDATE"},{"gtasId":"19933176","tamrId":"7b05646e-32de-3447-a175-12015b92676e","version":342,"action":"UPDATE"},{"gtasId":"17503511","tamrId":"8bebffc7-123d-3456-ac7d-701c740854b1","version":342,"action":"UPDATE"},{"gtasId":"4937966","tamrId":"191c8525-c949-3a19-8d76-cfabd311b4d2","version":342,"action":"UPDATE"},{"gtasId":"10963600","tamrId":"cf9ee481-3d5e-36ba-8e1e-7fd57bc1792a","version":342,"action":"UPDATE"},{"gtasId":"4513841","tamrId":"5259bced-8ac0-3630-a051-a89d174f5b5f","version":342,"action":"UPDATE"},{"gtasId":"8257736","tamrId":"b339a49a-e2de-3e07-9ea5-886df0f4a837","version":342,"action":"UPDATE"},{"gtasId":"10799060","tamrId":"5370da2d-8169-3bdb-8a95-a70b9cce3d49","version":342,"action":"UPDATE"},{"gtasId":"24227198","tamrId":"ca5a6048-7552-3a24-978d-8bb5bf3409f0","version":342,"action":"UPDATE"},{"gtasId":"23087386","tamrId":"1bef4c44-5bf6-3238-bbfe-89412007d3c6","version":342,"action":"UPDATE"},{"gtasId":"22233298","tamrId":"51ba29df-6677-394c-b6e9-f1e227d6028a","version":342,"action":"UPDATE"},{"gtasId":"11384669","tamrId":"f37d0948-f8a1-3a89-a0b2-5f0ae1e65cfb","version":342,"action":"UPDATE"},{"gtasId":"500971","tamrId":"e7c9b125-e3c3-353f-b946-09a707b1197f","version":342,"action":"UPDATE"},{"gtasId":"7844360","tamrId":"348b4b6d-823b-3565-9751-1640c38312ef","version":342,"action":"UPDATE"},{"gtasId":"1715889","tamrId":"9fd12b4d-1bcd-3beb-9e8f-ff0731295ba9","version":342,"action":"UPDATE"},{"gtasId":"8040435","tamrId":"4cef3313-8112-309d-a99e-491f93f76d6e","version":342,"action":"UPDATE"},{"gtasId":"150111","tamrId":"fe67fd3e-1c23-3c7d-90be-94fca79d4210","version":342,"action":"UPDATE"},{"gtasId":"4264745","tamrId":"863d8f83-64e1-37a7-a710-c3a1e4775221","version":342,"action":"UPDATE"},{"gtasId":"21871544","tamrId":"836d3e40-746a-3f44-9a50-775e1fd8ecfb","version":342,"action":"UPDATE"},{"gtasId":"14304760","tamrId":"578c3c31-c85f-3abc-82e4-53582d01463d","version":342,"action":"UPDATE"},{"gtasId":"21824396","tamrId":"7f455182-8eaa-3276-979f-ac8313eff0ae","version":342,"action":"UPDATE"},{"gtasId":"19722717","tamrId":"e6c6853a-a61c-3383-9bfc-22eb85e55203","version":342,"action":"UPDATE"},{"gtasId":"7242932","tamrId":"18eea7ae-08ab-33c5-8e17-2ae30deb559f","version":342,"action":"UPDATE"},{"gtasId":"2066434","tamrId":"527d1c25-381b-31ef-ad5a-d08986816480","version":342,"action":"UPDATE"},{"gtasId":"7746791","tamrId":"f7e12d11-d872-3343-bccc-0c9fdb68c8a6","version":342,"action":"UPDATE"},{"gtasId":"9029190","tamrId":"8540f801-950f-3a21-9497-dda097d76ec8","version":342,"action":"UPDATE"},{"gtasId":"16029885","tamrId":"4960d757-050d-3152-8b5f-f46f73b8afbd","version":342,"action":"UPDATE"},{"gtasId":"11978404","tamrId":"0a816b17-54f2-31be-8d84-dda61cc1f200","version":342,"action":"UPDATE"},{"gtasId":"18780048","tamrId":"6108414a-9739-3724-bf04-9a96aebe909b","version":342,"action":"UPDATE"},{"gtasId":"15530512","tamrId":"618d77d1-e322-3180-b01f-e1ee6dd7ad90","version":342,"action":"UPDATE"},{"gtasId":"1873000","tamrId":"851fdad3-f7c3-3ba2-9c41-44d09996d2c7","version":342,"action":"UPDATE"},{"gtasId":"1164113","tamrId":"785f15a6-110d-3c6b-9f85-b385dbd5a206","version":342,"action":"UPDATE"},{"gtasId":"4040230","tamrId":"f9cc8066-690e-37dd-a3b1-d144bc775888","version":342,"action":"UPDATE"},{"gtasId":"15193222","tamrId":"8fda6832-df68-3b87-a2ee-e11e82b4f329","version":342,"action":"UPDATE"},{"gtasId":"5712117","tamrId":"de322666-5680-3399-83f1-553dc56cd66a","version":342,"action":"UPDATE"},{"gtasId":"5187882","tamrId":"a7e4a203-07de-3d1a-9d38-09040f50e1d5","version":342,"action":"UPDATE"},{"gtasId":"6996983","tamrId":"913a40ba-1b33-38eb-a89d-f57e17044b87","version":342,"action":"UPDATE"},{"gtasId":"14323050","tamrId":"473cc9c4-db06-3901-88a0-0435db6bb037","version":342,"action":"UPDATE"},{"gtasId":"7716901","tamrId":"459b31ca-c5a0-3bea-89fc-901ad607ec1b","version":342,"action":"UPDATE"},{"gtasId":"6878793","tamrId":"ef49330b-4959-35b7-8ad1-fc85be3bb776","version":342,"action":"UPDATE"},{"gtasId":"21244985","tamrId":"03936756-1dc2-356a-858a-7f8b318569b2","version":342,"action":"UPDATE"},{"gtasId":"4518801","tamrId":"5a070122-79bc-394f-a30c-40ae05457091","version":342,"action":"UPDATE"},{"gtasId":"20544122","tamrId":"300ce949-9243-36cb-8baa-642f95d136c4","version":342,"action":"UPDATE"},{"gtasId":"2573874","tamrId":"b70732bb-e470-3ccd-9733-801998ea6f56","version":342,"action":"UPDATE"},{"gtasId":"7468374","tamrId":"fe4e3a61-04b2-3bde-877c-ed994090175b","version":342,"action":"UPDATE"},{"gtasId":"2050088","tamrId":"377ef9a0-f9ce-337f-a270-01e3f1e236ee","version":342,"action":"UPDATE"},{"gtasId":"17959998","tamrId":"3e39db7b-bc38-3cfc-a085-7f434709461e","version":342,"action":"UPDATE"},{"gtasId":"6625763","tamrId":"0b11ed2b-a008-3bd4-b3aa-16547d8256a7","version":342,"action":"UPDATE"},{"gtasId":"8610496","tamrId":"007a197b-1bc1-3b62-98b8-ff01d07885e7","version":342,"action":"UPDATE"},{"gtasId":"20100420","tamrId":"249fd00d-0c6f-3259-a60c-fa0c9ad88307","version":342,"action":"UPDATE"},{"gtasId":"7971469","tamrId":"ef43f8c4-b1e4-3292-8d5e-907a76b12979","version":342,"action":"UPDATE"},{"gtasId":"6190457","tamrId":"30824bee-7762-3ede-b8b6-9d3db64866ee","version":342,"action":"UPDATE"},{"gtasId":"12334196","tamrId":"256fc211-e26a-3d0c-93c7-7b8efe458cec","version":342,"action":"UPDATE"},{"gtasId":"4740235","tamrId":"0d08528f-6eca-3dec-8f0f-9cbd2e6321ba","version":342,"action":"UPDATE"},{"gtasId":"9238438","tamrId":"62ec5e5a-9a46-386a-ab0b-fea18d6cb00b","version":342,"action":"UPDATE"},{"gtasId":"15483721","tamrId":"45ecc2bd-ac2b-3fa0-a71d-e6b849995665","version":342,"action":"UPDATE"},{"gtasId":"745482","tamrId":"468d8334-99fa-320b-8c9c-2d526aaa115a","version":342,"action":"UPDATE"},{"gtasId":"21111090","tamrId":"6b83edc4-cf48-3831-988b-8ed3501c2e18","version":342,"action":"UPDATE"},{"gtasId":"19470618","tamrId":"85030fbe-2774-3572-8e7a-d59d9a1f69e2","version":342,"action":"UPDATE"},{"gtasId":"12887018","tamrId":"eab6a7f0-ac83-3fda-ba5e-80451833a533","version":342,"action":"UPDATE"},{"gtasId":"10184350","tamrId":"da1d26a4-bbfd-301b-8ba1-6397ce897ab7","version":342,"action":"UPDATE"},{"gtasId":"19670238","tamrId":"b7d63879-6730-3d37-8a46-a2ab85abbf8e","version":342,"action":"UPDATE"},{"gtasId":"10459220","tamrId":"e9cd305d-a939-3a3e-9e78-ba64ee4521a9","version":342,"action":"UPDATE"},{"gtasId":"6511843","tamrId":"9975d40a-5ba9-3553-b939-60e1f3507775","version":342,"action":"UPDATE"},{"gtasId":"531216","tamrId":"3574ed0e-8565-31a5-82d0-c83445ab04f1","version":342,"action":"UPDATE"},{"gtasId":"10734581","tamrId":"c7abfd37-0528-3039-acdf-0646f6bbb39a","version":342,"action":"UPDATE"},{"gtasId":"893297","tamrId":"c214a454-a248-3f10-ad4e-dc7465a56f24","version":342,"action":"UPDATE"},{"gtasId":"17547971","tamrId":"347e7313-19ab-3a74-a4eb-ac242df8e49d","version":342,"action":"UPDATE"},{"gtasId":"14795795","tamrId":"ea477dd7-9147-3148-82aa-bd53826820e0","version":342,"action":"UPDATE"},{"gtasId":"143857","tamrId":"8f531bbc-eb50-36b7-b5ef-fc502bf07499","version":342,"action":"UPDATE"},{"gtasId":"21128754","tamrId":"bc9bb4b3-7563-30c7-9267-8465f5088258","version":342,"action":"UPDATE"},{"gtasId":"3852799","tamrId":"ace3d964-c11c-38ec-a502-dae467790977","version":342,"action":"UPDATE"},{"gtasId":"2625586","tamrId":"ebe804b7-24bf-3d0d-81e5-38e56e8723b2","version":342,"action":"UPDATE"},{"gtasId":"24591508","tamrId":"eba74b1e-ce44-3c76-9ed5-1aa69c5a1631","version":342,"action":"UPDATE"},{"gtasId":"1779943","tamrId":"d584c83d-8bc5-3734-ba21-841199015f41","version":342,"action":"UPDATE"},{"gtasId":"17712968","tamrId":"aab4fd3f-63f6-335a-844a-180c1944d683","version":342,"action":"UPDATE"},{"gtasId":"7090098","tamrId":"a4706902-76d2-3bf6-965e-300b51f85be4","version":342,"action":"UPDATE"},{"gtasId":"24164602","tamrId":"f732f1bb-cc78-37ed-bc15-d5212b3c99a7","version":342,"action":"UPDATE"},{"gtasId":"23074959","tamrId":"3ebc17ad-b838-3b95-a6e1-cd8aed7c12bf","version":342,"action":"UPDATE"},{"gtasId":"4099755","tamrId":"ddde33c8-1f3c-361a-b431-9cece83204b3","version":342,"action":"UPDATE"},{"gtasId":"21548308","tamrId":"4616c71d-d9ae-3396-b116-670ee6f4664f","version":342,"action":"UPDATE"},{"gtasId":"20460973","tamrId":"2a45c55b-0a09-3ba3-a494-af26160d9bee","version":342,"action":"UPDATE"},{"gtasId":"23035351","tamrId":"c56a3a9b-6816-394f-9fae-b8173b36529b","version":342,"action":"UPDATE"},{"gtasId":"2389704","tamrId":"4b7a995f-e62b-36e3-bef6-2e8aa6c411bf","version":342,"action":"UPDATE"},{"gtasId":"11079257","tamrId":"1311aa36-1a28-351d-8ac9-d4f5ce786915","version":342,"action":"UPDATE"},{"gtasId":"1684905","tamrId":"1e03c768-52a7-30a1-9c34-e087eba51659","version":342,"action":"UPDATE"},{"gtasId":"12516890","tamrId":"7a538b32-bba2-37a9-ac3d-375be091f80a","version":342,"action":"UPDATE"},{"gtasId":"22059354","tamrId":"433a4c03-024d-33fb-a0e9-850284d93043","version":342,"action":"UPDATE"},{"gtasId":"7762836","tamrId":"e2a9fd1b-b0ac-3e89-a455-45e2086c6b22","version":342,"action":"UPDATE"},{"gtasId":"6678249","tamrId":"be6ed7b4-54e1-3307-9bc1-0db474515c69","version":342,"action":"UPDATE"},{"gtasId":"461522","tamrId":"15a06fb1-39bb-3250-94c1-0cb5924d6e6d","version":342,"action":"UPDATE"},{"gtasId":"4940760","tamrId":"0192766b-c359-3143-a4d1-048636647b61","version":342,"action":"UPDATE"},{"gtasId":"9369064","tamrId":"785a8e5f-e69b-37c6-a675-e094448600ba","version":342,"action":"UPDATE"},{"gtasId":"21241076","tamrId":"5af41623-fbf5-3256-89f2-d2124a4995e2","version":342,"action":"UPDATE"},{"gtasId":"4399703","tamrId":"754f7ae9-fb83-35dc-aa2b-8178a934ca6e","version":342,"action":"UPDATE"},{"gtasId":"4134736","tamrId":"ff0f2810-29b3-3679-b49f-92a0bfa81c5d","version":342,"action":"UPDATE"},{"gtasId":"19150165","tamrId":"230614ec-eb0e-35a0-9b6c-97faa64082ff","version":342,"action":"UPDATE"},{"gtasId":"15315268","tamrId":"985f229c-4d91-32d5-90c9-2ff8fa6ce144","version":342,"action":"UPDATE"},{"gtasId":"6625713","tamrId":"2980ddfc-f32c-3a15-88b6-81325e82dab0","version":342,"action":"UPDATE"},{"gtasId":"4193937","tamrId":"c6b8e639-6530-3a23-93b3-97a989126433","version":342,"action":"UPDATE"},{"gtasId":"19384895","tamrId":"b1a3f843-f248-3f14-b700-b8c4ba6eec64","version":342,"action":"UPDATE"},{"gtasId":"14025010","tamrId":"766353d5-6f20-329b-9b6a-41859e4e2eb9","version":342,"action":"UPDATE"},{"gtasId":"24999624","tamrId":"ceaf6aa9-4989-3d0c-af5f-c6de99f43926","version":342,"action":"UPDATE"},{"gtasId":"68376","tamrId":"f7272bf8-fa63-329f-859e-74b2f3f91652","version":342,"action":"UPDATE"},{"gtasId":"10024355","tamrId":"94c1a8aa-1d45-3623-a8ee-65d7be93bfa2","version":342,"action":"UPDATE"},{"gtasId":"12641115","tamrId":"dcea11d3-2810-3295-8d4b-76dd7063252b","version":342,"action":"UPDATE"},{"gtasId":"6202258","tamrId":"9143a76c-edf5-3eb1-a519-fb3a1347be10","version":342,"action":"UPDATE"},{"gtasId":"353744","tamrId":"ab4ba6ea-37ab-3f5c-b1fb-e8e71c1fa143","version":342,"action":"UPDATE"},{"gtasId":"13255583","tamrId":"d55ebd40-1cc2-30d8-bda4-54ac2a3d080e","version":342,"action":"UPDATE"},{"gtasId":"16631114","tamrId":"c26d4ece-29be-3c6f-9dcb-5719dae671fd","version":342,"action":"UPDATE"},{"gtasId":"13988486","tamrId":"030f0093-1594-33bb-bb00-e9196701909a","version":342,"action":"UPDATE"},{"gtasId":"15342898","tamrId":"068c3e13-2e67-3025-84a4-617e25631453","version":342,"action":"UPDATE"},{"gtasId":"6139132","tamrId":"bcd36db6-6aab-38dc-8e75-f0927419502e","version":342,"action":"UPDATE"},{"gtasId":"12224426","tamrId":"47baf1d5-0f80-3816-a147-2856f383ff57","version":342,"action":"UPDATE"},{"gtasId":"21860081","tamrId":"a6987662-f20b-3904-a916-3483d7be50a9","version":342,"action":"UPDATE"},{"gtasId":"3855870","tamrId":"c114dadd-4e67-3147-9e9c-9263b367104c","version":342,"action":"UPDATE"},{"gtasId":"13955589","tamrId":"3714750c-531f-35c9-8713-aaa4370a6ddf","version":342,"action":"UPDATE"},{"gtasId":"9016551","tamrId":"25e70692-784d-341b-98d7-0acacb03402d","version":342,"action":"UPDATE"},{"gtasId":"2688464","tamrId":"f8646b03-3f10-3e3d-b44c-197c13aa7a87","version":342,"action":"UPDATE"},{"gtasId":"5998067","tamrId":"167895ee-f150-3e90-a25f-9c22b3a37726","version":342,"action":"UPDATE"},{"gtasId":"9642666","tamrId":"01dc5872-f8b9-3775-be04-79e7bc2d4af3","version":342,"action":"UPDATE"},{"gtasId":"573017","tamrId":"136017e8-1d79-3daa-8320-2b0005d73080","version":342,"action":"UPDATE"},{"gtasId":"23479761","tamrId":"e759cd4a-a330-37ac-a984-f09a77c0d762","version":342,"action":"UPDATE"},{"gtasId":"14395536","tamrId":"63d69158-e201-39c8-809a-39769d5cc98e","version":342,"action":"UPDATE"},{"gtasId":"7280393","tamrId":"c01e5cdf-efe5-32fe-9b56-827d659bd15c","version":342,"action":"UPDATE"},{"gtasId":"11394001","tamrId":"392fa521-e2ca-3457-83b3-ef8aefb54987","version":342,"action":"UPDATE"},{"gtasId":"6262752","tamrId":"e7a8fb8d-9d04-3007-a27f-f7e9c2b668e6","version":342,"action":"UPDATE"},{"gtasId":"1578987","tamrId":"02c59544-75dd-31e4-bc60-1a0e755622e9","version":342,"action":"UPDATE"},{"gtasId":"8821652","tamrId":"2f3196b2-8df0-3136-a724-4aae681f5776","version":342,"action":"UPDATE"},{"gtasId":"14831835","tamrId":"38b69621-36f1-32c8-bd44-5263d275182c","version":342,"action":"UPDATE"},{"gtasId":"8946231","tamrId":"51d9211c-5f35-3ddf-ad53-303788e0b575","version":342,"action":"UPDATE"},{"gtasId":"1680512","tamrId":"6f0a56e3-1a91-3207-b8da-aa0d79e19895","version":342,"action":"UPDATE"},{"gtasId":"14060225","tamrId":"fa7532c5-0dd4-3b78-ac2a-6052e7e5fcf6","version":342,"action":"UPDATE"},{"gtasId":"5573409","tamrId":"29b8d797-8ffd-3d48-864e-bb07e578b554","version":342,"action":"UPDATE"},{"gtasId":"23242110","tamrId":"02bb1bc1-3a17-30b0-aa3d-6e1027c4f72a","version":342,"action":"UPDATE"},{"gtasId":"5436960","tamrId":"70c53ed6-c6f0-3b6b-915b-75002b33a5b6","version":342,"action":"UPDATE"},{"gtasId":"886123","tamrId":"bb60c644-9d24-3580-bf71-c9ce309329db","version":342,"action":"UPDATE"},{"gtasId":"841215","tamrId":"2c065461-a605-3139-a0bf-cbfa9d6eda82","version":342,"action":"UPDATE"},{"gtasId":"14676425","tamrId":"7f115599-1ced-3b33-af50-81a3a20f453f","version":342,"action":"UPDATE"},{"gtasId":"4045091","tamrId":"df7e84b1-c430-3cd4-b293-b5c22609f7b7","version":342,"action":"UPDATE"},{"gtasId":"17127334","tamrId":"5db1a15d-0516-30f4-850a-0fc40057ddc4","version":342,"action":"UPDATE"},{"gtasId":"1281005","tamrId":"05e7b044-ddd0-34c8-96bd-1ecc578b7b45","version":342,"action":"UPDATE"},{"gtasId":"10676222","tamrId":"e66a1894-507e-3ff5-a89a-259483ae1037","version":342,"action":"UPDATE"},{"gtasId":"4298909","tamrId":"7cdbcd25-b4e2-37be-bef3-6b374dbdb3a1","version":342,"action":"UPDATE"},{"gtasId":"21551992","tamrId":"63d69158-e201-39c8-809a-39769d5cc98e","version":342,"action":"UPDATE"},{"gtasId":"24326897","tamrId":"14f825b8-b78b-39b7-bee9-a90880e4342c","version":342,"action":"UPDATE"},{"gtasId":"19791325","tamrId":"4be5e175-7fb6-3e2a-9a93-53d0c1092e69","version":342,"action":"UPDATE"},{"gtasId":"18121849","tamrId":"41973827-f82e-3d11-b3d7-263e8e610e82","version":342,"action":"UPDATE"},{"gtasId":"670977","tamrId":"8ed222c6-4859-3745-af55-d6cec13df99a","version":342,"action":"UPDATE"},{"gtasId":"8167819","tamrId":"cb3dcaaa-1652-33c2-ac21-d5a2dee45a68","version":342,"action":"UPDATE"},{"gtasId":"7305239","tamrId":"6bccf533-b4bb-31a1-b6a7-c804ee489a34","version":342,"action":"UPDATE"},{"gtasId":"11083339","tamrId":"7524370d-bc29-38cf-8438-68da50ec5cd5","version":342,"action":"UPDATE"},{"gtasId":"14254033","tamrId":"5178da36-2f04-3c52-9337-70dbea20e8e5","version":342,"action":"UPDATE"},{"gtasId":"9373110","tamrId":"7f42fb36-6c19-36c2-867c-9c4f9bff76a1","version":342,"action":"UPDATE"},{"gtasId":"14538646","tamrId":"d6787433-1491-3a85-a736-66eb9df775d4","version":342,"action":"UPDATE"},{"gtasId":"19737804","tamrId":"2427dcae-ddc3-349e-9b74-4a96ae0592fa","version":342,"action":"UPDATE"},{"gtasId":"20852403","tamrId":"e38cf21e-213c-31ff-8a37-4e8dd992300f","version":342,"action":"UPDATE"},{"gtasId":"6984913","tamrId":"9d088517-07a0-32c3-9d77-72a9cb941cb6","version":342,"action":"UPDATE"},{"gtasId":"5080289","tamrId":"3f00fb0d-63e4-3ba9-bd17-b33f54741190","version":342,"action":"UPDATE"},{"gtasId":"19860372","tamrId":"39c255a3-dc09-3eca-a361-3a898a1a56a9","version":342,"action":"UPDATE"},{"gtasId":"2542768","tamrId":"8362e631-2d6a-36e1-bd24-bf128733fada","version":342,"action":"UPDATE"},{"gtasId":"13551881","tamrId":"f19515ad-a208-3a27-8e23-27ffe3ff2011","version":342,"action":"UPDATE"},{"gtasId":"5823828","tamrId":"2ad6a621-dd11-345a-92df-ddd899ffd785","version":342,"action":"UPDATE"},{"gtasId":"5318119","tamrId":"20aad274-24eb-394c-b724-58d451d8c367","version":342,"action":"UPDATE"},{"gtasId":"11133402","tamrId":"82d86008-8302-34b8-82de-4d45230a6dd5","version":342,"action":"UPDATE"},{"gtasId":"3679312","tamrId":"f8fa8e38-5990-33eb-9c2e-c3f6e2fa5e72","version":342,"action":"UPDATE"},{"gtasId":"10373144","tamrId":"d4b0db72-5d34-30e1-8d36-95391cccaee4","version":342,"action":"UPDATE"},{"gtasId":"19083719","tamrId":"ac9d10d9-c964-3271-9adc-dd9bd3b5f9b7","version":342,"action":"UPDATE"},{"gtasId":"9071536","tamrId":"c0bbe5d8-35c8-3957-b054-1d49c9c94be5","version":342,"action":"UPDATE"},{"gtasId":"18092899","tamrId":"efe4d5f0-f25b-3623-8591-0bb4750aea42","version":342,"action":"UPDATE"},{"gtasId":"19618533","tamrId":"b700c305-0ccc-366b-8f53-54dfe09cef3c","version":342,"action":"UPDATE"},{"gtasId":"1062215","tamrId":"6299ac57-14cd-334d-8dba-a5b4ecb13182","version":342,"action":"UPDATE"},{"gtasId":"20184023","tamrId":"0349325f-a28b-3e4f-af34-a0be44c420b2","version":342,"action":"UPDATE"},{"gtasId":"12151047","tamrId":"f6dc0382-e0b2-36a0-855b-fb398ff1326a","version":342,"action":"UPDATE"},{"gtasId":"4564746","tamrId":"617a70d6-ab9a-3c4a-8654-a0efd4a1278a","version":342,"action":"UPDATE"},{"gtasId":"23370382","tamrId":"ba6c1469-f7e7-3160-b4c3-80a019ee18b1","version":342,"action":"UPDATE"},{"gtasId":"10691861","tamrId":"6231c514-c35e-3090-a508-21d7ecf71f20","version":342,"action":"UPDATE"},{"gtasId":"5840392","tamrId":"5f7b5334-808d-3d1c-9e2b-11560e82422f","version":342,"action":"UPDATE"},{"gtasId":"11315069","tamrId":"931637d4-cb26-3aed-8e1e-3b114d71a5db","version":342,"action":"UPDATE"},{"gtasId":"24898817","tamrId":"8c024dee-5601-33d3-80a5-c4f4ec8e1c31","version":342,"action":"UPDATE"},{"gtasId":"23765159","tamrId":"ca5f3d35-8bee-30ab-b5ef-3b7e411c56fa","version":342,"action":"UPDATE"},{"gtasId":"3249300","tamrId":"b4399394-df1c-388f-9a92-4004185d976e","version":342,"action":"UPDATE"},{"gtasId":"21743180","tamrId":"f1e69ec6-2460-3be9-88b5-7480b8fa7cc8","version":342,"action":"UPDATE"},{"gtasId":"11808442","tamrId":"eabe1aa2-3436-37d0-a846-31ca853bcb9f","version":342,"action":"UPDATE"},{"gtasId":"6248420","tamrId":"4324a343-8ace-3810-a4c1-a56368b09334","version":342,"action":"UPDATE"},{"gtasId":"3525190","tamrId":"7cbbddd4-48a8-3aac-a937-02fd63a01317","version":342,"action":"UPDATE"},{"gtasId":"6316143","tamrId":"d51176ff-bee6-3425-a90d-6a0996ef5816","version":342,"action":"UPDATE"},{"gtasId":"465079","tamrId":"7db6bca3-5875-30ef-abe1-21765b37a910","version":342,"action":"UPDATE"},{"gtasId":"23617114","tamrId":"24bb57bc-ee7f-353c-82bf-6eb7fae48a58","version":342,"action":"UPDATE"},{"gtasId":"15361107","tamrId":"33075a04-805e-38f9-8d43-22c5ee24e98b","version":342,"action":"UPDATE"},{"gtasId":"6675151","tamrId":"b49dc50a-6a59-3635-8f76-cd18e32aeee3","version":342,"action":"UPDATE"},{"gtasId":"3879854","tamrId":"6d48e4be-af39-3e6a-9a7e-fd661e6000d5","version":342,"action":"UPDATE"},{"gtasId":"8215215","tamrId":"f1e2494f-8eb1-38c5-8ae0-cffb592ad128","version":342,"action":"UPDATE"},{"gtasId":"7350653","tamrId":"e6ef6a67-f486-306c-8f8a-f5e520e5a969","version":342,"action":"UPDATE"},{"gtasId":"10026239","tamrId":"9670904e-65cb-364c-a505-281229fcba42","version":342,"action":"UPDATE"},{"gtasId":"9132834","tamrId":"54bd153a-a78a-34af-a752-8671d9e94267","version":342,"action":"UPDATE"},{"gtasId":"21004381","tamrId":"c63f7ba2-4aa8-3cc0-8b28-1e820f90b396","version":342,"action":"UPDATE"},{"gtasId":"24535353","tamrId":"e38cf21e-213c-31ff-8a37-4e8dd992300f","version":342,"action":"UPDATE"},{"gtasId":"10876551","tamrId":"1749e0e6-d6dc-395e-b3cf-35b4305d040b","version":342,"action":"UPDATE"},{"gtasId":"787372","tamrId":"e4c75995-1d04-348c-a597-4f9338004f2d","version":342,"action":"UPDATE"},{"gtasId":"17760678","tamrId":"3f73bb3a-102e-3864-b8be-bac2822ef720","version":342,"action":"UPDATE"},{"gtasId":"6689771","tamrId":"6d38ad8f-27de-3f79-9f5d-52b7be17cc6e","version":342,"action":"UPDATE"},{"gtasId":"11583681","tamrId":"d4c09e06-8bdf-3084-809a-d184649ab56b","version":342,"action":"UPDATE"},{"gtasId":"12115246","tamrId":"01cf4d10-083b-3727-b538-39ebc230f7ca","version":342,"action":"UPDATE"},{"gtasId":"12747439","tamrId":"1dd244ba-02e2-3024-a680-9f045415e409","version":342,"action":"UPDATE"},{"gtasId":"24590194","tamrId":"7f85265f-5ca9-363f-9abe-d0cd0fa2b37e","version":342,"action":"UPDATE"},{"gtasId":"20721040","tamrId":"81b6ef9a-5909-3438-9d9b-20273f366182","version":342,"action":"UPDATE"},{"gtasId":"22530844","tamrId":"cf1f755d-b968-3157-b5c8-71216d47db4d","version":342,"action":"UPDATE"},{"gtasId":"10187243","tamrId":"088b2884-e3e6-38cb-963b-5722e3dec71b","version":342,"action":"UPDATE"},{"gtasId":"9262094","tamrId":"8328f8c9-1f69-35bd-9c36-0a483affbb43","version":342,"action":"UPDATE"},{"gtasId":"20038964","tamrId":"913a40ba-1b33-38eb-a89d-f57e17044b87","version":342,"action":"UPDATE"},{"gtasId":"19962368","tamrId":"90663cbd-d15d-3166-882a-a75b471ef011","version":342,"action":"UPDATE"},{"gtasId":"2556627","tamrId":"ca70b6ce-5b8a-3357-b3b6-5594dbd03bb7","version":342,"action":"UPDATE"},{"gtasId":"17507778","tamrId":"3a04c71f-707f-3e47-8e37-817c2281e464","version":342,"action":"UPDATE"},{"gtasId":"4036357","tamrId":"1321cd86-b389-36b1-a24f-d99b61e93c7b","version":342,"action":"UPDATE"},{"gtasId":"10450039","tamrId":"328b79ba-0996-3204-a593-25191e871b0a","version":342,"action":"UPDATE"},{"gtasId":"5318839","tamrId":"7220fb3b-eec0-3dc2-a776-362a420ca82b","version":342,"action":"UPDATE"},{"gtasId":"10110994","tamrId":"de16fb47-fe56-3c22-b85e-84f8c80a24d8","version":342,"action":"UPDATE"},{"gtasId":"23031848","tamrId":"8f1e0624-bdf9-3f1f-b10d-9ef712495edb","version":342,"action":"UPDATE"},{"gtasId":"3459967","tamrId":"b50f27d4-d700-36ec-a84f-efac468705ce","version":342,"action":"UPDATE"},{"gtasId":"12565684","tamrId":"d60094e5-79b7-3f0b-a2b1-64fea3b3127f","version":342,"action":"UPDATE"},{"gtasId":"1632874","tamrId":"a2239a3e-b47d-3091-8bac-95e94651fee5","version":342,"action":"UPDATE"},{"gtasId":"22015948","tamrId":"f9ded5a1-74d7-3aef-bfa9-7e23e2ac6e2a","version":342,"action":"UPDATE"},{"gtasId":"23208246","tamrId":"24f9a5b5-2eef-3f71-ae69-919dbd71dd2d","version":342,"action":"UPDATE"},{"gtasId":"7064736","tamrId":"d9d9ce63-e9d8-3f08-8bb3-7d771fb28eeb","version":342,"action":"UPDATE"},{"gtasId":"2678046","tamrId":"8b1021a1-bb0b-355c-8180-34be5c860c2a","version":342,"action":"UPDATE"},{"gtasId":"16141920","tamrId":"494420dd-345d-3d92-9a3e-a6851c77a404","version":342,"action":"UPDATE"},{"gtasId":"8204547","tamrId":"df410a5b-8599-3d8e-875c-11793d1b8705","version":342,"action":"UPDATE"},{"gtasId":"14127754","tamrId":"da10f183-54bf-3bfc-b246-8059314e0436","version":342,"action":"UPDATE"},{"gtasId":"21397647","tamrId":"6832fb7b-9168-34bf-b6fe-05d2b3a3ccaa","version":342,"action":"UPDATE"},{"gtasId":"21554187","tamrId":"d7a475b8-ae2e-37f9-bd96-d7bd617a2264","version":342,"action":"UPDATE"},{"gtasId":"1970176","tamrId":"5acbd0e0-7d12-3b25-a275-25dd680ab491","version":342,"action":"UPDATE"},{"gtasId":"18117095","tamrId":"64a7ae6c-66f1-3c77-a94d-a9d73213fd7e","version":342,"action":"UPDATE"},{"gtasId":"457642","tamrId":"731c176e-c679-3b9b-a15c-8eb21b26f4be","version":342,"action":"UPDATE"},{"gtasId":"3837817","tamrId":"6b83edc4-cf48-3831-988b-8ed3501c2e18","version":342,"action":"UPDATE"},{"gtasId":"16759823","tamrId":"fcffadab-715d-3120-bc3c-a02b09ddf858","version":342,"action":"UPDATE"},{"gtasId":"16455342","tamrId":"fa3184cb-80af-38d6-894a-7fad29bde376","version":342,"action":"UPDATE"},{"gtasId":"15098750","tamrId":"aa6db550-75dc-35d9-981a-1e3eafa21871","version":342,"action":"UPDATE"},{"gtasId":"4050645","tamrId":"0c1ff3e8-01f9-377e-bf59-e12562f0b008","version":342,"action":"UPDATE"},{"gtasId":"16284494","tamrId":"0bd14164-4889-3684-b1cf-22dd6baddd79","version":342,"action":"UPDATE"},{"gtasId":"3051078","tamrId":"0b645634-5c99-3ee8-a90c-1eab2d733425","version":342,"action":"UPDATE"},{"gtasId":"5160926","tamrId":"5f7b4177-ec12-3e52-9305-35c794198ab8","version":342,"action":"UPDATE"},{"gtasId":"1247194","tamrId":"824d5dd1-cc7f-38f9-8aeb-965922492294","version":342,"action":"UPDATE"},{"gtasId":"4486756","tamrId":"4680040b-b6db-3d06-8e23-a3bf6ea40b97","version":342,"action":"UPDATE"},{"gtasId":"20231788","tamrId":"10923578-01bb-32eb-b1cf-4d1a9dd1e797","version":342,"action":"UPDATE"},{"gtasId":"3812533","tamrId":"7de3f844-a2c0-34d7-9614-96e9a67c33ba","version":342,"action":"UPDATE"},{"gtasId":"3729388","tamrId":"022830e5-edb9-34fe-badf-f2da554e4fa2","version":342,"action":"UPDATE"},{"gtasId":"6882102","tamrId":"088ffc51-ce00-3e58-af77-f9de409df943","version":342,"action":"UPDATE"},{"gtasId":"7128488","tamrId":"339bae33-cf1c-30bf-abf2-29cfb2189727","version":342,"action":"UPDATE"},{"gtasId":"8354885","tamrId":"7cdae87d-b1ae-38ee-a666-eb42892067d2","version":342,"action":"UPDATE"},{"gtasId":"580063","tamrId":"1a0bfffe-7021-3844-8fe6-99cbcf1b6cb9","version":342,"action":"UPDATE"},{"gtasId":"8930614","tamrId":"b8ac45a5-0916-3479-a2e8-7a51bb9b8df7","version":342,"action":"UPDATE"},{"gtasId":"24407078","tamrId":"00d5bcfb-549c-3aa2-ad4b-2999313c8660","version":342,"action":"UPDATE"},{"gtasId":"7416304","tamrId":"dd19ebd5-43c8-3150-bc6a-3af0ff1c7fd6","version":342,"action":"UPDATE"},{"gtasId":"9906164","tamrId":"e3ff6c53-088e-3a97-b9b8-8eff24d2ed21","version":342,"action":"UPDATE"},{"gtasId":"1829936","tamrId":"342ec458-8b90-364b-8c85-f3cb1bd10f1d","version":342,"action":"UPDATE"},{"gtasId":"13660271","tamrId":"802331a4-68be-34e0-9042-10ca7d60ec43","version":342,"action":"UPDATE"},{"gtasId":"20296276","tamrId":"a51bf2e4-5bf0-39e3-9042-01cd088c73d8","version":342,"action":"UPDATE"},{"gtasId":"22745511","tamrId":"52b43dff-f16c-33fc-92fb-710f31ee79e2","version":342,"action":"UPDATE"},{"gtasId":"23464602","tamrId":"44f9bcd9-292f-3ea9-8519-47908fa756d2","version":342,"action":"UPDATE"},{"gtasId":"10509204","tamrId":"ca60bf05-cd6a-3f3d-a3a7-377552854ea4","version":342,"action":"UPDATE"},{"gtasId":"3391884","tamrId":"712903b3-b06f-3e2c-9944-c39b08ffed9e","version":342,"action":"UPDATE"},{"gtasId":"5032653","tamrId":"5fc3d523-945a-3435-b3fc-f3f1773d5846","version":342,"action":"UPDATE"},{"gtasId":"17823054","tamrId":"c12645df-1def-3b99-ba42-08286879170e","version":342,"action":"UPDATE"},{"gtasId":"23026441","tamrId":"ba024651-c9fd-3e88-8da8-6c4751de7d08","version":342,"action":"UPDATE"},{"gtasId":"6525466","tamrId":"ae9da4ce-ca3f-36f1-8f4a-2a76d805dd92","version":342,"action":"UPDATE"},{"gtasId":"14618311","tamrId":"5b089205-66de-3d78-a3e3-1d855e41eda5","version":342,"action":"UPDATE"},{"gtasId":"10691689","tamrId":"eaa8f306-50dd-366d-a37e-9ed776b79329","version":342,"action":"UPDATE"},{"gtasId":"21631923","tamrId":"a9ee2528-848f-3a13-810a-c079c9becdde","version":342,"action":"UPDATE"},{"gtasId":"19861867","tamrId":"c38b811f-4814-3559-9e60-1aad36e44385","version":342,"action":"UPDATE"},{"gtasId":"1652491","tamrId":"e874ef5f-f6e7-31ac-bdda-420c46bf2dd0","version":342,"action":"UPDATE"},{"gtasId":"18860502","tamrId":"1a088bdf-1f71-3493-a909-d252b74b2c25","version":342,"action":"UPDATE"},{"gtasId":"11790685","tamrId":"193e7955-0f27-3aa4-ac6c-93049589807c","version":342,"action":"UPDATE"},{"gtasId":"8981381","tamrId":"27cffd06-998a-3137-83be-55112e90731f","version":342,"action":"UPDATE"},{"gtasId":"3804960","tamrId":"bfa96bbf-5451-370e-9ad2-2d27dc16c61b","version":342,"action":"UPDATE"},{"gtasId":"22151609","tamrId":"78811451-5d5a-3849-aeef-9c70a86edd7a","version":342,"action":"UPDATE"},{"gtasId":"2772997","tamrId":"13529206-4c04-3007-8f6f-50b69fb41a47","version":342,"action":"UPDATE"},{"gtasId":"11046310","tamrId":"b0a7a946-d0a7-3598-9649-f90ab9776bd0","version":342,"action":"UPDATE"},{"gtasId":"8423954","tamrId":"533c20a2-29e0-3da2-b009-d8338ee26c51","version":342,"action":"UPDATE"},{"gtasId":"8066134","tamrId":"87225bc5-43c5-312e-8229-8d75f801651d","version":342,"action":"UPDATE"},{"gtasId":"24170467","tamrId":"bcd36db6-6aab-38dc-8e75-f0927419502e","version":342,"action":"UPDATE"},{"gtasId":"13935154","tamrId":"f61fe874-50d6-34b6-a6b6-a27925054491","version":342,"action":"UPDATE"},{"gtasId":"22289620","tamrId":"1de0ff64-5897-358e-bf82-453bea2d84d8","version":342,"action":"UPDATE"},{"gtasId":"17164254","tamrId":"4f9f2c8a-9b91-356d-a956-16422a36aee6","version":342,"action":"UPDATE"},{"gtasId":"24552742","tamrId":"934498ac-0e08-317a-9b08-28a84d5f3db9","version":342,"action":"UPDATE"},{"gtasId":"12518452","tamrId":"1186c773-240e-3def-891e-2fe3e0b865ab","version":342,"action":"UPDATE"},{"gtasId":"7934519","tamrId":"1a1ab66f-a01c-3f96-8f48-01fe9625851e","version":342,"action":"UPDATE"},{"gtasId":"5095383","tamrId":"66adfa63-4c3c-3492-94ce-143609e179a7","version":342,"action":"UPDATE"},{"gtasId":"4356664","tamrId":"6a3095f0-0061-3e4e-90b9-3aa6a5557688","version":342,"action":"UPDATE"},{"gtasId":"8952836","tamrId":"4f660679-4dd7-37f9-b827-2cdfa5c22dc6","version":342,"action":"UPDATE"},{"gtasId":"1434316","tamrId":"c6407b67-4aa6-32fd-b2ac-f1abccee3625","version":342,"action":"UPDATE"},{"gtasId":"412738","tamrId":"43770c13-bac6-38df-9284-807569767d21","version":342,"action":"UPDATE"},{"gtasId":"11392944","tamrId":"70d366f8-7549-3ffd-9621-56aa9c5f887b","version":342,"action":"UPDATE"},{"gtasId":"24710753","tamrId":"5f8479d3-d02c-3907-a900-4345d7ffeb2e","version":342,"action":"UPDATE"},{"gtasId":"9498794","tamrId":"754b2638-c934-3497-8a32-14e88d412610","version":342,"action":"UPDATE"},{"gtasId":"8386494","tamrId":"8996063d-2144-3682-ae23-c96b03c3afb2","version":342,"action":"UPDATE"},{"gtasId":"23635953","tamrId":"8c4004cb-636d-3a59-8db3-c9faf9a1ea23","version":342,"action":"UPDATE"},{"gtasId":"8686531","tamrId":"8b59dd0e-7959-35c6-925e-d87d16dcd08f","version":342,"action":"UPDATE"},{"gtasId":"20632371","tamrId":"5444458d-2c06-31f7-a694-f7b695dd4875","version":342,"action":"UPDATE"},{"gtasId":"1700840","tamrId":"803bf513-18ab-3d47-b140-1b06084babe2","version":342,"action":"UPDATE"},{"gtasId":"8124753","tamrId":"9d8eaf67-54d4-3f5b-8951-0c3e8781876e","version":342,"action":"UPDATE"},{"gtasId":"4126189","tamrId":"9f274292-452b-3570-86ba-b639ecc0b0f6","version":342,"action":"UPDATE"},{"gtasId":"11544066","tamrId":"80e7b595-8ac0-36a1-8a5d-28c5a832ffa8","version":342,"action":"UPDATE"},{"gtasId":"20000316","tamrId":"467998aa-3b88-319a-9c2b-14999a6c234a","version":342,"action":"UPDATE"},{"gtasId":"15754907","tamrId":"d26496bf-51d0-36a5-8600-2a03300198a2","version":342,"action":"UPDATE"},{"gtasId":"7929164","tamrId":"129c7e92-4a4f-3136-974e-6b503e598f1a","version":342,"action":"UPDATE"},{"gtasId":"23451324","tamrId":"d17bbf51-70b8-3e18-8418-e7c49d1cfaa8","version":342,"action":"UPDATE"},{"gtasId":"18949711","tamrId":"ec08b87f-af92-30aa-a41a-80fe24d9f79b","version":342,"action":"UPDATE"},{"gtasId":"801315","tamrId":"9129a1f5-d0b3-3e28-af87-2a220702ec26","version":342,"action":"UPDATE"},{"gtasId":"12919249","tamrId":"42d59119-2e2c-3f5d-9cec-02758b935625","version":342,"action":"UPDATE"},{"gtasId":"8230834","tamrId":"eafa49f4-8b35-3045-88a8-e3c5b04df195","version":342,"action":"UPDATE"},{"gtasId":"9735068","tamrId":"734c6cf6-ff46-3f7f-902c-416b727178ce","version":342,"action":"UPDATE"},{"gtasId":"11606233","tamrId":"42e1e109-326a-3cd1-a958-fa66070b0628","version":342,"action":"UPDATE"},{"gtasId":"645948","tamrId":"a8d7479f-94c7-3023-8009-91dafcb1fcd4","version":342,"action":"UPDATE"},{"gtasId":"6443915","tamrId":"f54e846d-7698-3b4f-a76a-bc47eabbbd9b","version":342,"action":"UPDATE"},{"gtasId":"11193970","tamrId":"8602ff53-dedd-3958-a0b6-10b4711636bb","version":342,"action":"UPDATE"},{"gtasId":"2453355","tamrId":"10b54865-5564-3f01-8fc1-630b21756873","version":342,"action":"UPDATE"},{"gtasId":"365034","tamrId":"2c5bd718-23d9-32ac-85f7-fbd2c0401485","version":342,"action":"UPDATE"},{"gtasId":"16728692","tamrId":"a8946d93-bf25-31c9-bade-61345570dd56","version":342,"action":"UPDATE"},{"gtasId":"2638896","tamrId":"d6066b64-bdce-39e6-908a-54f3c91be65d","version":342,"action":"UPDATE"},{"gtasId":"4757882","tamrId":"5ed2bb1e-6d5c-30df-8ca5-cd4eb5b29c11","version":342,"action":"UPDATE"},{"gtasId":"8290513","tamrId":"5d67c5e1-91c1-3715-a511-7a6d101da7fd","version":342,"action":"UPDATE"},{"gtasId":"1635049","tamrId":"a24bcb9c-a063-3307-a414-386a3f969123","version":342,"action":"UPDATE"},{"gtasId":"17437513","tamrId":"e53fec6e-9163-3780-813d-c9a671f892d5","version":342,"action":"UPDATE"},{"gtasId":"17888462","tamrId":"2939f418-cd8b-39b6-9994-b29b23317a07","version":342,"action":"UPDATE"},{"gtasId":"6045514","tamrId":"2858f836-0a65-362a-a4ce-22cefd68363b","version":342,"action":"UPDATE"},{"gtasId":"24551433","tamrId":"a699c6ae-1676-3a89-9ade-5838ed41c699","version":342,"action":"UPDATE"},{"gtasId":"25391658","tamrId":"5e939ef1-828c-3214-bf9b-59df3c4d8817","version":342,"action":"UPDATE"},{"gtasId":"6578877","tamrId":"d7fbabb9-c0f6-3b94-be1b-2ce8e4ecf044","version":342,"action":"UPDATE"},{"gtasId":"8978604","tamrId":"14919f86-79a8-3970-8fd3-ff9fa6d2394d","version":342,"action":"UPDATE"},{"gtasId":"15941464","tamrId":"984043e3-1db6-3c83-aa32-b6e2b502db12","version":342,"action":"UPDATE"},{"gtasId":"13416205","tamrId":"3853a6e9-5e09-300c-a4ea-1abb9dcd595d","version":342,"action":"UPDATE"},{"gtasId":"10985020","tamrId":"c9ebaa75-b1fa-3063-bf53-3fe9b0ee9ef2","version":342,"action":"UPDATE"},{"gtasId":"1611091","tamrId":"d1731fad-6520-3d2e-ae91-a96075f018e5","version":342,"action":"UPDATE"},{"gtasId":"9102114","tamrId":"0ad8c54f-5fcf-3e07-80d0-ef5ab0d5e573","version":342,"action":"UPDATE"},{"gtasId":"10347649","tamrId":"8c9da76d-b49c-3aea-938b-bf6ae215956a","version":342,"action":"UPDATE"},{"gtasId":"11661889","tamrId":"296c7232-10b1-3fdc-8d19-d57c912179cd","version":342,"action":"UPDATE"},{"gtasId":"9483640","tamrId":"853c92fa-bc9c-3a3c-92e6-516213d1e100","version":342,"action":"UPDATE"},{"gtasId":"7256526","tamrId":"e3609618-93a2-3446-bff3-608075175571","version":342,"action":"UPDATE"},{"gtasId":"10646281","tamrId":"43fc3a25-34ea-329c-b669-ef1660ded6c8","version":342,"action":"UPDATE"},{"gtasId":"10789633","tamrId":"6f569d72-af1e-37c9-9d98-5861c9816738","version":342,"action":"UPDATE"},{"gtasId":"3490757","tamrId":"2e937a11-e783-33b5-892a-b8f00628bee1","version":342,"action":"UPDATE"},{"gtasId":"12184676","tamrId":"54668d7c-c78e-3fae-891a-ea176cfb8e7e","version":342,"action":"UPDATE"},{"gtasId":"11405017","tamrId":"44a30798-fc85-3baa-8c0c-52dd3593d739","version":342,"action":"UPDATE"},{"gtasId":"14009686","tamrId":"d7c1af5f-1990-3d0b-8fc1-1a7a28e90df6","version":342,"action":"UPDATE"},{"gtasId":"14489902","tamrId":"1a72629b-6829-31be-aca0-8ddb5df00469","version":342,"action":"UPDATE"},{"gtasId":"21509528","tamrId":"d188cf23-2bce-3264-9233-13c5fb139351","version":342,"action":"UPDATE"},{"gtasId":"218455","tamrId":"cd11b80f-99fb-3975-b235-bf7067d70e8c","version":342,"action":"UPDATE"},{"gtasId":"2314124","tamrId":"acdc439a-92b1-3942-902e-af7e472691f5","version":342,"action":"UPDATE"},{"gtasId":"13011550","tamrId":"1877c8f8-8713-3a8c-99b1-04ac7b3b4184","version":342,"action":"UPDATE"},{"gtasId":"10117549","tamrId":"c8058d3f-df0b-322f-8946-0a78f5ee502a","version":342,"action":"UPDATE"},{"gtasId":"19097445","tamrId":"bf26179d-8543-3592-a336-c2256abb4a38","version":342,"action":"UPDATE"},{"gtasId":"5449342","tamrId":"1722bda4-8abe-3ab9-8ea6-1e466f51fa1f","version":342,"action":"UPDATE"},{"gtasId":"7496403","tamrId":"09ae5a27-eb10-351c-8f81-e9432fc5cb2d","version":342,"action":"UPDATE"},{"gtasId":"3036308","tamrId":"2b0daf15-9d4d-37db-8a43-6ec409f25c01","version":342,"action":"UPDATE"},{"gtasId":"12183315","tamrId":"0586bf9f-1470-344f-a823-927331c98ad6","version":342,"action":"UPDATE"},{"gtasId":"18951207","tamrId":"5409447d-d5e5-38fb-bccd-0e4aaa0a9627","version":342,"action":"UPDATE"},{"gtasId":"24531848","tamrId":"6903bcff-3a94-300c-b09d-40c9d5efbd6e","version":342,"action":"UPDATE"},{"gtasId":"4342926","tamrId":"979e9c90-a12f-3554-aa6a-a86d767eafd2","version":342,"action":"UPDATE"},{"gtasId":"11917449","tamrId":"ebf6bfb8-bac2-3495-96a8-7ba06ed8a884","version":342,"action":"UPDATE"},{"gtasId":"11532039","tamrId":"acafb8ca-49e3-3080-bdce-c8c770124011","version":342,"action":"UPDATE"},{"gtasId":"13100234","tamrId":"bdd0dcdc-8313-3897-a92a-de8cad853344","version":342,"action":"UPDATE"},{"gtasId":"13121152","tamrId":"f7a7c2b9-76e3-3b33-ad9c-ae6afa3b8164","version":342,"action":"UPDATE"},{"gtasId":"6828633","tamrId":"6edc2239-b44d-30c4-8500-c974649e9863","version":342,"action":"UPDATE"},{"gtasId":"12289756","tamrId":"552c8ec6-4c23-33c1-8b48-0102b3ba0320","version":342,"action":"UPDATE"},{"gtasId":"1176994","tamrId":"ba13d056-7037-3288-aece-35adfd5841f3","version":342,"action":"UPDATE"},{"gtasId":"7493360","tamrId":"326eb3ca-45be-3fe1-ada1-a029e31eebfc","version":342,"action":"UPDATE"},{"gtasId":"8038054","tamrId":"3db3f2d9-5300-31b7-9403-e34b86b96da9","version":342,"action":"UPDATE"},{"gtasId":"8448472","tamrId":"22750123-9766-3f87-95b7-246471a431f5","version":342,"action":"UPDATE"},{"gtasId":"10122085","tamrId":"c6b66124-99ef-3050-80cb-695921ee6125","version":342,"action":"UPDATE"},{"gtasId":"16508352","tamrId":"e9638cc7-05c8-36ff-bc33-34bcd0053109","version":342,"action":"UPDATE"},{"gtasId":"15382859","tamrId":"6b236d96-54fd-39dc-93ae-7f9ca7b6dbc3","version":342,"action":"UPDATE"},{"gtasId":"10702833","tamrId":"71684480-d1f1-3cdf-a0f9-da9087ca3dde","version":342,"action":"UPDATE"},{"gtasId":"8087014","tamrId":"89839c33-fab6-37f1-adae-bcec3c023665","version":342,"action":"UPDATE"},{"gtasId":"2787232","tamrId":"247d0105-ed08-3879-8d2c-0cc2b832fc27","version":342,"action":"UPDATE"},{"gtasId":"2673210","tamrId":"9e809b3b-f8c5-38ed-97ef-045218e567ef","version":342,"action":"UPDATE"},{"gtasId":"9381659","tamrId":"6c4af7f7-44f5-35bb-bd63-68781fc8560e","version":342,"action":"UPDATE"},{"gtasId":"20929655","tamrId":"9a5f5c69-2932-3ba9-8a3f-c1a0164cb8c8","version":342,"action":"UPDATE"},{"gtasId":"1769784","tamrId":"acf81e45-d9fd-30c5-8e1f-16acd4c5fbc4","version":342,"action":"UPDATE"},{"gtasId":"10692151","tamrId":"5e060f16-8536-36a3-ad50-d95387bcaa7d","version":342,"action":"UPDATE"},{"gtasId":"713943","tamrId":"fc92097b-c45d-3a7c-ade5-01509b8e8cfd","version":342,"action":"UPDATE"},{"gtasId":"23915120","tamrId":"f41c7055-1ca4-3d93-9a31-01bb2acc12ab","version":342,"action":"UPDATE"},{"gtasId":"22016385","tamrId":"b44cc52f-9d4d-3d98-bdce-d4d4055583ff","version":342,"action":"UPDATE"},{"gtasId":"19230949","tamrId":"26b713ec-3c94-3ca8-9bc6-bca8ac05e0f6","version":342,"action":"UPDATE"},{"gtasId":"3173762","tamrId":"8e16defb-ab10-3f95-9023-cab92af7c74d","version":342,"action":"UPDATE"},{"gtasId":"19271492","tamrId":"b7d63879-6730-3d37-8a46-a2ab85abbf8e","version":342,"action":"UPDATE"},{"gtasId":"22392816","tamrId":"aa142af2-01e1-3b5d-9e7a-c6ce6c9074c5","version":342,"action":"UPDATE"},{"gtasId":"22683629","tamrId":"c163ffbe-699f-3889-8d8c-c2b6db7883ee","version":342,"action":"UPDATE"},{"gtasId":"21450310","tamrId":"91a2a74b-5476-336a-a1dd-42290cf21e2d","version":342,"action":"UPDATE"},{"gtasId":"4862871","tamrId":"ae032e4a-4999-39ba-84ac-43300babcd50","version":342,"action":"UPDATE"},{"gtasId":"17294587","tamrId":"0d11748e-b1b5-3c0b-a866-4a61fcc988f2","version":342,"action":"UPDATE"},{"gtasId":"11381446","tamrId":"42e1e109-326a-3cd1-a958-fa66070b0628","version":342,"action":"UPDATE"},{"gtasId":"3556250","tamrId":"3f35a2d2-22ea-3dcd-aa30-c9542d34e8e9","version":342,"action":"UPDATE"},{"gtasId":"23067823","tamrId":"8bdf4450-8243-363d-96b1-5037bf382516","version":342,"action":"UPDATE"},{"gtasId":"7798795","tamrId":"a554ad65-01db-3a25-b080-4f86450a29e5","version":342,"action":"UPDATE"},{"gtasId":"17594181","tamrId":"22aae91e-cf70-3c17-8369-be7c20ba36cf","version":342,"action":"UPDATE"},{"gtasId":"3130624","tamrId":"964348ff-9894-3c72-aa20-f5e93b9a5a15","version":342,"action":"UPDATE"},{"gtasId":"6161865","tamrId":"3139753c-a606-3713-a434-a5b56e9db7a3","version":342,"action":"UPDATE"},{"gtasId":"1245407","tamrId":"847c4446-4101-36d0-81fe-3c9aa500e6be","version":342,"action":"UPDATE"},{"gtasId":"4975585","tamrId":"7246bc76-3847-39a4-88eb-2ef1ffc74fd4","version":342,"action":"UPDATE"},{"gtasId":"23190460","tamrId":"00d000fc-7cba-36ee-810b-e7057ae724f1","version":342,"action":"UPDATE"},{"gtasId":"6173848","tamrId":"bf2ac617-118a-3ce0-94b5-04dc64741208","version":342,"action":"UPDATE"},{"gtasId":"12011625","tamrId":"62ce5f2d-3f64-38f9-b012-dcde6cef1188","version":342,"action":"UPDATE"},{"gtasId":"11848314","tamrId":"a2dcb4f6-7f79-32b2-8d69-2b64e09e1346","version":342,"action":"UPDATE"},{"gtasId":"18738380","tamrId":"3ffd740c-c406-3cb1-91a0-f190ac3d1bb2","version":342,"action":"UPDATE"},{"gtasId":"4533478","tamrId":"1377254b-2143-34d9-b50e-20cacbd2c17c","version":342,"action":"UPDATE"},{"gtasId":"15579956","tamrId":"ef9f5948-ac43-3ab6-97f8-543b4ddcf7ce","version":342,"action":"UPDATE"},{"gtasId":"18113514","tamrId":"5ec74086-c0b8-3576-b8b7-40ac9a0f1cf8","version":342,"action":"UPDATE"},{"gtasId":"20728481","tamrId":"4d28bbe8-c8de-3201-a802-3ab1738ddf06","version":342,"action":"UPDATE"},{"gtasId":"8367352","tamrId":"0e4901a0-9e46-3209-b58d-80b060e2fb6e","version":342,"action":"UPDATE"},{"gtasId":"16860823","tamrId":"aa7f8134-50a2-3118-863a-2c6d5764e976","version":342,"action":"UPDATE"},{"gtasId":"2721354","tamrId":"be0a5ef6-c5d8-3d2f-b5b7-df2736cd25d4","version":342,"action":"UPDATE"},{"gtasId":"10243896","tamrId":"4058211e-8ef3-35bf-9b4e-0c71a4d4e24b","version":342,"action":"UPDATE"},{"gtasId":"19659974","tamrId":"fc3c6ff3-4256-39b9-bcd4-db4b0b32d76a","version":342,"action":"UPDATE"},{"gtasId":"22087400","tamrId":"d3f608fd-a336-3400-b378-843f9e09b637","version":342,"action":"UPDATE"},{"gtasId":"5181012","tamrId":"5fe9ed69-060b-3dca-890b-00a84f76c242","version":342,"action":"UPDATE"},{"gtasId":"21538088","tamrId":"cc4173c5-99c1-33cf-a7fe-a4346a5c9981","version":342,"action":"UPDATE"},{"gtasId":"2952386","tamrId":"2afe6c80-8d8c-3d97-a213-54be835ef573","version":342,"action":"UPDATE"},{"gtasId":"2090215","tamrId":"62ec5e5a-9a46-386a-ab0b-fea18d6cb00b","version":342,"action":"UPDATE"},{"gtasId":"7425297","tamrId":"54c7e30f-b770-3ea7-9cca-d7253f2324b6","version":342,"action":"UPDATE"},{"gtasId":"10360631","tamrId":"b264a2f9-f49b-34ac-a6f9-e297983928a9","version":342,"action":"UPDATE"},{"gtasId":"7160447","tamrId":"eba4e757-f20f-313a-a5a6-c3cf0a65ce04","version":342,"action":"UPDATE"},{"gtasId":"5476909","tamrId":"279e23b6-f210-3962-9074-520ed225bdfb","version":342,"action":"UPDATE"},{"gtasId":"2329118","tamrId":"315ba582-ae9f-3be5-a5b7-df9288bd8efc","version":342,"action":"UPDATE"},{"gtasId":"4030113","tamrId":"5dabe1c7-e81c-3d8d-af3a-3d7c7d1e777c","version":342,"action":"UPDATE"},{"gtasId":"25051050","tamrId":"8704a702-0d99-3231-97cf-8756a6263e33","version":342,"action":"UPDATE"},{"gtasId":"8174260","tamrId":"d4bcd933-80e4-3a6a-9ace-76b8533f22ab","version":342,"action":"UPDATE"},{"gtasId":"4215655","tamrId":"3a8dc924-e55b-3310-9b93-263728f51dfc","version":342,"action":"UPDATE"},{"gtasId":"11359546","tamrId":"69ba2a4c-630f-30a6-8f55-1b2beed35fd0","version":342,"action":"UPDATE"},{"gtasId":"76943","tamrId":"bffaceba-88f9-3394-847d-6a8c104adc88","version":342,"action":"UPDATE"},{"gtasId":"14662733","tamrId":"fd27739e-e14a-3758-875d-3d811dc4874f","version":342,"action":"UPDATE"},{"gtasId":"14323188","tamrId":"3ebc17ad-b838-3b95-a6e1-cd8aed7c12bf","version":342,"action":"UPDATE"},{"gtasId":"12558572","tamrId":"90663cbd-d15d-3166-882a-a75b471ef011","version":342,"action":"UPDATE"},{"gtasId":"4087017","tamrId":"694c4ec1-b90c-356f-a143-c337fec06125","version":342,"action":"UPDATE"},{"gtasId":"8325538","tamrId":"b1565062-12c4-344d-9548-822bb9e8b9c6","version":342,"action":"UPDATE"},{"gtasId":"15907608","tamrId":"5210ce51-20a0-3953-a54a-08490bb425d6","version":342,"action":"UPDATE"},{"gtasId":"21919869","tamrId":"b27534e2-370f-33d4-a377-bf109d3a787a","version":342,"action":"UPDATE"},{"gtasId":"4252604","tamrId":"7e3f2fc6-e438-3bab-9b0a-a57d74171f28","version":342,"action":"UPDATE"},{"gtasId":"539041","tamrId":"f7b6db2e-5900-3456-981b-6e08a5a5d856","version":342,"action":"UPDATE"},{"gtasId":"19111301","tamrId":"8eddff22-4ff6-30a2-a1d6-3ff2d0ceeb7c","version":342,"action":"UPDATE"},{"gtasId":"18186454","tamrId":"d2d0bcfb-1432-397e-adb4-98e94f652f3c","version":342,"action":"UPDATE"},{"gtasId":"9475197","tamrId":"aaf81f40-4e12-37f5-b74b-b65724f79546","version":342,"action":"UPDATE"},{"gtasId":"22738327","tamrId":"fa240b3a-8e51-37fe-adfa-7d3b99250d23","version":342,"action":"UPDATE"},{"gtasId":"16003112","tamrId":"5d897c8a-7061-311d-ba41-8ba09c87456e","version":342,"action":"UPDATE"},{"gtasId":"10025717","tamrId":"5fdcfb60-20be-3f31-a525-194651d15579","version":342,"action":"UPDATE"},{"gtasId":"2298424","tamrId":"dc5a59b2-e20c-3514-a74d-c428ea8c0e5a","version":342,"action":"UPDATE"},{"gtasId":"20376894","tamrId":"73848fe9-c072-3793-a903-8fc6bbedef83","version":342,"action":"UPDATE"},{"gtasId":"13880076","tamrId":"e91619bb-7139-3d5e-810c-3c83a24cd04e","version":342,"action":"UPDATE"},{"gtasId":"3244550","tamrId":"fe5b9caf-7368-3c30-a280-e59aa1828bdf","version":342,"action":"UPDATE"},{"gtasId":"8954586","tamrId":"c98bdb83-c016-397a-9a92-fe099eca455d","version":342,"action":"UPDATE"},{"gtasId":"9807297","tamrId":"dfa26d10-cc45-3d52-be81-0ace6d447ff8","version":342,"action":"UPDATE"},{"gtasId":"3932315","tamrId":"1c7d09a2-9252-3fd6-8ce1-3e4f41fe47fc","version":342,"action":"UPDATE"},{"gtasId":"12464289","tamrId":"969a9d15-a1df-3f1c-bb63-e369ec73da67","version":342,"action":"UPDATE"},{"gtasId":"3810802","tamrId":"22bda4a9-0bfb-38b8-a2e9-b72b4ada7fd1","version":342,"action":"UPDATE"},{"gtasId":"6290076","tamrId":"825b4409-0f00-3cc3-a7df-3c8fe79aa913","version":342,"action":"UPDATE"},{"gtasId":"22980542","tamrId":"d1ef3729-714d-3ded-8613-2ad132359d93","version":342,"action":"UPDATE"},{"gtasId":"14307965","tamrId":"fc37c6ab-3026-3922-9127-fc5bb10bd10f","version":342,"action":"UPDATE"},{"gtasId":"9192483","tamrId":"d86cf01a-40f4-3f05-8de5-257d6a330c93","version":342,"action":"UPDATE"},{"gtasId":"14006698","tamrId":"92622707-9334-309b-a0d9-c1957ec3c5df","version":342,"action":"UPDATE"},{"gtasId":"15580078","tamrId":"8f556478-0ee0-3edb-bf98-2456a106ccb2","version":342,"action":"UPDATE"},{"gtasId":"2411535","tamrId":"91b4d5e0-7b25-3391-a2df-30d7ead5a0a1","version":342,"action":"UPDATE"},{"gtasId":"11117489","tamrId":"c3a8566d-ff21-3d71-95e0-701bcc91b2e3","version":342,"action":"UPDATE"},{"gtasId":"7697220","tamrId":"2f86ac73-1ce9-3ea2-8713-bd207c2aacca","version":342,"action":"UPDATE"},{"gtasId":"6492","tamrId":"0d41f4ba-a255-3fa2-b4f8-c9579b526bcf","version":342,"action":"UPDATE"},{"gtasId":"8579725","tamrId":"ee72c103-b7ac-382f-8a7e-753872500c14","version":342,"action":"UPDATE"},{"gtasId":"20568258","tamrId":"265983d4-60a1-3184-89fd-1a2fde624671","version":342,"action":"UPDATE"},{"gtasId":"20363574","tamrId":"5c692441-fe18-3b1f-b0bb-a5a0d0b3b0a3","version":342,"action":"UPDATE"},{"gtasId":"18173148","tamrId":"b6bd9cfc-2299-3162-ac12-f94ebfb4c5df","version":342,"action":"UPDATE"},{"gtasId":"618279","tamrId":"f6921440-a428-387d-b311-749e47e374c7","version":342,"action":"UPDATE"},{"gtasId":"2390666","tamrId":"da792a1e-f2dd-3c47-8923-8dc0b02cbe4c","version":342,"action":"UPDATE"},{"gtasId":"3920401","tamrId":"50051b73-4dac-3e06-8de7-d68e62d91973","version":342,"action":"UPDATE"},{"gtasId":"6099427","tamrId":"80c02448-ca4b-3c07-9f93-1e0397c9308a","version":342,"action":"UPDATE"},{"gtasId":"21044365","tamrId":"cff81305-5463-36c2-a9c1-a400383b95ab","version":342,"action":"UPDATE"},{"gtasId":"3791279","tamrId":"556d3120-d984-3d00-8cbf-2ee82a8a52ed","version":342,"action":"UPDATE"},{"gtasId":"23660099","tamrId":"1aa6f3cb-3292-38ce-97c0-717ff9e756cd","version":342,"action":"UPDATE"},{"gtasId":"2743681","tamrId":"e6061588-c50c-3088-8c99-99fec8ae971b","version":342,"action":"UPDATE"},{"gtasId":"9332745","tamrId":"b93302ea-d281-3eea-bee3-8ae5e9f86b7f","version":342,"action":"UPDATE"},{"gtasId":"12750152","tamrId":"67b47ab2-d44b-3e90-8f68-9d63eb456926","version":342,"action":"UPDATE"},{"gtasId":"2269072","tamrId":"3c5e19d1-fb3a-3436-946f-14b416717764","version":342,"action":"UPDATE"},{"gtasId":"1318903","tamrId":"25b35474-7750-377f-8a4a-e34b43c47ca7","version":342,"action":"UPDATE"},{"gtasId":"736692","tamrId":"330962b8-6af6-3dc4-821a-6f7c8f67c5da","version":342,"action":"UPDATE"},{"gtasId":"1343800","tamrId":"2586f4ef-4fe0-3d6b-b002-0fbc87783dcc","version":342,"action":"UPDATE"},{"gtasId":"1139081","tamrId":"1593a83e-3f11-3dbd-9163-ce3c0db76767","version":342,"action":"UPDATE"},{"gtasId":"4936763","tamrId":"bcf6669f-6294-3408-b11c-586956968f0c","version":342,"action":"UPDATE"},{"gtasId":"17316474","tamrId":"4adebe27-e08f-38d3-8482-e2fc4326e4ba","version":342,"action":"UPDATE"},{"gtasId":"1529080","tamrId":"7cd351aa-52c2-37a0-a8fa-2cbc9d3fbd16","version":342,"action":"UPDATE"},{"gtasId":"15409069","tamrId":"8337620f-93fd-3b30-81c9-0e206df13fb8","version":342,"action":"UPDATE"},{"gtasId":"24645760","tamrId":"72b64439-7f72-3ddd-afd5-c13f30143e80","version":342,"action":"UPDATE"},{"gtasId":"19891576","tamrId":"16887d40-187f-3593-879b-99c63446ec4a","version":342,"action":"UPDATE"},{"gtasId":"12697464","tamrId":"22c40075-e6f5-3bb8-a7c5-a3c731235a08","version":342,"action":"UPDATE"},{"gtasId":"5960033","tamrId":"4d71e310-fb53-329b-b010-8e2f77b7855e","version":342,"action":"UPDATE"},{"gtasId":"22996950","tamrId":"d9c7c03e-d795-3d9c-8121-6c71e9f903d7","version":342,"action":"UPDATE"},{"gtasId":"19943253","tamrId":"ab19fda9-ee21-3bad-9428-65b492da4dce","version":342,"action":"UPDATE"},{"gtasId":"1088783","tamrId":"b9996af4-7b41-3dfa-9a2c-64f12e6c3a84","version":342,"action":"UPDATE"},{"gtasId":"12749157","tamrId":"7d3855bd-717f-3bb7-92c6-f9b92f43d90d","version":342,"action":"UPDATE"},{"gtasId":"11734483","tamrId":"569ab88b-eaba-3c6a-8206-f242cbb1ee5b","version":342,"action":"UPDATE"},{"gtasId":"860488","tamrId":"037231ab-180b-3c56-8f79-7d04a2af8b6b","version":342,"action":"UPDATE"},{"gtasId":"11188616","tamrId":"b7cfddda-02ca-349a-8b69-c5aef3bd0086","version":342,"action":"UPDATE"},{"gtasId":"2940434","tamrId":"0586bf9f-1470-344f-a823-927331c98ad6","version":342,"action":"UPDATE"},{"gtasId":"13506587","tamrId":"4141a13f-a64a-392d-a65a-3b705fd6fbea","version":342,"action":"UPDATE"},{"gtasId":"12241743","tamrId":"eba74b1e-ce44-3c76-9ed5-1aa69c5a1631","version":342,"action":"UPDATE"},{"gtasId":"1002477","tamrId":"93a8aff2-6b7f-349f-808b-1f7681d5309d","version":342,"action":"UPDATE"},{"gtasId":"20202475","tamrId":"41eea53c-f7f7-371f-82c4-897b949a0eee","version":342,"action":"UPDATE"},{"gtasId":"14236353","tamrId":"aa7f9cf6-a0eb-3d26-847d-0365482b7f77","version":342,"action":"UPDATE"},{"gtasId":"1247216","tamrId":"4365b3e1-5103-30a3-aabb-56defe5b0262","version":342,"action":"UPDATE"},{"gtasId":"19404153","tamrId":"57def93f-c523-3ce8-bbe4-95f813227434","version":342,"action":"UPDATE"},{"gtasId":"20727225","tamrId":"f4cea4de-f999-3e67-9697-246472bbc46d","version":342,"action":"UPDATE"},{"gtasId":"2853193","tamrId":"5c676d94-5556-3d67-ae3e-f63b63bb6ba2","version":342,"action":"UPDATE"},{"gtasId":"11012009","tamrId":"a30721ca-a4f9-31ea-bb02-0b110cf72c18","version":342,"action":"UPDATE"},{"gtasId":"20479691","tamrId":"6cca8c96-b4f3-350b-b8c2-f4baaa40baa3","version":342,"action":"UPDATE"},{"gtasId":"6304230","tamrId":"e146f898-15af-3799-997f-4bf2996a1bdf","version":342,"action":"UPDATE"},{"gtasId":"10958386","tamrId":"414d24aa-4003-3ce4-b1b6-f97558a3dd97","version":342,"action":"UPDATE"},{"gtasId":"24528192","tamrId":"85902616-d579-38bd-9952-b23bcabff1b9","version":342,"action":"UPDATE"},{"gtasId":"13617351","tamrId":"5d0e56f1-eb31-342a-b8a1-0b4027fd2cf4","version":342,"action":"UPDATE"},{"gtasId":"11638730","tamrId":"788fd9c0-3b72-331e-95a3-e598c09a2e7a","version":342,"action":"UPDATE"},{"gtasId":"18063613","tamrId":"358e8cbe-9f12-32e5-a648-d59e72a95ae6","version":342,"action":"UPDATE"},{"gtasId":"4778711","tamrId":"c72f6b94-ef9b-31e1-af54-546fc3267efd","version":342,"action":"UPDATE"},{"gtasId":"11280874","tamrId":"0a01b3b1-8739-3023-9f9d-9d7244ae8665","version":342,"action":"UPDATE"},{"gtasId":"7069542","tamrId":"b015cdb8-c617-3b37-81cb-bcf0667e9c52","version":342,"action":"UPDATE"},{"gtasId":"17745974","tamrId":"52b0b9b1-bf74-3360-8959-a6fb9dd6401f","version":342,"action":"UPDATE"},{"gtasId":"1704404","tamrId":"bba316d5-e43e-3bb9-bbc2-37c2dd72a4e0","version":342,"action":"UPDATE"},{"gtasId":"13255436","tamrId":"acb8a1f1-9447-36c2-a61f-afcbb8cbcead","version":342,"action":"UPDATE"},{"gtasId":"9274852","tamrId":"8cd52d14-6305-3c22-b25e-dfaab6b1d8ae","version":342,"action":"UPDATE"},{"gtasId":"7907836","tamrId":"8f566c2c-1f3f-3749-85aa-31aa1a7a3d6a","version":342,"action":"UPDATE"},{"gtasId":"15090792","tamrId":"78c61d35-8955-3601-8fc3-d40c7c95dfd5","version":342,"action":"UPDATE"},{"gtasId":"9270494","tamrId":"2cd9a10d-b1d4-34a8-8d1a-a1ac9d81ffa9","version":342,"action":"UPDATE"},{"gtasId":"3498701","tamrId":"030f0093-1594-33bb-bb00-e9196701909a","version":342,"action":"UPDATE"},{"gtasId":"19775345","tamrId":"28669da5-376b-3f13-8fad-a3a8b15633a7","version":342,"action":"UPDATE"},{"gtasId":"9553091","tamrId":"4f607213-8b6f-3a53-8d7e-a00f9810e6cc","version":342,"action":"UPDATE"},{"gtasId":"827000","tamrId":"292778fe-807b-39f1-a155-1f8268978027","version":342,"action":"UPDATE"},{"gtasId":"20213136","tamrId":"38eff2c8-acdc-3dfd-a31c-864f9c0f38f5","version":342,"action":"UPDATE"},{"gtasId":"947642","tamrId":"e3b9bcd1-225a-3146-8168-6365918a34e4","version":342,"action":"UPDATE"},{"gtasId":"5493407","tamrId":"d8faa146-382c-34f5-9590-1fa6acb2627b","version":342,"action":"UPDATE"},{"gtasId":"12631651","tamrId":"b66b7717-96f4-346b-8ef8-b78700a6bc6c","version":342,"action":"UPDATE"},{"gtasId":"9643885","tamrId":"2b228366-ecfe-3cfc-88cc-f14d0ba6778d","version":342,"action":"UPDATE"},{"gtasId":"16337383","tamrId":"ef733730-6517-33a9-9fb5-39c53f810859","version":342,"action":"UPDATE"},{"gtasId":"12471417","tamrId":"11b96f03-c3d4-3c35-9899-5b645577e0d2","version":342,"action":"UPDATE"},{"gtasId":"959629","tamrId":"6dfde5d4-71e1-32de-b50e-c8057f49e50a","version":342,"action":"UPDATE"},{"gtasId":"10694807","tamrId":"451e253a-7dd7-3b8f-ae1e-f53cf841431d","version":342,"action":"UPDATE"},{"gtasId":"15858182","tamrId":"0c47dc6a-87ca-3d03-a8ac-2e613dc7572f","version":342,"action":"UPDATE"},{"gtasId":"6192901","tamrId":"c27965a0-b560-35a5-b857-1776de06ff84","version":342,"action":"UPDATE"},{"gtasId":"13706834","tamrId":"754f7ae9-fb83-35dc-aa2b-8178a934ca6e","version":342,"action":"UPDATE"},{"gtasId":"20358129","tamrId":"3bd9c9d7-3c17-355b-80d4-58b67fe5561c","version":342,"action":"UPDATE"},{"gtasId":"22944871","tamrId":"89adc80d-2d46-3840-8e7c-043ada40d2e0","version":342,"action":"UPDATE"},{"gtasId":"12863138","tamrId":"5cf18891-df70-3cf8-8d56-b9bbabe474f8","version":342,"action":"UPDATE"},{"gtasId":"11653466","tamrId":"15eebe13-32c2-33a5-8ae7-2b44e2cbdc58","version":342,"action":"UPDATE"},{"gtasId":"11329740","tamrId":"43b9eabc-476c-3eae-b498-24f725cf18e0","version":342,"action":"UPDATE"},{"gtasId":"27123","tamrId":"3a1bf187-5324-3f6c-9ed0-7c1a313aa8b8","version":342,"action":"UPDATE"},{"gtasId":"21615907","tamrId":"d7fbb401-5309-306d-bce4-eba92ae8cb01","version":342,"action":"UPDATE"},{"gtasId":"19192254","tamrId":"9c07cfb7-645f-3022-89f6-4d7a243cdac2","version":342,"action":"UPDATE"},{"gtasId":"10883133","tamrId":"bb9932de-4d6b-35fb-8c54-d44dc6bf8245","version":342,"action":"UPDATE"},{"gtasId":"5030959","tamrId":"c16d1c27-b12c-3747-b045-b7555248ede0","version":342,"action":"UPDATE"},{"gtasId":"16814109","tamrId":"57062cb6-1247-3924-8324-664148e16e0d","version":342,"action":"UPDATE"},{"gtasId":"1585135","tamrId":"df59de1f-78f8-30cb-885f-47b8d5764c83","version":342,"action":"UPDATE"},{"gtasId":"3752527","tamrId":"f37561fc-48fa-3fd5-af39-3fb76edcf984","version":342,"action":"UPDATE"},{"gtasId":"16620551","tamrId":"3eeb6674-282c-3b3f-bacc-22e6d49911f6","version":342,"action":"UPDATE"},{"gtasId":"19673483","tamrId":"b09163bc-c0b4-350e-ac08-47c296fd7363","version":342,"action":"UPDATE"},{"gtasId":"16515478","tamrId":"1372f539-3f6f-375c-901a-1a44d0210761","version":342,"action":"UPDATE"},{"gtasId":"10972621","tamrId":"a50656ae-aafa-3ee9-b080-3eb01d13c24e","version":342,"action":"UPDATE"},{"gtasId":"18719251","tamrId":"ae100a88-1a9a-3db7-afc0-1a96079e72a3","version":342,"action":"UPDATE"},{"gtasId":"15138379","tamrId":"cb6da78d-0a21-303a-93c7-0fd50c816bde","version":342,"action":"UPDATE"},{"gtasId":"16589288","tamrId":"2f25ee6a-9a5a-3a4a-9197-ad0434a4c988","version":342,"action":"UPDATE"},{"gtasId":"21618173","tamrId":"785b0f67-bb17-33a3-b50d-712955b88815","version":342,"action":"UPDATE"},{"gtasId":"3375884","tamrId":"0f011a79-0246-3eb1-b545-cbc1a5b4fece","version":342,"action":"UPDATE"},{"gtasId":"20002168","tamrId":"33259302-be27-3ce3-a27c-8400ae66d960","version":342,"action":"UPDATE"},{"gtasId":"8269013","tamrId":"985a7063-1faf-36fa-88ee-2ab732a6b40d","version":342,"action":"UPDATE"},{"gtasId":"12689874","tamrId":"1b6b93b2-838a-3e06-a9d2-13762cae63a0","version":342,"action":"UPDATE"},{"gtasId":"14049789","tamrId":"a5d510cc-a25a-30c0-8e1b-28a9935169ee","version":342,"action":"UPDATE"},{"gtasId":"15254586","tamrId":"073cac52-f940-3fee-86c6-44ec1cc6307f","version":342,"action":"UPDATE"},{"gtasId":"922364","tamrId":"8089ab39-d9ac-3a4d-a230-2d91ec922cf4","version":342,"action":"UPDATE"},{"gtasId":"1182746","tamrId":"bc6abc60-2986-3d60-a330-3cb55df92ec2","version":342,"action":"UPDATE"},{"gtasId":"9446682","tamrId":"fa7d6c46-72ca-3708-b373-94b184e93ef7","version":342,"action":"UPDATE"},{"gtasId":"23686634","tamrId":"085400c0-2754-344d-8b62-6e5c98892efe","version":342,"action":"UPDATE"},{"gtasId":"23661333","tamrId":"f36f3ebd-698c-3f2f-9179-2c06bbf37538","version":342,"action":"UPDATE"},{"gtasId":"3777814","tamrId":"2f3d07c4-77cf-3896-a91e-a0a6d08c8aeb","version":342,"action":"UPDATE"},{"gtasId":"3347810","tamrId":"80be0946-73d3-354d-ac27-3b3c8baaaf0f","version":342,"action":"UPDATE"},{"gtasId":"6278354","tamrId":"1632d16f-a504-3f0f-80bf-998a724b747a","version":342,"action":"UPDATE"},{"gtasId":"16222136","tamrId":"6ab1ad88-2d1b-3e1c-8fce-69f9beb00738","version":342,"action":"UPDATE"},{"gtasId":"19150036","tamrId":"42f2ddc4-5f17-3a56-9c46-5b36cc9f635e","version":342,"action":"UPDATE"},{"gtasId":"13934781","tamrId":"56fa9bbd-fcd4-3e5f-944e-a7be5c6c63f5","version":342,"action":"UPDATE"},{"gtasId":"12202994","tamrId":"49ad391f-49f9-3014-b8bf-fd9d180c45a9","version":342,"action":"UPDATE"},{"gtasId":"16811099","tamrId":"fa1a0f40-adda-3803-bfe0-59687aafe32d","version":342,"action":"UPDATE"},{"gtasId":"16101087","tamrId":"3ab549a8-43e4-39e6-b23c-a01e3008d234","version":342,"action":"UPDATE"},{"gtasId":"23138696","tamrId":"19d20584-1d15-302d-9f91-0ee317fdb9a8","version":342,"action":"UPDATE"},{"gtasId":"10069358","tamrId":"281a329b-8818-38bc-8bad-6ba6ee4026f5","version":342,"action":"UPDATE"},{"gtasId":"6520634","tamrId":"53baf1ff-5992-30c3-b79e-6e82065fe432","version":342,"action":"UPDATE"},{"gtasId":"15624940","tamrId":"2d4055e8-390a-362b-a39b-3bfd12a806ac","version":342,"action":"UPDATE"},{"gtasId":"6304255","tamrId":"42a9175a-c4d0-37a2-ad2a-3fc56c3a086d","version":342,"action":"UPDATE"},{"gtasId":"11714024","tamrId":"825ee7a9-8af6-3d39-b854-eec05ab97a14","version":342,"action":"UPDATE"},{"gtasId":"11822652","tamrId":"937c8b2f-bfdc-33bc-b635-e1b75d479112","version":342,"action":"UPDATE"},{"gtasId":"22210434","tamrId":"16d67cc5-ecfc-37af-b0d2-64c35d18c6b5","version":342,"action":"UPDATE"},{"gtasId":"6971558","tamrId":"83b909ef-ca0c-385a-a485-327bd2787f74","version":342,"action":"UPDATE"},{"gtasId":"4098506","tamrId":"fb69efe1-33a6-366d-9ed8-cbd98786680e","version":342,"action":"UPDATE"},{"gtasId":"18920164","tamrId":"ad47c2e3-d624-337e-adf8-49a2c844f3f0","version":342,"action":"UPDATE"},{"gtasId":"11003164","tamrId":"4a53c70e-97da-36c3-a5cf-acabc9954da1","version":342,"action":"UPDATE"},{"gtasId":"15469516","tamrId":"5f85d804-28be-3aa2-8de4-fe3a92c2e3ee","version":342,"action":"UPDATE"},{"gtasId":"4687471","tamrId":"cd570879-d60c-36a5-89ae-136b66077f61","version":342,"action":"UPDATE"},{"gtasId":"22783741","tamrId":"2a15dd29-caac-3090-804a-544c9bd7c552","version":342,"action":"UPDATE"},{"gtasId":"19668922","tamrId":"63e23e98-d147-35df-8a25-2cbd7b5c764b","version":342,"action":"UPDATE"},{"gtasId":"1750370","tamrId":"bf0ef402-37a7-3c5a-9902-11ea43ff7d90","version":342,"action":"UPDATE"},{"gtasId":"13270204","tamrId":"74b7d0c6-3992-3fff-bf9b-cdd445e93784","version":342,"action":"UPDATE"},{"gtasId":"11130478","tamrId":"3a9698d3-6f47-38d8-930f-37550e85b6b0","version":342,"action":"UPDATE"},{"gtasId":"19598188","tamrId":"dfaec63d-d52c-30ae-b2bf-ddc6e9cbfe2c","version":342,"action":"UPDATE"},{"gtasId":"15934336","tamrId":"8e219b63-a690-35aa-a6f3-b2c3c96aa608","version":342,"action":"UPDATE"},{"gtasId":"4888633","tamrId":"601aa13a-66a5-349d-a675-8d4551b35b13","version":342,"action":"UPDATE"},{"gtasId":"4319772","tamrId":"8602ff53-dedd-3958-a0b6-10b4711636bb","version":342,"action":"UPDATE"},{"gtasId":"7386532","tamrId":"65ebb633-b92f-3d0f-88cc-972a9e8f1077","version":342,"action":"UPDATE"},{"gtasId":"2786705","tamrId":"2bea8a2d-36c0-3e18-b9c0-ca7d82c8d2d8","version":342,"action":"UPDATE"},{"gtasId":"18946717","tamrId":"51a14aa4-bcec-3d49-a93a-b8a0c74835dd","version":342,"action":"UPDATE"},{"gtasId":"1540271","tamrId":"77c99a79-4ec3-31f4-9822-399b380309cc","version":342,"action":"UPDATE"},{"gtasId":"1176047","tamrId":"2a76fbc8-7a7f-3f69-8124-0f4cbe32489b","version":342,"action":"UPDATE"},{"gtasId":"14340562","tamrId":"e7399b65-bb8c-3250-b69a-2f5eaed796f1","version":342,"action":"UPDATE"},{"gtasId":"6292665","tamrId":"0a1c1968-b030-3ad9-9b45-ec330257d526","version":342,"action":"UPDATE"},{"gtasId":"8989253","tamrId":"8d95d0a9-b19f-3508-9958-074c9f04e560","version":342,"action":"UPDATE"},{"gtasId":"5759562","tamrId":"e97dc382-1388-3c2f-9cf2-02357fa99d50","version":342,"action":"UPDATE"},{"gtasId":"24627003","tamrId":"f0219955-024a-34b8-b1a5-dea94f374ed7","version":342,"action":"UPDATE"},{"gtasId":"515015","tamrId":"385d3ff4-bd1e-3ae1-b654-b37feaf99b29","version":342,"action":"UPDATE"},{"gtasId":"4813915","tamrId":"33a82c85-3f14-3f14-b2d4-e679fb9aad07","version":342,"action":"UPDATE"},{"gtasId":"22713885","tamrId":"93774f4f-8583-3e50-b0df-5df2d15d9228","version":342,"action":"UPDATE"},{"gtasId":"631246","tamrId":"88a60972-5aa6-38f3-9acf-e373a2728efe","version":342,"action":"UPDATE"},{"gtasId":"9033176","tamrId":"cfe73ce4-7868-33c6-b0ca-ff74761d31f6","version":342,"action":"UPDATE"},{"gtasId":"7179930","tamrId":"ed9f33a7-daef-30c9-a15f-42df71d2cf64","version":342,"action":"UPDATE"},{"gtasId":"12362322","tamrId":"ffbf78d2-49c1-3dd4-9c00-f891295a73a1","version":342,"action":"UPDATE"},{"gtasId":"4499167","tamrId":"37da0ae6-d8c3-36e5-8dbb-7a83f5866b34","version":342,"action":"UPDATE"},{"gtasId":"4704475","tamrId":"605763cc-22e1-3d48-a5d9-82abd6f308da","version":342,"action":"UPDATE"},{"gtasId":"5704458","tamrId":"a9195633-d0c8-3fc2-84b5-61f229fa8e6f","version":342,"action":"UPDATE"},{"gtasId":"899576","tamrId":"335e135b-a05f-3862-9207-311f7d9db352","version":342,"action":"UPDATE"},{"gtasId":"7610572","tamrId":"8554eb33-fb77-3813-989a-a4485a21b9bc","version":342,"action":"UPDATE"},{"gtasId":"14024466","tamrId":"1d918097-2da5-3203-a90a-d815c386fef8","version":342,"action":"UPDATE"},{"gtasId":"16034273","tamrId":"92071b7e-6fc2-3fb3-a7ea-a4c8dea8e3d3","version":342,"action":"UPDATE"},{"gtasId":"17223883","tamrId":"9d3ff078-6c04-3f51-8450-3e4b16188d5b","version":342,"action":"UPDATE"},{"gtasId":"23359012","tamrId":"20279854-5829-390d-bd48-79337fd7cf22","version":342,"action":"UPDATE"},{"gtasId":"8690601","tamrId":"d33ee07c-d04f-3d95-bba6-dbae6c542379","version":342,"action":"UPDATE"},{"gtasId":"8539668","tamrId":"0d85c61b-af40-3163-8df0-74e5ab39236a","version":342,"action":"UPDATE"},{"gtasId":"10175352","tamrId":"e651a473-87e4-3b80-ad19-b8e70507e914","version":342,"action":"UPDATE"},{"gtasId":"6780141","tamrId":"641fbfbe-3dd3-3ae7-9208-41a0b87fdaf6","version":342,"action":"UPDATE"},{"gtasId":"20970710","tamrId":"c800c66a-645e-3332-94f3-dfdc99e0711a","version":342,"action":"UPDATE"},{"gtasId":"3899333","tamrId":"e2a1c877-9882-3f96-9431-fb3bfbab6390","version":342,"action":"UPDATE"},{"gtasId":"16026642","tamrId":"70567572-c429-3c45-9838-7580432807dc","version":342,"action":"UPDATE"},{"gtasId":"21708094","tamrId":"4cef3313-8112-309d-a99e-491f93f76d6e","version":342,"action":"UPDATE"},{"gtasId":"8890939","tamrId":"35228e76-9f98-3c5a-b56f-7e0b9bb456fc","version":342,"action":"UPDATE"},{"gtasId":"20701482","tamrId":"36d322e1-f0f1-3797-a088-9c73bcb31afd","version":342,"action":"UPDATE"},{"gtasId":"202113","tamrId":"96364b5e-93ed-3ac0-af6a-98f53392763f","version":342,"action":"UPDATE"},{"gtasId":"11823923","tamrId":"068a60c7-d9e8-3131-8de3-e44769658883","version":342,"action":"UPDATE"},{"gtasId":"20143631","tamrId":"5089e064-a93a-34f5-b94b-c81f565a2e44","version":342,"action":"UPDATE"},{"gtasId":"20853649","tamrId":"28c4c1a6-5ce5-38c3-aaa1-f8d4597cf131","version":342,"action":"UPDATE"},{"gtasId":"14332933","tamrId":"b0c7f540-ad90-368e-94c0-8a5e5416bb3d","version":342,"action":"UPDATE"},{"gtasId":"14143758","tamrId":"2d8fb66a-c203-38b2-a0e1-73e1008d8a35","version":342,"action":"UPDATE"},{"gtasId":"13139288","tamrId":"3d0956d1-c236-3b85-bb16-ee2ce35473f4","version":342,"action":"UPDATE"},{"gtasId":"16402810","tamrId":"af9d698c-cf32-3b49-bb8d-fe9a002aca71","version":342,"action":"UPDATE"},{"gtasId":"5290057","tamrId":"3f06c211-3f72-3f07-ac0e-4036f2df984f","version":342,"action":"UPDATE"},{"gtasId":"7737799","tamrId":"f8460b9f-4999-30d3-a54a-5e4f4220936f","version":342,"action":"UPDATE"},{"gtasId":"7154672","tamrId":"6ea3f25b-a2cb-33ef-9bb0-2f8b5f2dc9b2","version":342,"action":"UPDATE"},{"gtasId":"21328304","tamrId":"0fd71b0a-854f-3ada-a9e8-6d91ce6fd5d6","version":342,"action":"UPDATE"},{"gtasId":"11624962","tamrId":"ba6ec1bf-7791-3f09-9fd4-b574eee95441","version":342,"action":"UPDATE"},{"gtasId":"10516342","tamrId":"f82c72e9-b39f-3e3a-bc0c-c3adeb969d0e","version":342,"action":"UPDATE"},{"gtasId":"2971560","tamrId":"782d8b52-69b5-3c7d-a268-88071eec3c34","version":342,"action":"UPDATE"},{"gtasId":"10921069","tamrId":"84c08284-310a-3619-b0ce-e4f1dfc37482","version":342,"action":"UPDATE"},{"gtasId":"10458892","tamrId":"9131e627-97a2-3b0f-8b8a-619446b417ae","version":342,"action":"UPDATE"},{"gtasId":"3786725","tamrId":"f0219955-024a-34b8-b1a5-dea94f374ed7","version":342,"action":"UPDATE"},{"gtasId":"4785860","tamrId":"b0e7a5ea-e8c8-35e0-99c4-7e143a78a8d0","version":342,"action":"UPDATE"},{"gtasId":"16343421","tamrId":"ee687a1f-b884-3242-be36-8e3a5944ba75","version":342,"action":"UPDATE"},{"gtasId":"2624525","tamrId":"9ab326be-37f5-3628-8acb-645e1cb958ff","version":342,"action":"UPDATE"},{"gtasId":"11066223","tamrId":"ef03266e-4af3-375f-9403-8c566f1226a0","version":342,"action":"UPDATE"},{"gtasId":"15520583","tamrId":"27e1f8c5-bb5e-31e1-a82c-ac17c6343f47","version":342,"action":"UPDATE"},{"gtasId":"24674208","tamrId":"3ada178a-719c-3f53-b24a-4f707ccd224d","version":342,"action":"UPDATE"},{"gtasId":"16275646","tamrId":"f7b4634d-bc75-37f1-81ed-b10326c3d191","version":342,"action":"UPDATE"},{"gtasId":"25057395","tamrId":"643e85ae-a817-342c-9e9a-8d2fea1bdcee","version":342,"action":"UPDATE"},{"gtasId":"23199334","tamrId":"cb6da78d-0a21-303a-93c7-0fd50c816bde","version":342,"action":"UPDATE"},{"gtasId":"276836","tamrId":"387e925f-4fb2-3945-ad6f-c37b0b0ad0f0","version":342,"action":"UPDATE"},{"gtasId":"991199","tamrId":"cd92dc46-a3ec-3cae-8fdd-9ff4a72aad2f","version":342,"action":"UPDATE"},{"gtasId":"16956090","tamrId":"26527633-94de-3b80-b254-c569f060de1f","version":342,"action":"UPDATE"},{"gtasId":"8753115","tamrId":"ae45fd6f-74b7-351e-acfd-cb33108ca543","version":342,"action":"UPDATE"},{"gtasId":"20126013","tamrId":"b036d42c-4b3a-312f-9ef0-6c1c48e33aca","version":342,"action":"UPDATE"},{"gtasId":"24318695","tamrId":"b9140f55-0c1d-3fe4-945d-1c20f640ba32","version":342,"action":"UPDATE"},{"gtasId":"17590504","tamrId":"dad93fa2-d18a-37d2-8a6f-4183e925b19c","version":342,"action":"UPDATE"},{"gtasId":"19815652","tamrId":"81714484-7c77-320d-8c93-604f2e0a32b8","version":342,"action":"UPDATE"},{"gtasId":"5706432","tamrId":"0e60c9ec-70e0-3d6e-84bd-67828b212f09","version":342,"action":"UPDATE"},{"gtasId":"10073597","tamrId":"229a0bc4-b15a-3c28-a641-ba3d1b079dc2","version":342,"action":"UPDATE"},{"gtasId":"4710263","tamrId":"5f2070eb-512f-3340-be95-74b93e39a9fa","version":342,"action":"UPDATE"},{"gtasId":"12470278","tamrId":"3658e1d4-82f4-3249-8d17-2bc0f2339691","version":342,"action":"UPDATE"},{"gtasId":"6687466","tamrId":"6fa9ee61-12fd-3257-a8e1-9c8fdbf7fd48","version":342,"action":"UPDATE"},{"gtasId":"5829392","tamrId":"a8946d93-bf25-31c9-bade-61345570dd56","version":342,"action":"UPDATE"},{"gtasId":"21234143","tamrId":"f1bda9b4-6a66-338c-9f08-960402db65d6","version":342,"action":"UPDATE"},{"gtasId":"12453715","tamrId":"a65cdf14-34cc-34bc-9abb-342d55c58833","version":342,"action":"UPDATE"},{"gtasId":"6791337","tamrId":"6e2b5317-3c04-33eb-ae3c-7f17be45ff63","version":342,"action":"UPDATE"},{"gtasId":"19232887","tamrId":"97928272-0e89-38b6-b03d-ae22436bbbe2","version":342,"action":"UPDATE"},{"gtasId":"11169103","tamrId":"66cab116-dec2-3178-afad-7c00a1c7a7ef","version":342,"action":"UPDATE"},{"gtasId":"88233","tamrId":"d392cd38-d87e-3e48-9373-e1b1879b0e8b","version":342,"action":"UPDATE"},{"gtasId":"20700477","tamrId":"37959f22-225a-3699-93b5-ea316a61cf12","version":342,"action":"UPDATE"},{"gtasId":"23523854","tamrId":"de18d88c-13b8-3a21-8c33-58ad8e4c2877","version":342,"action":"UPDATE"},{"gtasId":"4773867","tamrId":"dfeb8709-a16f-3194-9583-5698d56e147f","version":342,"action":"UPDATE"},{"gtasId":"12526390","tamrId":"3df45713-a7fb-3be4-8fce-af9b3c4095fd","version":342,"action":"UPDATE"},{"gtasId":"23104194","tamrId":"35251d15-482a-33b7-8343-0f8fdc118fac","version":342,"action":"UPDATE"},{"gtasId":"8929927","tamrId":"5ef43b10-7c33-3b1f-9bf8-d01ad70c25e9","version":342,"action":"UPDATE"},{"gtasId":"8071803","tamrId":"444b77dd-448e-39fc-a3f0-bd5f1b948f67","version":342,"action":"UPDATE"},{"gtasId":"10093174","tamrId":"cf42c61d-7446-38ee-87f6-33881cb332cb","version":342,"action":"UPDATE"},{"gtasId":"15723298","tamrId":"04e56090-9a0c-3aeb-a88e-9c55a84b1c77","version":342,"action":"UPDATE"},{"gtasId":"8020250","tamrId":"bb2fb345-e117-3650-99c2-25663ba6c9a9","version":342,"action":"UPDATE"},{"gtasId":"13671498","tamrId":"79be7740-90f6-3bce-9ca3-4840d87a0f94","version":342,"action":"UPDATE"},{"gtasId":"401706","tamrId":"e9fbca3f-0143-383e-980f-6f65c8ed17ef","version":342,"action":"UPDATE"},{"gtasId":"11856249","tamrId":"2d09986c-aeca-3f71-bf89-83a86cb6b96d","version":342,"action":"UPDATE"},{"gtasId":"16936482","tamrId":"46f56d04-96f8-332e-89ea-433cd2454eea","version":342,"action":"UPDATE"},{"gtasId":"3002818","tamrId":"85b4e608-4fe9-38a2-b4f0-e053ff55b39b","version":342,"action":"UPDATE"},{"gtasId":"10327517","tamrId":"d188cf23-2bce-3264-9233-13c5fb139351","version":342,"action":"UPDATE"},{"gtasId":"7945318","tamrId":"5af41623-fbf5-3256-89f2-d2124a4995e2","version":342,"action":"UPDATE"},{"gtasId":"6766343","tamrId":"bebd795d-90c0-3645-a6f7-e862ce85de60","version":342,"action":"UPDATE"},{"gtasId":"786195","tamrId":"58875241-4290-3fe3-9def-c88345fda984","version":342,"action":"UPDATE"},{"gtasId":"12566415","tamrId":"226ff9f9-aa1d-32a4-b1d5-d319fe1da681","version":342,"action":"UPDATE"},{"gtasId":"15305770","tamrId":"90ef85b2-f9be-34da-8dc8-8f5c5e73383a","version":342,"action":"UPDATE"},{"gtasId":"9634405","tamrId":"2d826930-9ce8-3a07-8af0-b987c3f6fed0","version":342,"action":"UPDATE"},{"gtasId":"24607860","tamrId":"5a9ddade-f11b-37f2-a24b-8d3aeb5410e6","version":342,"action":"UPDATE"},{"gtasId":"10344088","tamrId":"d7d8596e-cd43-32e7-9b26-6f576f332ca5","version":342,"action":"UPDATE"},{"gtasId":"13820326","tamrId":"71203e7f-c86d-321e-bdf5-7a68cde54cd8","version":342,"action":"UPDATE"},{"gtasId":"16745711","tamrId":"44f46487-e3cf-34c5-bd71-5cfd81252712","version":342,"action":"UPDATE"},{"gtasId":"6216134","tamrId":"fba47e7d-026f-33a8-acb5-463abcf151e3","version":342,"action":"UPDATE"},{"gtasId":"22656736","tamrId":"33dff5d7-700b-3fac-b41c-364a2ae987e3","version":342,"action":"UPDATE"},{"gtasId":"11812615","tamrId":"dd23206e-3bc1-368d-a10a-47e5aa5cceb0","version":342,"action":"UPDATE"},{"gtasId":"14128553","tamrId":"6d285357-85f4-3607-a28f-850835773719","version":342,"action":"UPDATE"},{"gtasId":"21179620","tamrId":"76494cb7-299e-313f-af5f-43ca69b56b2e","version":342,"action":"UPDATE"},{"gtasId":"3089537","tamrId":"a399cc22-d406-3442-8516-98d9c93e7308","version":342,"action":"UPDATE"},{"gtasId":"21079854","tamrId":"fee269e6-919e-34c5-b681-ee8faf0698b9","version":342,"action":"UPDATE"},{"gtasId":"18843437","tamrId":"9964adc6-7984-34e5-9309-6849ff3ddf38","version":342,"action":"UPDATE"},{"gtasId":"8984768","tamrId":"e32cccd6-05fe-39a7-bdf8-be8d30be4129","version":342,"action":"UPDATE"},{"gtasId":"20576846","tamrId":"3946146e-c6d2-319d-ae33-19bcac1d52bb","version":342,"action":"UPDATE"},{"gtasId":"10088636","tamrId":"3a0cd7d0-ea44-3962-a394-1e187b642dfa","version":342,"action":"UPDATE"},{"gtasId":"6195140","tamrId":"175a4aba-5090-354b-9cbf-542327f23c45","version":342,"action":"UPDATE"},{"gtasId":"11468507","tamrId":"5bf1aeda-84d6-39cf-a5ad-6963859bbffb","version":342,"action":"UPDATE"},{"gtasId":"4671863","tamrId":"c0b2d638-d32b-377c-ad1b-c27decaa70cd","version":342,"action":"UPDATE"},{"gtasId":"1697295","tamrId":"985a7063-1faf-36fa-88ee-2ab732a6b40d","version":342,"action":"UPDATE"},{"gtasId":"18993544","tamrId":"cf0a0ce5-184c-37b9-ac59-3689ba804dc2","version":342,"action":"UPDATE"},{"gtasId":"8168063","tamrId":"42735589-d60b-3525-9946-1bbd1336fe60","version":342,"action":"UPDATE"},{"gtasId":"22449916","tamrId":"70ae3c03-03d4-3e8a-9c57-c28863cc65be","version":342,"action":"UPDATE"},{"gtasId":"3988710","tamrId":"b481567b-7f8b-3a62-9d83-fd078ba19133","version":342,"action":"UPDATE"},{"gtasId":"6969057","tamrId":"390bc04f-0795-3ec9-8ebf-f55984769f20","version":342,"action":"UPDATE"},{"gtasId":"19611656","tamrId":"3c5a17fa-83bd-3174-ae2b-26f586726755","version":342,"action":"UPDATE"},{"gtasId":"16779958","tamrId":"419c20a7-9b69-3bb2-8bc3-3763800f5e39","version":342,"action":"UPDATE"},{"gtasId":"17027331","tamrId":"3a17e54e-20e5-3058-ba33-7c12fd318196","version":342,"action":"UPDATE"},{"gtasId":"22835027","tamrId":"55bcd7b7-455b-3dc4-9632-124e84ef3669","version":342,"action":"UPDATE"},{"gtasId":"19746593","tamrId":"8801940f-9fb0-3ade-bbe9-7f09fcade5b6","version":342,"action":"UPDATE"},{"gtasId":"17564273","tamrId":"ad4501d8-719f-3ed5-bfe9-7688b56b085b","version":342,"action":"UPDATE"},{"gtasId":"10347173","tamrId":"d4eb265c-5f88-3160-b2c4-82332a8cde4d","version":342,"action":"UPDATE"},{"gtasId":"10622174","tamrId":"ad34b9ba-19b6-34f2-8c02-6f143a2ca19b","version":342,"action":"UPDATE"},{"gtasId":"16700869","tamrId":"cced5f8a-a6f2-3d08-9c1d-7d8fdab19eec","version":342,"action":"UPDATE"},{"gtasId":"319618","tamrId":"7511f687-2ab4-3cf5-808f-b4423a2573a3","version":342,"action":"UPDATE"},{"gtasId":"1623841","tamrId":"ec741e62-9046-3ce8-bafc-3c85916264e1","version":342,"action":"UPDATE"},{"gtasId":"15367161","tamrId":"4960d757-050d-3152-8b5f-f46f73b8afbd","version":342,"action":"UPDATE"},{"gtasId":"24955803","tamrId":"da469406-0665-31fa-887c-49d0fc1130e8","version":342,"action":"UPDATE"},{"gtasId":"8557451","tamrId":"41f6a6c7-be1f-3910-9602-da55123819cf","version":342,"action":"UPDATE"},{"gtasId":"8324952","tamrId":"70ee56bb-b5ea-3ffc-af33-df5d5308fef1","version":342,"action":"UPDATE"},{"gtasId":"7190554","tamrId":"cef9b074-c13e-36ac-846c-796521532da9","version":342,"action":"UPDATE"},{"gtasId":"22562326","tamrId":"a7ea8216-5c40-3a5a-aac6-18191bd03fea","version":342,"action":"UPDATE"},{"gtasId":"19963566","tamrId":"c01439ac-b097-3039-b2a6-bc2cf0102a65","version":342,"action":"UPDATE"},{"gtasId":"14914103","tamrId":"58e2689c-d8b5-3ba5-9810-797bd8081318","version":342,"action":"UPDATE"},{"gtasId":"12863637","tamrId":"7d440dda-0d18-3b68-8dda-bd13dd187ab2","version":342,"action":"UPDATE"},{"gtasId":"10341866","tamrId":"05929d20-8f3c-35a8-a1ff-5546fbe34cc4","version":342,"action":"UPDATE"},{"gtasId":"2628060","tamrId":"49e08d40-deb2-3920-97aa-50e96cfd1584","version":342,"action":"UPDATE"},{"gtasId":"6493688","tamrId":"7daaf786-2e82-366a-8522-3adf8ccfeca2","version":342,"action":"UPDATE"},{"gtasId":"9605915","tamrId":"fe0a6fc3-d408-3fab-870a-c28e6662a09e","version":342,"action":"UPDATE"},{"gtasId":"12746424","tamrId":"4a90a87b-6b36-3119-b932-34384c0e37b4","version":342,"action":"UPDATE"},{"gtasId":"7181611","tamrId":"f14bff24-98eb-3d62-b409-1a9cc9288631","version":342,"action":"UPDATE"},{"gtasId":"5702093","tamrId":"4f4f7155-c78e-3250-85eb-9d717b647dcf","version":342,"action":"UPDATE"},{"gtasId":"8550829","tamrId":"2ecf24af-ad37-359c-818d-377b95e30a44","version":342,"action":"UPDATE"},{"gtasId":"4735564","tamrId":"8acd3481-4cf7-3ffd-845c-ac38bfe03c0b","version":342,"action":"UPDATE"},{"gtasId":"6049843","tamrId":"4d9f1516-5b3b-3d4e-bd9d-bbbbfb402f5d","version":342,"action":"UPDATE"},{"gtasId":"10188041","tamrId":"c96854d5-83d3-32b6-9252-26c3d09e08c3","version":342,"action":"UPDATE"},{"gtasId":"13871901","tamrId":"4da4b596-6cbf-32f6-b78e-bb108fd467ec","version":342,"action":"UPDATE"},{"gtasId":"16745759","tamrId":"ff6f28ca-eddf-36cb-976d-31a78dde5c74","version":342,"action":"UPDATE"},{"gtasId":"19996458","tamrId":"2796785b-d02b-3802-b9bc-7f5ea304ebd2","version":342,"action":"UPDATE"},{"gtasId":"18850607","tamrId":"5a19657b-b586-3381-9365-2bb35ad77aac","version":342,"action":"UPDATE"},{"gtasId":"18698926","tamrId":"e8558b1a-0293-3d14-b50c-0c23e09ffb65","version":342,"action":"UPDATE"},{"gtasId":"902177","tamrId":"102e8978-4508-3ceb-9f1f-f2ddb56da51b","version":342,"action":"UPDATE"},{"gtasId":"20326535","tamrId":"527dd030-0c78-3d39-b1bd-d7e4449e8ef1","version":342,"action":"UPDATE"},{"gtasId":"17868938","tamrId":"c82abec2-4963-3485-a4b8-05802a4ab58e","version":342,"action":"UPDATE"},{"gtasId":"5903812","tamrId":"eedcf174-adba-37ce-9691-cc5017632d49","version":342,"action":"UPDATE"},{"gtasId":"9670980","tamrId":"3307c1a6-7517-3b43-ba78-6e335328948b","version":342,"action":"UPDATE"},{"gtasId":"10442913","tamrId":"a0f87b21-8ab5-39ed-92c0-8c25f7ecaa9f","version":342,"action":"UPDATE"},{"gtasId":"15442536","tamrId":"58ec6b0e-2a91-350d-8afe-dcbc0d607114","version":342,"action":"UPDATE"},{"gtasId":"2647234","tamrId":"5e22f42e-b69b-353c-bb66-d0c6dadcd8a7","version":342,"action":"UPDATE"},{"gtasId":"12826632","tamrId":"ad637009-cfe2-3634-820c-004dd0aab068","version":342,"action":"UPDATE"},{"gtasId":"3702835","tamrId":"bfce3a98-1c93-3bbc-96bc-30b0f814ddf8","version":342,"action":"UPDATE"},{"gtasId":"265302","tamrId":"e6e64584-cf5b-30ad-b484-e35d956b9547","version":342,"action":"UPDATE"},{"gtasId":"19297315","tamrId":"795d1671-9b97-3a54-8319-c7b091e9baf0","version":342,"action":"UPDATE"},{"gtasId":"23681968","tamrId":"16070628-800b-3a9c-bc11-9febd01425eb","version":342,"action":"UPDATE"},{"gtasId":"6503507","tamrId":"daa04216-70b7-354b-b109-5275479c8229","version":342,"action":"UPDATE"},{"gtasId":"2903968","tamrId":"2750fe61-07d4-3cc2-b087-2c6274d67eeb","version":342,"action":"UPDATE"},{"gtasId":"8998565","tamrId":"a3445ea0-8580-34e2-89f4-030a7c483de2","version":342,"action":"UPDATE"},{"gtasId":"17739325","tamrId":"531bbc4f-5a5a-36b9-8b63-3515898e550d","version":342,"action":"UPDATE"},{"gtasId":"16540441","tamrId":"0ea66a91-f3ab-3751-89eb-8c9b14171490","version":342,"action":"UPDATE"},{"gtasId":"4995258","tamrId":"239f795c-0fc2-3fbd-a6a1-ccd0d204a102","version":342,"action":"UPDATE"},{"gtasId":"16577725","tamrId":"e98ac625-6440-31e3-9d85-c62c82e6d4f6","version":342,"action":"UPDATE"},{"gtasId":"9524843","tamrId":"8adea816-6675-351b-addc-a6f46f4ed419","version":342,"action":"UPDATE"},{"gtasId":"512624","tamrId":"e9f1d1d9-ba9c-3f12-a6b6-bb0cbdfc276d","version":342,"action":"UPDATE"},{"gtasId":"19959498","tamrId":"c671cef7-5845-3a7f-ac8e-ac7330f194c1","version":342,"action":"UPDATE"},{"gtasId":"2798208","tamrId":"f69bc212-4b6a-3a94-9343-230664a0cca1","version":342,"action":"UPDATE"},{"gtasId":"19186483","tamrId":"adb7bae1-7711-3923-8d5a-41ca9f613b69","version":342,"action":"UPDATE"},{"gtasId":"16692741","tamrId":"a5ac4851-9338-381b-bbf2-76f9d5de73ba","version":342,"action":"UPDATE"},{"gtasId":"15899184","tamrId":"7952087a-8a47-397d-8cf7-b33f1fc1b30d","version":342,"action":"UPDATE"},{"gtasId":"19379746","tamrId":"db5c729d-0361-3c71-8cc3-2bf33043abc3","version":342,"action":"UPDATE"},{"gtasId":"3431880","tamrId":"21d974ba-9b0b-3c04-9130-e2b423f36906","version":342,"action":"UPDATE"},{"gtasId":"7548751","tamrId":"9ea3d2fc-d2cd-3d97-a04a-f22837cf2ba8","version":342,"action":"UPDATE"},{"gtasId":"17628830","tamrId":"7722331f-9a67-3d7a-8254-a4bd01d8dff3","version":342,"action":"UPDATE"},{"gtasId":"24977174","tamrId":"c3f1cf6a-8f0d-39c4-b10e-ed648df741ab","version":342,"action":"UPDATE"},{"gtasId":"14506000","tamrId":"15b76688-16b2-33a2-8ac2-a596627ee5ad","version":342,"action":"UPDATE"},{"gtasId":"19505177","tamrId":"723c08c9-530a-320e-94c0-5ed42bbf6cb1","version":342,"action":"UPDATE"},{"gtasId":"9187043","tamrId":"791ab645-03d6-3799-a1d7-c5af8863ef6a","version":342,"action":"UPDATE"},{"gtasId":"14665059","tamrId":"259e40c0-dc52-31bb-b63e-60a6ba94aed2","version":342,"action":"UPDATE"},{"gtasId":"20286792","tamrId":"f4d421c2-64b6-3ec2-bc4f-59816ee6c92d","version":342,"action":"UPDATE"},{"gtasId":"13286891","tamrId":"ea03607b-7f90-3b4d-a18c-62e6205ba795","version":342,"action":"UPDATE"},{"gtasId":"18307010","tamrId":"21d41204-527d-3ff6-ad8b-9acce4531787","version":342,"action":"UPDATE"},{"gtasId":"8030458","tamrId":"31689c65-fbfa-3a31-829a-dd7f2927d32a","version":342,"action":"UPDATE"},{"gtasId":"16843358","tamrId":"fd127efc-4ace-3aa9-bc2b-cdcd62a57b6f","version":342,"action":"UPDATE"},{"gtasId":"14108081","tamrId":"94774d36-7d5e-350b-b580-61b52b7c18fe","version":342,"action":"UPDATE"},{"gtasId":"10426081","tamrId":"f0219955-024a-34b8-b1a5-dea94f374ed7","version":342,"action":"UPDATE"},{"gtasId":"1119829","tamrId":"c7ff0f90-5752-3ae3-b9cd-c937d4be0e41","version":342,"action":"UPDATE"},{"gtasId":"4380055","tamrId":"61bb7d0f-719a-3e55-b1f6-18822aee20d2","version":342,"action":"UPDATE"},{"gtasId":"13940662","tamrId":"8ed9310c-922b-3dcc-bccf-966ecbf83881","version":342,"action":"UPDATE"},{"gtasId":"19960492","tamrId":"e2e5d1ac-998f-34d0-accb-fc15bd80cba7","version":342,"action":"UPDATE"},{"gtasId":"20891493","tamrId":"f8646b03-3f10-3e3d-b44c-197c13aa7a87","version":342,"action":"UPDATE"},{"gtasId":"10545498","tamrId":"7df22682-3719-3436-a4a8-6514bb011ee2","version":342,"action":"UPDATE"},{"gtasId":"13741021","tamrId":"2c3dce06-ef1e-35cf-833a-5db027d38d86","version":342,"action":"UPDATE"},{"gtasId":"21666256","tamrId":"2c42b657-5611-3686-aae0-113d461a3552","version":342,"action":"UPDATE"},{"gtasId":"8710821","tamrId":"259e40c0-dc52-31bb-b63e-60a6ba94aed2","version":342,"action":"UPDATE"},{"gtasId":"15835999","tamrId":"6604b8d9-c6f8-3fc5-9df8-4d51f3d0010d","version":342,"action":"UPDATE"},{"gtasId":"196653","tamrId":"d765a0de-f574-39c5-be55-d97411bc928c","version":342,"action":"UPDATE"},{"gtasId":"16877568","tamrId":"bde01237-32fa-3ffe-ba48-9c23cea33de6","version":342,"action":"UPDATE"},{"gtasId":"15661311","tamrId":"710013f6-3a0a-33a7-813f-e8d896b01174","version":342,"action":"UPDATE"},{"gtasId":"18963767","tamrId":"7c724d44-e629-3feb-a506-8a4e6648c545","version":342,"action":"UPDATE"},{"gtasId":"25531571","tamrId":"ec4ef2f1-fe28-3637-bd02-30e25b3bee36","version":342,"action":"UPDATE"},{"gtasId":"19918906","tamrId":"84ffd2c9-482b-3416-bf28-b5cee0070299","version":342,"action":"UPDATE"},{"gtasId":"13148339","tamrId":"29efb777-31d9-34af-a60f-8c792fe46251","version":342,"action":"UPDATE"},{"gtasId":"14385192","tamrId":"fa591cca-ec08-3717-9556-b6cb1b3f245a","version":342,"action":"UPDATE"},{"gtasId":"13867063","tamrId":"c9ae3054-5be7-3741-9236-7c81df9cd493","version":342,"action":"UPDATE"},{"gtasId":"16456163","tamrId":"24e70a16-97b0-3e96-a43d-7eaec03a725f","version":342,"action":"UPDATE"},{"gtasId":"1174699","tamrId":"a413b0a8-801a-39ce-b4f9-b9810fb8c50a","version":342,"action":"UPDATE"},{"gtasId":"23134886","tamrId":"edfb7d1e-8c98-3f42-9172-dbd5b1f5145d","version":342,"action":"UPDATE"},{"gtasId":"4485146","tamrId":"2b355b1c-e907-3d8a-82ea-b00e7a834043","version":342,"action":"UPDATE"},{"gtasId":"5807964","tamrId":"69613dd2-6401-3b4b-93b5-66332c515bbf","version":342,"action":"UPDATE"},{"gtasId":"6906398","tamrId":"fa2ee35f-43bd-35f9-9958-d7b458bc3335","version":342,"action":"UPDATE"},{"gtasId":"8549802","tamrId":"8e931f24-8f4b-30fd-87bd-1f6cf2f8f319","version":342,"action":"UPDATE"},{"gtasId":"2126323","tamrId":"bf70ace4-f99b-3809-919d-6148b3cf6c8a","version":342,"action":"UPDATE"},{"gtasId":"4802456","tamrId":"d286b7e4-9b0f-3ea0-8760-f137dbcf911b","version":342,"action":"UPDATE"},{"gtasId":"8301413","tamrId":"78385f66-2a74-3086-a6c3-4c104c608e9e","version":342,"action":"UPDATE"},{"gtasId":"23073386","tamrId":"03dae92e-072c-3484-8c8f-5f96c6afb59a","version":342,"action":"UPDATE"},{"gtasId":"2639667","tamrId":"7dd62029-4f5d-3c53-909a-e7a40f115739","version":342,"action":"UPDATE"},{"gtasId":"24036167","tamrId":"aa82c01d-28cc-3abc-a5d2-6001c11ae28e","version":342,"action":"UPDATE"},{"gtasId":"20357644","tamrId":"9b615795-1725-3005-88c9-e784d1d688a7","version":342,"action":"UPDATE"},{"gtasId":"10850636","tamrId":"6fb085a3-7389-3eb1-8bd4-ecc7949f202f","version":342,"action":"UPDATE"},{"gtasId":"4427289","tamrId":"f132c05d-2387-3b58-9e7a-7ab1655326c3","version":342,"action":"UPDATE"},{"gtasId":"21344663","tamrId":"24360387-2835-319f-bb81-0610c2a45f77","version":342,"action":"UPDATE"},{"gtasId":"16393728","tamrId":"ecda3812-1f56-356f-afdf-c6b51a0fda65","version":342,"action":"UPDATE"},{"gtasId":"11555439","tamrId":"fd1f966f-0aa5-34e4-be21-df1f7aedbaa4","version":342,"action":"UPDATE"},{"gtasId":"3555276","tamrId":"3ac4e0f1-9b4a-3cab-83f2-8b802b214cd7","version":342,"action":"UPDATE"},{"gtasId":"22201067","tamrId":"24be0bd1-a899-359e-abba-220e539e3645","version":342,"action":"UPDATE"},{"gtasId":"12720694","tamrId":"109faed7-4b51-354f-bb60-1277c7c82dca","version":342,"action":"UPDATE"},{"gtasId":"9125531","tamrId":"fe0a6fc3-d408-3fab-870a-c28e6662a09e","version":342,"action":"UPDATE"},{"gtasId":"2099138","tamrId":"3b99af23-7529-3b77-80b4-23addd11532b","version":342,"action":"UPDATE"},{"gtasId":"8043784","tamrId":"dd2e187c-0ed9-3786-98a9-188a7d410119","version":342,"action":"UPDATE"},{"gtasId":"6464303","tamrId":"c7216ac1-9bca-3e0c-adb8-cbd530defb3c","version":342,"action":"UPDATE"},{"gtasId":"3115122","tamrId":"7cc358b7-ce26-316c-877a-d983e52d6918","version":342,"action":"UPDATE"},{"gtasId":"3362742","tamrId":"4c6828b8-6c77-346d-b633-6a2c291b99e4","version":342,"action":"UPDATE"},{"gtasId":"5206493","tamrId":"78204a61-07d6-3da8-b500-fc4d8a631b1c","version":342,"action":"UPDATE"},{"gtasId":"12485328","tamrId":"f067a162-da29-375c-8d35-1dadbe8188e6","version":342,"action":"UPDATE"},{"gtasId":"11971292","tamrId":"faa25544-0d2a-372b-84e0-6d6417a8adcd","version":342,"action":"UPDATE"},{"gtasId":"1913917","tamrId":"b03e3a85-82dd-3a93-b612-2d92fcc2d7ba","version":342,"action":"UPDATE"},{"gtasId":"2550606","tamrId":"cea1c62f-f028-3105-a999-856a7071bad7","version":342,"action":"UPDATE"},{"gtasId":"9730796","tamrId":"98982e82-ee36-3b88-8932-1e93e89d5e29","version":342,"action":"UPDATE"},{"gtasId":"1921535","tamrId":"6ace52df-7ba3-32d4-99a1-c1fa47716ea3","version":342,"action":"UPDATE"},{"gtasId":"19341165","tamrId":"2c83718b-77d2-376b-9e2a-3e2103940425","version":342,"action":"UPDATE"},{"gtasId":"3559615","tamrId":"e6ceae6b-4dd7-37be-831b-23918133508d","version":342,"action":"UPDATE"},{"gtasId":"20753887","tamrId":"dfea1c26-07b8-3a48-ac94-f0d304671d6f","version":342,"action":"UPDATE"},{"gtasId":"6140845","tamrId":"86f8486f-8a87-3c3e-91fa-30a4a9ca0926","version":342,"action":"UPDATE"},{"gtasId":"649345","tamrId":"bad86593-d535-3ba8-bfe8-f78701aca276","version":342,"action":"UPDATE"},{"gtasId":"5463570","tamrId":"e146afdf-2ab7-32eb-8c94-8cb17cceb316","version":342,"action":"UPDATE"},{"gtasId":"5077231","tamrId":"26b87b96-f91b-3a4c-867d-a321e8a182ba","version":342,"action":"UPDATE"},{"gtasId":"3930585","tamrId":"4e07a3e8-e14c-3436-9f7d-cbeea4933886","version":342,"action":"UPDATE"},{"gtasId":"5290740","tamrId":"513ba89d-03d2-39a6-b3b8-5ddf77e0f90b","version":342,"action":"UPDATE"},{"gtasId":"17820051","tamrId":"21adad39-89d5-3bc1-865b-ae1d563633c0","version":342,"action":"UPDATE"},{"gtasId":"2659298","tamrId":"c163ad69-480f-34e7-8c6f-481339e78d7f","version":342,"action":"UPDATE"},{"gtasId":"22799701","tamrId":"7008e8e8-8d66-3784-9131-4477c66eabbd","version":342,"action":"UPDATE"},{"gtasId":"7112140","tamrId":"eabe1aa2-3436-37d0-a846-31ca853bcb9f","version":342,"action":"UPDATE"},{"gtasId":"16881634","tamrId":"9f274292-452b-3570-86ba-b639ecc0b0f6","version":342,"action":"UPDATE"},{"gtasId":"2081861","tamrId":"06278553-570e-3c12-8af8-d533d7949392","version":342,"action":"UPDATE"},{"gtasId":"15230424","tamrId":"666fe77b-f576-329f-9699-43672aacf471","version":342,"action":"UPDATE"},{"gtasId":"5129846","tamrId":"e2670c56-45cf-3214-adfe-cb9c5aa73337","version":342,"action":"UPDATE"},{"gtasId":"7605881","tamrId":"19cd9b31-a834-30d1-a785-38571cf93441","version":342,"action":"UPDATE"},{"gtasId":"5024748","tamrId":"7b741db8-7aed-3548-8215-384b7a6a7853","version":342,"action":"UPDATE"},{"gtasId":"24145303","tamrId":"84482dd2-2002-381d-901f-1b205bee4003","version":342,"action":"UPDATE"},{"gtasId":"4890176","tamrId":"f66f0ec1-cf72-3f40-b362-efac15dfd5c9","version":342,"action":"UPDATE"},{"gtasId":"3534351","tamrId":"c755adb2-5723-3903-9de1-f400909dfc8f","version":342,"action":"UPDATE"},{"gtasId":"2572824","tamrId":"49c2277b-24dc-3e4a-9df0-0478c087859d","version":342,"action":"UPDATE"},{"gtasId":"545584","tamrId":"9afa7452-c7db-36de-a0b8-a3ee8ac436a2","version":342,"action":"UPDATE"},{"gtasId":"18124768","tamrId":"2ae453ed-b2bd-348c-beef-484313e5c26e","version":342,"action":"UPDATE"},{"gtasId":"11068853","tamrId":"1219ca6e-1a7c-3c3a-93ef-eb1dfddc8761","version":342,"action":"UPDATE"},{"gtasId":"20836644","tamrId":"46bc7320-8da9-37a4-b851-4f9173e594c7","version":342,"action":"UPDATE"},{"gtasId":"21983591","tamrId":"4c18f037-e718-3fd5-815f-6999ad931367","version":342,"action":"UPDATE"},{"gtasId":"5218484","tamrId":"5e971af8-de07-3fe3-b79f-f1bb466df244","version":342,"action":"UPDATE"},{"gtasId":"10694695","tamrId":"c5aa783a-c871-3c8c-85e5-2624eef32148","version":342,"action":"UPDATE"},{"gtasId":"16677070","tamrId":"6235576e-7edf-3e1a-86ff-6da7cedfc60e","version":342,"action":"UPDATE"},{"gtasId":"13146598","tamrId":"661ff74f-b019-3ef1-8e17-06800cf6d814","version":342,"action":"UPDATE"},{"gtasId":"10764255","tamrId":"bff1ef7e-65a5-3f58-8d18-f5a03f6829e8","version":342,"action":"UPDATE"},{"gtasId":"440463","tamrId":"57ee3d4a-3cf2-3811-aac2-34a7f44f2be1","version":342,"action":"UPDATE"},{"gtasId":"20294391","tamrId":"ec885331-57c5-3fe3-a504-e623314512de","version":342,"action":"UPDATE"},{"gtasId":"1770854","tamrId":"844aff7a-f70a-3833-80a7-4ea0123a907c","version":342,"action":"UPDATE"},{"gtasId":"17545950","tamrId":"766353d5-6f20-329b-9b6a-41859e4e2eb9","version":342,"action":"UPDATE"},{"gtasId":"8075360","tamrId":"1b859b54-95f1-367f-92af-91a986b2d2d7","version":342,"action":"UPDATE"},{"gtasId":"2440135","tamrId":"0f2b93da-50a6-3c03-93b3-e452733b009e","version":342,"action":"UPDATE"},{"gtasId":"8486623","tamrId":"52a66cd1-7d65-3b4f-a844-194bd55ec9f1","version":342,"action":"UPDATE"},{"gtasId":"25461979","tamrId":"7d8bb60c-a4c3-30a0-87e7-16c863f21a58","version":342,"action":"UPDATE"},{"gtasId":"23081884","tamrId":"28ec985b-4f36-3333-b44b-b24718cba113","version":342,"action":"UPDATE"},{"gtasId":"6821632","tamrId":"a9c0a5d4-981a-3033-9f61-69e08b49b6b9","version":342,"action":"UPDATE"},{"gtasId":"19543393","tamrId":"932d5111-ee31-3766-9c3b-4ffef35113d9","version":342,"action":"UPDATE"},{"gtasId":"6695893","tamrId":"474a0170-41fe-36e8-8ef8-d8428434f926","version":342,"action":"UPDATE"},{"gtasId":"824081","tamrId":"cb1801c1-8839-3af9-b4a6-b84414d2e564","version":342,"action":"UPDATE"},{"gtasId":"15895646","tamrId":"7642d4fa-ed77-3522-ab8f-946331cdc118","version":342,"action":"UPDATE"},{"gtasId":"24299039","tamrId":"c4c8295f-d5e7-3cc2-8bd7-043ecce3623f","version":342,"action":"UPDATE"},{"gtasId":"8530355","tamrId":"f31f0035-3df0-37ca-a187-4a283182bb48","version":342,"action":"UPDATE"},{"gtasId":"8920697","tamrId":"8a23699f-7e45-3756-aa48-e39d69f50def","version":342,"action":"UPDATE"},{"gtasId":"17926415","tamrId":"f2c1b1fb-a3d3-34c3-b567-533c650c3121","version":342,"action":"UPDATE"},{"gtasId":"9552904","tamrId":"43fc3a25-34ea-329c-b669-ef1660ded6c8","version":342,"action":"UPDATE"},{"gtasId":"4214687","tamrId":"372d2ce3-0836-368f-bfa4-80e5f87674f2","version":342,"action":"UPDATE"},{"gtasId":"4132382","tamrId":"c4fb6ba2-3313-3083-9e84-786f06df5f35","version":342,"action":"UPDATE"},{"gtasId":"25340332","tamrId":"79340e74-13eb-3131-ac7f-5673e3accdfa","version":342,"action":"UPDATE"},{"gtasId":"23204343","tamrId":"48e61db3-8e2e-3cf2-854d-653d99ee3d7a","version":342,"action":"UPDATE"},{"gtasId":"20007561","tamrId":"0131a84c-4ca7-3d9f-954e-9b4b9c7bab2f","version":342,"action":"UPDATE"},{"gtasId":"10335927","tamrId":"42c214e9-40f0-32b0-a9d4-1a96b96adbff","version":342,"action":"UPDATE"},{"gtasId":"5332257","tamrId":"9f9f23ac-c375-35d6-83fd-38c546ed9a17","version":342,"action":"UPDATE"},{"gtasId":"1429421","tamrId":"ccbc7b5a-5410-389c-9dca-ad9a5b386aae","version":342,"action":"UPDATE"},{"gtasId":"6994991","tamrId":"1f38d809-93ee-3820-bc30-c0e4e84b219e","version":342,"action":"UPDATE"},{"gtasId":"1863008","tamrId":"3412922e-3463-3d46-9846-5f8cacbcc57e","version":342,"action":"UPDATE"},{"gtasId":"2764020","tamrId":"5b38be8e-82bf-3c79-8ea8-88e3eadec079","version":342,"action":"UPDATE"},{"gtasId":"7325903","tamrId":"44767dfa-132f-388a-b245-38b827c0347e","version":342,"action":"UPDATE"},{"gtasId":"8197497","tamrId":"39affe63-09dd-3162-a120-83bca1ae6b61","version":342,"action":"UPDATE"},{"gtasId":"13335519","tamrId":"0d251ac5-f614-3285-8281-b091e61a44f5","version":342,"action":"UPDATE"},{"gtasId":"25283211","tamrId":"24bb20d0-1162-321b-bb4c-ab65c7956a0b","version":342,"action":"UPDATE"},{"gtasId":"9206607","tamrId":"67a85f6a-4cd5-319a-bea3-248108abba07","version":342,"action":"UPDATE"},{"gtasId":"337502","tamrId":"ee8729dd-842f-3489-bad6-b97ae270bb35","version":342,"action":"UPDATE"},{"gtasId":"15575622","tamrId":"a6774ffe-daeb-3988-ac85-7184900ad778","version":342,"action":"UPDATE"},{"gtasId":"3244676","tamrId":"078afb11-7c92-3aba-8502-492dcf40dcbc","version":342,"action":"UPDATE"},{"gtasId":"3712138","tamrId":"10226e3a-32a7-3039-8e86-e931992b4a60","version":342,"action":"UPDATE"},{"gtasId":"22224536","tamrId":"bda9679b-d19e-325a-91b3-ad14de7010cd","version":342,"action":"UPDATE"},{"gtasId":"22463336","tamrId":"5e6da92e-8410-3b8a-a972-7a157a60ee9a","version":342,"action":"UPDATE"},{"gtasId":"19331728","tamrId":"c4a917cb-33e6-3d37-9325-a066619fa759","version":342,"action":"UPDATE"},{"gtasId":"7071951","tamrId":"285fa470-40d7-36b0-8495-daae0a2896da","version":342,"action":"UPDATE"},{"gtasId":"9204872","tamrId":"4597ddbe-5d39-395a-84b0-ba57b681ed0f","version":342,"action":"UPDATE"},{"gtasId":"8970972","tamrId":"ea226cc8-1d09-3acb-8b46-85cd1ef22e72","version":342,"action":"UPDATE"},{"gtasId":"9644","tamrId":"6eaed6c9-8562-33a2-8e5c-720904255ab0","version":342,"action":"UPDATE"},{"gtasId":"11083585","tamrId":"c4e76d18-4a78-32b7-a578-73ecc06cf9c7","version":342,"action":"UPDATE"},{"gtasId":"11139396","tamrId":"390bc04f-0795-3ec9-8ebf-f55984769f20","version":342,"action":"UPDATE"},{"gtasId":"12369903","tamrId":"dbb6fc88-bed2-3344-8293-21f68839ae76","version":342,"action":"UPDATE"},{"gtasId":"20573711","tamrId":"9ccaaacf-3f73-3ec4-a440-b5bf9d99e5a9","version":342,"action":"UPDATE"},{"gtasId":"13045000","tamrId":"1e920f24-e96e-3831-9aea-ee3511d0c958","version":342,"action":"UPDATE"},{"gtasId":"9867452","tamrId":"0e3d9520-abfb-33d9-b7fc-ceeec2616bd1","version":342,"action":"UPDATE"},{"gtasId":"20330536","tamrId":"5d2796df-4b92-3639-91d3-ee1bdb892656","version":342,"action":"UPDATE"},{"gtasId":"15524053","tamrId":"b30db371-25be-3976-a675-a91a8352d188","version":342,"action":"UPDATE"},{"gtasId":"9471714","tamrId":"b6b209bf-cfb1-3e4f-8a73-ba178ad17849","version":342,"action":"UPDATE"},{"gtasId":"7264507","tamrId":"8bc70477-e99e-3c27-877b-a08095928216","version":342,"action":"UPDATE"},{"gtasId":"8568957","tamrId":"82d2fda2-5db7-3c0c-b87f-85adbbf205d1","version":342,"action":"UPDATE"},{"gtasId":"9765461","tamrId":"ac9d10d9-c964-3271-9adc-dd9bd3b5f9b7","version":342,"action":"UPDATE"},{"gtasId":"20543071","tamrId":"3c45ce69-6d58-34a8-b019-de0fad75b5e1","version":342,"action":"UPDATE"},{"gtasId":"3724138","tamrId":"c7caae0e-392a-39e7-be3e-2860c84a373e","version":342,"action":"UPDATE"},{"gtasId":"24048263","tamrId":"0d278399-e6d6-3c33-8492-1c8ea45c3ea6","version":342,"action":"UPDATE"},{"gtasId":"403442","tamrId":"00e86f81-fb8b-3f9b-a552-6b16698661d5","version":342,"action":"UPDATE"},{"gtasId":"5227399","tamrId":"f61033c7-7c3b-32cf-a81f-8ec696dd56d5","version":342,"action":"UPDATE"},{"gtasId":"7884755","tamrId":"02e4133e-6266-3725-95b9-19156438b962","version":342,"action":"UPDATE"},{"gtasId":"22030754","tamrId":"fb576852-b98f-339c-901f-47ed46b5d7bd","version":342,"action":"UPDATE"},{"gtasId":"2410314","tamrId":"a8748475-1e2f-36ef-91e1-77a97ca7872a","version":342,"action":"UPDATE"},{"gtasId":"20498061","tamrId":"62e34283-3d47-3790-888d-9f9558928d8f","version":342,"action":"UPDATE"},{"gtasId":"20705357","tamrId":"282d65d6-3eb7-333e-bad3-02d0f2381f1c","version":342,"action":"UPDATE"},{"gtasId":"5371834","tamrId":"3018fadd-0b5d-3219-820d-4d8c1b1fbcb8","version":342,"action":"UPDATE"},{"gtasId":"16417303","tamrId":"e6a6469a-e667-34bd-896b-e04646ea3ad5","version":342,"action":"UPDATE"},{"gtasId":"2672294","tamrId":"38a6a24c-5006-34a2-9e8e-5751ab1dba46","version":342,"action":"UPDATE"},{"gtasId":"9920090","tamrId":"7ebc827a-abb7-3130-90b0-9d8212ed6426","version":342,"action":"UPDATE"},{"gtasId":"4823403","tamrId":"db9822e0-db5a-3903-b45d-efb6c200b449","version":342,"action":"UPDATE"},{"gtasId":"11761329","tamrId":"34a49f19-eefc-39d2-b50c-2743ddfc3ce7","version":342,"action":"UPDATE"},{"gtasId":"25258340","tamrId":"cc839a04-f05f-32b7-8107-6730433dfe94","version":342,"action":"UPDATE"},{"gtasId":"23379301","tamrId":"1932f12f-1c91-3223-86cc-c9a8fcb8646c","version":342,"action":"UPDATE"},{"gtasId":"15925109","tamrId":"e974e8f2-3b6b-3fd8-a654-791a11d567f9","version":342,"action":"UPDATE"},{"gtasId":"7265823","tamrId":"1ac72886-881b-35fb-a705-a42005ded0ce","version":342,"action":"UPDATE"},{"gtasId":"4939908","tamrId":"0932a4fc-2ed0-3a54-a6ad-23d239ff9778","version":342,"action":"UPDATE"},{"gtasId":"8645376","tamrId":"c075f749-f7d9-3cb3-b684-4924992153c6","version":342,"action":"UPDATE"},{"gtasId":"636897","tamrId":"fba47e7d-026f-33a8-acb5-463abcf151e3","version":342,"action":"UPDATE"},{"gtasId":"19830330","tamrId":"d25efa2d-a759-3c55-bab2-f95636fed9a3","version":342,"action":"UPDATE"},{"gtasId":"18027659","tamrId":"c5d49672-acee-383d-b10b-6435a97dcdfa","version":342,"action":"UPDATE"},{"gtasId":"18678407","tamrId":"a4b4fa80-7c0d-3751-9617-edd84609fa03","version":342,"action":"UPDATE"},{"gtasId":"3735670","tamrId":"c9e1e908-6895-32c6-a7eb-9bf9b80217cf","version":342,"action":"UPDATE"},{"gtasId":"7982370","tamrId":"e90f9ee2-9256-3388-87a4-1e02e9e15548","version":342,"action":"UPDATE"},{"gtasId":"22373464","tamrId":"13cfa302-3095-3c53-a0ec-d294ed88bd93","version":342,"action":"UPDATE"},{"gtasId":"17261647","tamrId":"b38e3ac4-d0ec-373b-abbf-9d84a2e8e678","version":342,"action":"UPDATE"},{"gtasId":"3966469","tamrId":"229a0bc4-b15a-3c28-a641-ba3d1b079dc2","version":342,"action":"UPDATE"},{"gtasId":"14726585","tamrId":"6d0110eb-8d1c-397c-8674-5f1dfa713285","version":342,"action":"UPDATE"},{"gtasId":"19098560","tamrId":"366557ee-ca59-3bb2-966d-68c2bb6c8440","version":342,"action":"UPDATE"},{"gtasId":"18143880","tamrId":"62e34283-3d47-3790-888d-9f9558928d8f","version":342,"action":"UPDATE"},{"gtasId":"17845382","tamrId":"e47fb01d-fc1e-31d3-b515-91a6c42d831c","version":342,"action":"UPDATE"},{"gtasId":"1578764","tamrId":"0de5de9e-092f-3f52-a7a2-99aaca19d2d7","version":342,"action":"UPDATE"},{"gtasId":"7747884","tamrId":"b8d9cdc4-609d-3ce8-9762-58adf83c9354","version":342,"action":"UPDATE"},{"gtasId":"13296292","tamrId":"8a1f0a20-20d2-3a11-8987-993599e12a0f","version":342,"action":"UPDATE"},{"gtasId":"363730","tamrId":"20c7eb57-150e-3dd7-a1a4-e2d0f15eb4f3","version":342,"action":"UPDATE"},{"gtasId":"17828058","tamrId":"cd73b07f-9cd8-3994-b6ce-3532709d2564","version":342,"action":"UPDATE"},{"gtasId":"8862302","tamrId":"d6f30f14-5b26-3c71-a68c-b63acbf5779e","version":342,"action":"UPDATE"},{"gtasId":"6430145","tamrId":"7ac22245-d729-34b2-9350-927809f5571b","version":342,"action":"UPDATE"},{"gtasId":"4031541","tamrId":"9544510d-47f0-3dcc-8f07-7fb240ad0f13","version":342,"action":"UPDATE"},{"gtasId":"18273157","tamrId":"d4d98b57-2c4c-3c46-a190-5dcf57041d4d","version":342,"action":"UPDATE"},{"gtasId":"10168339","tamrId":"5640c8e3-5ac0-3d1e-ae81-17b8752be5ed","version":342,"action":"UPDATE"},{"gtasId":"24829236","tamrId":"10f4ae13-d03f-3fbe-ba45-d43a98bfd76f","version":342,"action":"UPDATE"},{"gtasId":"22654905","tamrId":"03b34d6c-a2c3-332a-a866-65e805eb7f16","version":342,"action":"UPDATE"},{"gtasId":"3987390","tamrId":"25142319-ac28-330e-ad0e-ec642c414712","version":342,"action":"UPDATE"},{"gtasId":"24995936","tamrId":"7d48cda8-48a7-35c5-91ef-e78f3e13ec07","version":342,"action":"UPDATE"},{"gtasId":"6409546","tamrId":"af358068-3944-360b-ac58-c75accc0cbe3","version":342,"action":"UPDATE"},{"gtasId":"18153211","tamrId":"50377725-ce79-30fd-9340-462c85c70a4b","version":342,"action":"UPDATE"},{"gtasId":"16371516","tamrId":"77903cc0-78e5-391f-a97b-d5dc058c3244","version":342,"action":"UPDATE"},{"gtasId":"13900074","tamrId":"95cd498d-1656-33b6-9ea4-904048c61ac8","version":342,"action":"UPDATE"},{"gtasId":"1153694","tamrId":"c3030f75-44cd-32de-9aa5-2e978b4ab46d","version":342,"action":"UPDATE"},{"gtasId":"265397","tamrId":"27539467-3f4e-3dbf-9357-e47dd4cff355","version":342,"action":"UPDATE"},{"gtasId":"2340202","tamrId":"6cb7ebda-f960-3d2f-b90d-449be0274134","version":342,"action":"UPDATE"},{"gtasId":"6392030","tamrId":"957ac96c-419f-345b-9d3d-79d0f8a37f55","version":342,"action":"UPDATE"},{"gtasId":"1178974","tamrId":"1e67cda3-bf98-3fd1-8551-0e4bceb1534c","version":342,"action":"UPDATE"},{"gtasId":"15754349","tamrId":"ce9df873-49ca-3af4-9dc5-e0b4b730e4af","version":342,"action":"UPDATE"},{"gtasId":"5513110","tamrId":"39cf70b3-6fb8-3b1c-8f12-8f7d2f42a4e8","version":342,"action":"UPDATE"},{"gtasId":"20971778","tamrId":"486010aa-4f28-3c75-b21b-b3a1bea94b62","version":342,"action":"UPDATE"},{"gtasId":"668491","tamrId":"9b14739b-0117-34ae-a8fc-513aa9e7d4f6","version":342,"action":"UPDATE"},{"gtasId":"5649297","tamrId":"73f60af6-6702-3532-a81b-784ab95dbb61","version":342,"action":"UPDATE"},{"gtasId":"8551249","tamrId":"c7edbff6-e2a0-379c-bb2b-854544076d77","version":342,"action":"UPDATE"},{"gtasId":"12216684","tamrId":"50034fa7-a142-3a19-9dbd-961a28802bb8","version":342,"action":"UPDATE"},{"gtasId":"494201","tamrId":"7b2db888-4110-358c-8eb8-2257e4206f95","version":342,"action":"UPDATE"},{"gtasId":"24908633","tamrId":"92071b7e-6fc2-3fb3-a7ea-a4c8dea8e3d3","version":342,"action":"UPDATE"},{"gtasId":"12562935","tamrId":"4a87b9ce-cd91-3f9f-b600-d6f14d29f2c0","version":342,"action":"UPDATE"},{"gtasId":"2720425","tamrId":"3d87fdd1-541e-371b-8877-1f64baf73888","version":342,"action":"UPDATE"},{"gtasId":"15461717","tamrId":"2ce73f4e-13bc-3bd7-821d-b38a917fee6d","version":342,"action":"UPDATE"},{"gtasId":"23379345","tamrId":"8f961b16-8823-3b65-96b0-678e3af47d29","version":342,"action":"UPDATE"},{"gtasId":"3040224","tamrId":"847c4446-4101-36d0-81fe-3c9aa500e6be","version":342,"action":"UPDATE"},{"gtasId":"12908139","tamrId":"9042c280-b310-30ea-9e54-edd9fc9740ef","version":342,"action":"UPDATE"},{"gtasId":"2926608","tamrId":"ea30b248-eec3-39ad-8aeb-20cb89971454","version":342,"action":"UPDATE"},{"gtasId":"4434341","tamrId":"bf70ace4-f99b-3809-919d-6148b3cf6c8a","version":342,"action":"UPDATE"},{"gtasId":"14371311","tamrId":"27c52884-846b-3dad-9324-d84e2600ad44","version":342,"action":"UPDATE"},{"gtasId":"20572451","tamrId":"6f55423a-0c27-30d6-8073-7e3f03f55f23","version":342,"action":"UPDATE"},{"gtasId":"19208368","tamrId":"6a138458-7976-39c0-90ab-18c44ddb0fe3","version":342,"action":"UPDATE"},{"gtasId":"20614059","tamrId":"03e25d57-489b-3705-a9eb-3d836f846798","version":342,"action":"UPDATE"},{"gtasId":"23510597","tamrId":"33a82c85-3f14-3f14-b2d4-e679fb9aad07","version":342,"action":"UPDATE"},{"gtasId":"3605704","tamrId":"557087a2-3949-3bf8-9ab9-08a07b796671","version":342,"action":"UPDATE"},{"gtasId":"10004179","tamrId":"18633340-476b-364c-8e1a-177f8fa9d759","version":342,"action":"UPDATE"},{"gtasId":"22819825","tamrId":"20b3d238-2058-3a17-b24d-7611e2883887","version":342,"action":"UPDATE"},{"gtasId":"5267587","tamrId":"015a9eb1-ad7a-3805-97dc-5da80ef44117","version":342,"action":"UPDATE"},{"gtasId":"19066116","tamrId":"0e6040f6-25a0-3f77-ab63-1135b6c88611","version":342,"action":"UPDATE"},{"gtasId":"8312199","tamrId":"bc69c2c3-0da2-3a94-a9e4-ba8f656d6c8d","version":342,"action":"UPDATE"},{"gtasId":"19756755","tamrId":"45dd14c5-c443-341f-bd84-29a75940bd4c","version":342,"action":"UPDATE"},{"gtasId":"4413405","tamrId":"1aee24fb-98a8-35ec-9d21-5c68ae6daf8e","version":342,"action":"UPDATE"},{"gtasId":"22037320","tamrId":"45a2c67c-1922-34b5-b2b9-e7cce9f664b2","version":342,"action":"UPDATE"},{"gtasId":"4141261","tamrId":"42d00e8c-710c-3bc5-ace0-a47795298215","version":342,"action":"UPDATE"},{"gtasId":"2591907","tamrId":"33e0a8b2-1135-3c22-9fd7-d393a2dc54b9","version":342,"action":"UPDATE"},{"gtasId":"11582197","tamrId":"30f408dd-7d2a-3342-8430-4e06308d972f","version":342,"action":"UPDATE"},{"gtasId":"5133829","tamrId":"6c4a35c4-de5c-3da2-977d-d5c34969920f","version":342,"action":"UPDATE"},{"gtasId":"10200276","tamrId":"f0e44487-9f47-3c86-b926-88975d189607","version":342,"action":"UPDATE"},{"gtasId":"3269115","tamrId":"78b09e05-b1b9-3746-8360-9d6e226e83b7","version":342,"action":"UPDATE"},{"gtasId":"8304565","tamrId":"c03d1c68-fee4-3927-b068-9163dc002073","version":342,"action":"UPDATE"},{"gtasId":"19117371","tamrId":"dc32b0b5-af1f-3386-86ba-d09169ac1f72","version":342,"action":"UPDATE"},{"gtasId":"16658826","tamrId":"be797e5b-859c-3d7d-ab08-656dd8e69f4d","version":342,"action":"UPDATE"},{"gtasId":"20806791","tamrId":"51a02d8f-cce1-3a3b-a12e-437c30705ec0","version":342,"action":"UPDATE"},{"gtasId":"6386257","tamrId":"05955666-1978-39be-8e97-0ea8e259733b","version":342,"action":"UPDATE"},{"gtasId":"17702978","tamrId":"8732a988-635d-34b5-bae7-12e8659ab1c3","version":342,"action":"UPDATE"},{"gtasId":"19722529","tamrId":"e5b670f5-5c94-3d3c-8c90-ae29c34cb83c","version":342,"action":"UPDATE"},{"gtasId":"2059092","tamrId":"36ff6098-038d-3822-8432-2c71a006feba","version":342,"action":"UPDATE"},{"gtasId":"12852148","tamrId":"7ccaa603-6cd2-349a-b287-2ac18642975f","version":342,"action":"UPDATE"},{"gtasId":"20707945","tamrId":"9ae5559c-2964-3f3e-b615-159233c46390","version":342,"action":"UPDATE"},{"gtasId":"20094702","tamrId":"3454e295-7946-3c32-84aa-81e49e02157a","version":342,"action":"UPDATE"},{"gtasId":"9639249","tamrId":"b9dcd16b-5eb0-38a3-9225-57fd56244195","version":342,"action":"UPDATE"},{"gtasId":"9350657","tamrId":"2a07a1ad-65ec-3632-b2b9-ca8292aefda2","version":342,"action":"UPDATE"},{"gtasId":"8610609","tamrId":"ae96284e-6cbd-389f-b283-1c72e78a3b46","version":342,"action":"UPDATE"},{"gtasId":"4665199","tamrId":"931637d4-cb26-3aed-8e1e-3b114d71a5db","version":342,"action":"UPDATE"},{"gtasId":"4331129","tamrId":"a95ea2ff-f7db-35bd-a99e-8cb27cde546d","version":342,"action":"UPDATE"},{"gtasId":"21560211","tamrId":"51b727b7-16ff-38d8-9f48-bc463f42be35","version":342,"action":"UPDATE"},{"gtasId":"1854167","tamrId":"8cce8d78-c833-3ac1-9361-46845b91109f","version":342,"action":"UPDATE"},{"gtasId":"6423895","tamrId":"9cbf68d3-7ae8-3cb8-8e50-07302f39eaf2","version":342,"action":"UPDATE"},{"gtasId":"15827588","tamrId":"7764190b-09e6-3cc2-b70d-fe5217746a53","version":342,"action":"UPDATE"},{"gtasId":"12457206","tamrId":"583c6c8b-4851-35a9-9144-754458818d9c","version":342,"action":"UPDATE"},{"gtasId":"20310965","tamrId":"ae48fbc9-2862-36e3-b4b0-4276e575e9e0","version":342,"action":"UPDATE"},{"gtasId":"3643195","tamrId":"36c2af8b-e613-325f-b955-d6a8423b7945","version":342,"action":"UPDATE"},{"gtasId":"11609414","tamrId":"d26616fc-9dac-37c4-870c-2b271347fb7e","version":342,"action":"UPDATE"},{"gtasId":"16475290","tamrId":"3b2b281d-b23c-3df5-99b8-c5ec7073dbfe","version":342,"action":"UPDATE"},{"gtasId":"12190419","tamrId":"4b118ecc-7d43-3272-875f-ad8658d38a97","version":342,"action":"UPDATE"},{"gtasId":"5627934","tamrId":"9ce88ab5-27ab-3ce2-a9bc-692146a51bd6","version":342,"action":"UPDATE"},{"gtasId":"2980118","tamrId":"ca966a22-33aa-3ee1-a260-4dc45d981ab8","version":342,"action":"UPDATE"},{"gtasId":"13653541","tamrId":"a20c056d-3bee-37ff-9028-43817854e659","version":342,"action":"UPDATE"},{"gtasId":"7434765","tamrId":"536a461e-878f-31ac-b206-5694ebe211a0","version":342,"action":"UPDATE"},{"gtasId":"23952134","tamrId":"b29dccd0-6d06-37b1-adee-c53591b19a05","version":342,"action":"UPDATE"},{"gtasId":"24162637","tamrId":"f3289297-644e-3d23-8be5-e5de9d3355d6","version":342,"action":"UPDATE"},{"gtasId":"15949963","tamrId":"2d90f6ea-3639-3483-bc1f-3a5aa7179c15","version":342,"action":"UPDATE"},{"gtasId":"5270301","tamrId":"9c9bf230-0dcc-3b41-bcf1-f84eaf8341ec","version":342,"action":"UPDATE"},{"gtasId":"402994","tamrId":"819e5317-5f95-3703-b5cf-9c7f182d0799","version":342,"action":"UPDATE"},{"gtasId":"3704549","tamrId":"dd578583-f192-356d-a800-fc6011b0ae70","version":342,"action":"UPDATE"},{"gtasId":"2377501","tamrId":"03da33ba-be91-3508-9dc3-7f779000a2c7","version":342,"action":"UPDATE"},{"gtasId":"7384286","tamrId":"577d0f0c-804c-3878-8894-38b25122e02f","version":342,"action":"UPDATE"},{"gtasId":"1934023","tamrId":"85e4af36-0073-38f9-8b37-d6216ca1ea43","version":342,"action":"UPDATE"},{"gtasId":"13601511","tamrId":"f407420e-a8df-3ac1-ab7e-e0b73e1b315f","version":342,"action":"UPDATE"},{"gtasId":"15646605","tamrId":"bc123820-2f6f-3cc3-9a25-98027e31d6be","version":342,"action":"UPDATE"},{"gtasId":"14340230","tamrId":"4382a2d2-8776-399a-b597-5ce16c459d4c","version":342,"action":"UPDATE"},{"gtasId":"5100956","tamrId":"922fd23e-bcaa-3b75-ab19-421f3ecb031f","version":342,"action":"UPDATE"},{"gtasId":"4471309","tamrId":"b2005a52-51d3-3d0b-8774-a11958809d11","version":342,"action":"UPDATE"},{"gtasId":"4581039","tamrId":"6054f044-d997-32e9-b727-45dcc434c41e","version":342,"action":"UPDATE"},{"gtasId":"6447839","tamrId":"dcd49787-984f-3765-8890-1043fda46baa","version":342,"action":"UPDATE"},{"gtasId":"5800520","tamrId":"49fa04fc-f8da-3724-8bf8-17e184095686","version":342,"action":"UPDATE"},{"gtasId":"11467265","tamrId":"f6ac72ab-691d-3ff4-a719-020a9263d81b","version":342,"action":"UPDATE"},{"gtasId":"20073822","tamrId":"5de40fca-219c-3c3f-9420-7c87415eb6bb","version":342,"action":"UPDATE"},{"gtasId":"3219713","tamrId":"db197459-85dc-36ec-af1c-bbf09550a658","version":342,"action":"UPDATE"},{"gtasId":"18327438","tamrId":"b554f858-2194-3d31-961c-ddafa0f58b51","version":342,"action":"UPDATE"},{"gtasId":"21026411","tamrId":"bc82df98-16cb-34e6-bcb7-ca463c699bbb","version":342,"action":"UPDATE"},{"gtasId":"5322803","tamrId":"e272c5a9-b3e4-321e-9a06-c1fae33aff28","version":342,"action":"UPDATE"},{"gtasId":"14687316","tamrId":"dc426848-731c-3cfb-ae34-2d3920d3d521","version":342,"action":"UPDATE"},{"gtasId":"23264157","tamrId":"4b2f9107-bc58-37e0-8bf7-a561ae14f21d","version":342,"action":"UPDATE"},{"gtasId":"18516838","tamrId":"2e518366-65e0-3c21-baa8-1a8a40768256","version":342,"action":"UPDATE"},{"gtasId":"9156732","tamrId":"25aeace1-7c10-35b4-9540-fbccd312f188","version":342,"action":"UPDATE"},{"gtasId":"9759649","tamrId":"a2bf4e64-0f41-3878-8280-b2372a8f1514","version":342,"action":"UPDATE"},{"gtasId":"14561673","tamrId":"a97aee12-eceb-35fb-aa24-bc13ba747166","version":342,"action":"UPDATE"},{"gtasId":"5546062","tamrId":"864abd84-1351-3c44-a787-fb7a17e1ea4a","version":342,"action":"UPDATE"},{"gtasId":"25126575","tamrId":"8f0b08db-dba8-3bbf-95e8-40c2b5347f38","version":342,"action":"UPDATE"},{"gtasId":"11187008","tamrId":"29edbdcf-ffb0-327a-9ac0-e694756dc498","version":342,"action":"UPDATE"},{"gtasId":"16701222","tamrId":"9ea03d05-3a21-3d43-a334-3a66bc1dba44","version":342,"action":"UPDATE"},{"gtasId":"3061130","tamrId":"e7c90594-fc90-315a-a933-216387f5c0e7","version":342,"action":"UPDATE"},{"gtasId":"3686298","tamrId":"1e8f05ab-620d-3acc-9d7e-b8f8081bf17c","version":342,"action":"UPDATE"},{"gtasId":"9505796","tamrId":"b1717c44-05d4-3b0c-af93-db30aa8d2687","version":342,"action":"UPDATE"},{"gtasId":"3669735","tamrId":"94c1a8aa-1d45-3623-a8ee-65d7be93bfa2","version":342,"action":"UPDATE"},{"gtasId":"15592147","tamrId":"035f20b7-078f-3968-83d0-35446ada848e","version":342,"action":"UPDATE"},{"gtasId":"8281210","tamrId":"7568fd88-95c4-3779-9b8b-c3d423aa731f","version":342,"action":"UPDATE"},{"gtasId":"6291471","tamrId":"3ff9190f-7db8-3f07-a2d2-55da60743fd0","version":342,"action":"UPDATE"},{"gtasId":"7282311","tamrId":"ddf5199d-8f6b-3c58-ad3c-3a052e748c5c","version":342,"action":"UPDATE"},{"gtasId":"6062860","tamrId":"c6b079d2-2b29-329a-ada8-77308bd03a16","version":342,"action":"UPDATE"},{"gtasId":"9296913","tamrId":"f295edc2-77b0-3413-9803-61d2a2a991c8","version":342,"action":"UPDATE"},{"gtasId":"2145403","tamrId":"bb285208-03b4-3658-82ff-4fc3bf981e39","version":342,"action":"UPDATE"},{"gtasId":"7946660","tamrId":"bea66bf4-98d3-339d-92ba-df770884d08f","version":342,"action":"UPDATE"},{"gtasId":"11830567","tamrId":"a6dabf9a-d10e-3dee-b72f-cce04d64aa7d","version":342,"action":"UPDATE"},{"gtasId":"19129308","tamrId":"2e82dd32-7506-3741-b4ce-7c24621b63e5","version":342,"action":"UPDATE"},{"gtasId":"16898516","tamrId":"e3e2b653-c4a2-3eb9-8984-2a3ddf09d159","version":342,"action":"UPDATE"},{"gtasId":"5984948","tamrId":"150dd7bb-58ae-3168-95a1-28da6a19919b","version":342,"action":"UPDATE"},{"gtasId":"15696025","tamrId":"13ca877a-e9f6-3da9-903b-c698b2a9a7ef","version":342,"action":"UPDATE"},{"gtasId":"95319","tamrId":"ccf6bcbe-11c4-3646-b843-e17fb3ddca2f","version":342,"action":"UPDATE"},{"gtasId":"2153031","tamrId":"e21d17a7-db80-32bb-b428-68ca8064b9f2","version":342,"action":"UPDATE"},{"gtasId":"11223132","tamrId":"56cdbc6b-ce46-394f-ae70-5d2c61a5ede5","version":342,"action":"UPDATE"},{"gtasId":"20118322","tamrId":"cb3dcaaa-1652-33c2-ac21-d5a2dee45a68","version":342,"action":"UPDATE"},{"gtasId":"23702647","tamrId":"0d104910-17c8-381f-95a4-0f78629401b1","version":342,"action":"UPDATE"},{"gtasId":"20999269","tamrId":"106596b9-2ce5-36fc-98f8-735c28005515","version":342,"action":"UPDATE"},{"gtasId":"17546499","tamrId":"be09670a-eeb6-320a-a8e2-b0793eefc72b","version":342,"action":"UPDATE"},{"gtasId":"5543812","tamrId":"69ab0791-7169-3e6e-ac73-f78af5347405","version":342,"action":"UPDATE"},{"gtasId":"7664269","tamrId":"cea48f72-0dc6-32a0-9f2b-b0b667fcde34","version":342,"action":"UPDATE"},{"gtasId":"10992310","tamrId":"92940040-38f1-3617-a19b-bff7871a9d27","version":342,"action":"UPDATE"},{"gtasId":"3611566","tamrId":"9c17bb14-fca1-394f-bed4-da65adfdaea4","version":342,"action":"UPDATE"},{"gtasId":"7131214","tamrId":"4bfa3a73-6b39-3df5-ab74-a1859da84142","version":342,"action":"UPDATE"},{"gtasId":"5166790","tamrId":"602e7fe9-4fe1-3cde-8845-ccc4f3346a84","version":342,"action":"UPDATE"},{"gtasId":"21410681","tamrId":"05e15941-3154-334a-88b7-c5750e7e362a","version":342,"action":"UPDATE"},{"gtasId":"6399501","tamrId":"b6febf7f-d8cd-3ff4-a2b4-f913c05fe85a","version":342,"action":"UPDATE"},{"gtasId":"13665564","tamrId":"5f84f181-fa79-3b18-829e-944456b3a881","version":342,"action":"UPDATE"},{"gtasId":"2373186","tamrId":"b57849a1-e861-3746-8c3e-decdb90c1f2f","version":342,"action":"UPDATE"},{"gtasId":"13888736","tamrId":"908e0715-a005-3865-b78d-2f51cee51950","version":342,"action":"UPDATE"},{"gtasId":"10843423","tamrId":"df412dcd-3c99-3e63-94b6-4a455357fa2e","version":342,"action":"UPDATE"},{"gtasId":"20061861","tamrId":"1d01aae0-55be-3e21-88f4-1ccb53f8c7d6","version":342,"action":"UPDATE"},{"gtasId":"6120337","tamrId":"91221495-0681-3fb6-bf11-703d4eb77620","version":342,"action":"UPDATE"},{"gtasId":"8040602","tamrId":"4c75d049-06a0-3f9c-8320-26301695525d","version":342,"action":"UPDATE"},{"gtasId":"5889868","tamrId":"6f3c7ce4-9cab-3a55-b163-357f8eb9a13d","version":342,"action":"UPDATE"},{"gtasId":"2701137","tamrId":"12983447-abd7-33f0-b1c7-329772e927f1","version":342,"action":"UPDATE"},{"gtasId":"14654436","tamrId":"fcd83fd7-8883-3db3-bb0f-3fcc9b0c4b2f","version":342,"action":"UPDATE"},{"gtasId":"13604766","tamrId":"7db55165-a2e8-34d4-b916-209d7a87a1e3","version":342,"action":"UPDATE"},{"gtasId":"20561036","tamrId":"d94ad762-103b-3d81-b93c-305a848db634","version":342,"action":"UPDATE"},{"gtasId":"12474763","tamrId":"bce29787-1df1-3cf2-ab52-8eccb490eb93","version":342,"action":"UPDATE"},{"gtasId":"9700362","tamrId":"2568f363-a359-393a-adb4-dad445503048","version":342,"action":"UPDATE"},{"gtasId":"3020573","tamrId":"841f14ad-9942-305a-ad21-3d27ee7e3532","version":342,"action":"UPDATE"},{"gtasId":"42129","tamrId":"7b107eaa-08c6-361f-ad20-d087c39b3964","version":342,"action":"UPDATE"},{"gtasId":"6651399","tamrId":"9c14a038-ae96-3c87-a8a5-3995c6be361e","version":342,"action":"UPDATE"},{"gtasId":"16179048","tamrId":"043e967a-5f71-303a-a872-cdb5e30c6248","version":342,"action":"UPDATE"},{"gtasId":"9567851","tamrId":"99db0fd8-1a48-3382-8652-213f00016efe","version":342,"action":"UPDATE"},{"gtasId":"12268623","tamrId":"ea9ad2d6-eba3-35e2-b8f6-188a50a720b1","version":342,"action":"UPDATE"},{"gtasId":"4483477","tamrId":"c4d2bd5e-8d91-361b-bba4-aaffc78198ff","version":342,"action":"UPDATE"},{"gtasId":"2104285","tamrId":"abb79954-3d09-3c51-8872-7b43bcd35054","version":342,"action":"UPDATE"},{"gtasId":"14699354","tamrId":"091deeeb-0b3b-3d0c-9851-127bde95ebb5","version":342,"action":"UPDATE"},{"gtasId":"16859634","tamrId":"82d86008-8302-34b8-82de-4d45230a6dd5","version":342,"action":"UPDATE"},{"gtasId":"6457011","tamrId":"2c192ee7-08a2-30a2-9e57-bc13da05421f","version":342,"action":"UPDATE"},{"gtasId":"8288842","tamrId":"1442f9e0-0507-3f84-a068-c7e522cb3016","version":342,"action":"UPDATE"},{"gtasId":"24573873","tamrId":"6624f095-e698-388b-93c9-c2f033715b9e","version":342,"action":"UPDATE"},{"gtasId":"197819","tamrId":"1143508b-1305-3a20-a791-a54531777d92","version":342,"action":"UPDATE"},{"gtasId":"19447473","tamrId":"7af5ec17-eca3-3bd6-8463-66a0860b4bde","version":342,"action":"UPDATE"},{"gtasId":"18707426","tamrId":"3a7fe590-74ad-39f6-bc76-9f10bf90fb43","version":342,"action":"UPDATE"},{"gtasId":"8229639","tamrId":"e9bf4274-14cb-3317-b2ec-9c74e3d92403","version":342,"action":"UPDATE"},{"gtasId":"1886708","tamrId":"3822dee6-5101-3321-9b83-705d3c01f9d0","version":342,"action":"UPDATE"},{"gtasId":"10501916","tamrId":"b0ab806a-53b7-3593-b304-4f69eb960e32","version":342,"action":"UPDATE"},{"gtasId":"19847372","tamrId":"47600790-b4b3-387b-a0d7-5e0246fd7a47","version":342,"action":"UPDATE"},{"gtasId":"15086560","tamrId":"8fe4497b-786b-36ea-9225-8575e4f37c47","version":342,"action":"UPDATE"},{"gtasId":"14308235","tamrId":"df3108bb-f447-385e-be7a-39764c697925","version":342,"action":"UPDATE"},{"gtasId":"13204876","tamrId":"247eb844-9667-3330-b463-0adad3007d4e","version":342,"action":"UPDATE"},{"gtasId":"4976233","tamrId":"74151a65-9fe2-3d49-b557-0339aafc8c44","version":342,"action":"UPDATE"},{"gtasId":"17570804","tamrId":"57244845-1d8f-351e-95a4-b8957f393986","version":342,"action":"UPDATE"},{"gtasId":"3568493","tamrId":"b2005a52-51d3-3d0b-8774-a11958809d11","version":342,"action":"UPDATE"},{"gtasId":"5319921","tamrId":"89444467-ac39-36f8-ab8d-1f7f63bc1b88","version":342,"action":"UPDATE"},{"gtasId":"17954669","tamrId":"75bba499-60b5-38d7-b52a-da35a4c79275","version":342,"action":"UPDATE"},{"gtasId":"8144156","tamrId":"78737b19-cbcc-3785-b9d2-98a5a7d563b4","version":342,"action":"UPDATE"},{"gtasId":"7359257","tamrId":"7685f88f-7130-38b4-acd7-a6ca4eccb55f","version":342,"action":"UPDATE"},{"gtasId":"8228312","tamrId":"4f4f7155-c78e-3250-85eb-9d717b647dcf","version":342,"action":"UPDATE"},{"gtasId":"9304842","tamrId":"e25150be-b0b8-3f6b-a59f-b9bc20c25667","version":342,"action":"UPDATE"},{"gtasId":"4772407","tamrId":"281c9ff6-2eb3-3e64-bc91-c06855861128","version":342,"action":"UPDATE"},{"gtasId":"7173090","tamrId":"2a93ff4a-d1f1-34bf-8db1-85955fc72916","version":342,"action":"UPDATE"},{"gtasId":"15213841","tamrId":"83c641a3-15a4-3050-b599-6ecfee10e5be","version":342,"action":"UPDATE"},{"gtasId":"11522496","tamrId":"71b2df18-0bde-37e3-8b62-76cba4e13ce2","version":342,"action":"UPDATE"},{"gtasId":"10820765","tamrId":"74af0a8f-7c7b-3b7a-9e03-3ad59fc0bc57","version":342,"action":"UPDATE"},{"gtasId":"21110877","tamrId":"5a82a8c6-8f88-3849-baf0-1b47b34e1891","version":342,"action":"UPDATE"},{"gtasId":"9712320","tamrId":"896017f6-5dd3-3b61-8138-8c7944c3828f","version":342,"action":"UPDATE"},{"gtasId":"762285","tamrId":"a184cd65-3076-3a93-8df3-4f03fe89cf5c","version":342,"action":"UPDATE"},{"gtasId":"11766338","tamrId":"d8ff7d56-0974-32fd-8531-6f883b2a52e4","version":342,"action":"UPDATE"},{"gtasId":"16229851","tamrId":"ad40fcc5-48d7-39fc-9c2d-0a15f4698066","version":342,"action":"UPDATE"},{"gtasId":"5936632","tamrId":"a6d59937-bce3-3761-9355-b05a185ddc4d","version":342,"action":"UPDATE"},{"gtasId":"6129502","tamrId":"61a5e4ea-4960-3a9d-8e8c-332f763395cb","version":342,"action":"UPDATE"},{"gtasId":"2969847","tamrId":"9332e2f4-4d0d-3d36-a39f-b7846dea5ff0","version":342,"action":"UPDATE"},{"gtasId":"11387320","tamrId":"f8d8b1a6-64dd-3a5d-b09a-2b9fe4932342","version":342,"action":"UPDATE"},{"gtasId":"4768336","tamrId":"e196ac8d-2bf6-3845-acd3-df272c44a4f8","version":342,"action":"UPDATE"},{"gtasId":"5524711","tamrId":"cc19ea83-9c9e-38e7-b882-48c2dd8d8dce","version":342,"action":"UPDATE"},{"gtasId":"2474415","tamrId":"652e9f29-b86e-338d-b14d-724e83a1f098","version":342,"action":"UPDATE"},{"gtasId":"14851896","tamrId":"4ec383a7-2236-3202-bfdb-ed87e86a9b54","version":342,"action":"UPDATE"},{"gtasId":"1816861","tamrId":"55c37187-52cf-31be-9ccb-672e6297f193","version":342,"action":"UPDATE"},{"gtasId":"15450238","tamrId":"6cc46992-56f6-32c0-87e1-844860c8cf80","version":342,"action":"UPDATE"},{"gtasId":"13421841","tamrId":"7bef4507-2da1-337e-9eec-c5858ab10f15","version":342,"action":"UPDATE"},{"gtasId":"10166732","tamrId":"93556aee-fe8a-3fd3-b16d-c6ba58a26787","version":342,"action":"UPDATE"},{"gtasId":"5024803","tamrId":"189751f6-e1d0-3500-8434-671e490a2b65","version":342,"action":"UPDATE"},{"gtasId":"1196736","tamrId":"fa3219a0-e5c3-3aab-a2e7-28734fe86c1d","version":342,"action":"UPDATE"},{"gtasId":"11753048","tamrId":"b082f319-363f-3160-a257-596ab27d866d","version":342,"action":"UPDATE"},{"gtasId":"6586692","tamrId":"467998aa-3b88-319a-9c2b-14999a6c234a","version":342,"action":"UPDATE"},{"gtasId":"9312495","tamrId":"1b53b7d3-1f47-337b-b256-2a8fafc16f78","version":342,"action":"UPDATE"},{"gtasId":"21874252","tamrId":"26d69692-15bb-3aa6-9562-dd9581b2b6c1","version":342,"action":"UPDATE"},{"gtasId":"2128287","tamrId":"a413b0a8-801a-39ce-b4f9-b9810fb8c50a","version":342,"action":"UPDATE"},{"gtasId":"17992776","tamrId":"8d284af4-9dcb-3967-9165-55168f0031ac","version":342,"action":"UPDATE"},{"gtasId":"17116791","tamrId":"23a4f678-487d-3afe-98a7-e5de39340ecd","version":342,"action":"UPDATE"},{"gtasId":"24648247","tamrId":"ff8228d4-f3ea-3a67-8b86-d180961c51ed","version":342,"action":"UPDATE"},{"gtasId":"19803740","tamrId":"c8343194-7675-3c31-9ca5-b1a7dd89b084","version":342,"action":"UPDATE"},{"gtasId":"13926427","tamrId":"7c7fce85-15aa-3988-9d05-2ccf2496227f","version":342,"action":"UPDATE"},{"gtasId":"10200112","tamrId":"faa3a5a1-f56c-3fdb-91dd-473b3acbad34","version":342,"action":"UPDATE"},{"gtasId":"9290771","tamrId":"950081d9-9af0-34e5-9655-1dd29666261d","version":342,"action":"UPDATE"},{"gtasId":"10485388","tamrId":"07d72256-d2b1-3614-afcb-fc1992754c9e","version":342,"action":"UPDATE"},{"gtasId":"2268362","tamrId":"171d72c9-1971-3491-953b-358b4589bd71","version":342,"action":"UPDATE"},{"gtasId":"16871331","tamrId":"f8646b03-3f10-3e3d-b44c-197c13aa7a87","version":342,"action":"UPDATE"},{"gtasId":"19070138","tamrId":"a190c05c-628e-3a12-a3ff-23cfa6d8418d","version":342,"action":"UPDATE"},{"gtasId":"21092709","tamrId":"2fd23ebc-2c1c-3788-b565-ee635f6ce8e2","version":342,"action":"UPDATE"},{"gtasId":"4303929","tamrId":"3218760c-8430-34b7-bfd1-c65ae4899c05","version":342,"action":"UPDATE"},{"gtasId":"493935","tamrId":"cfc52d3d-9022-38df-b995-faf1a213d2a2","version":342,"action":"UPDATE"},{"gtasId":"3837634","tamrId":"d44d1765-f1d2-3bf1-a3d4-a4c5454b7105","version":342,"action":"UPDATE"},{"gtasId":"14526390","tamrId":"e47a1f37-2eae-3786-9c78-d4699037c0dd","version":342,"action":"UPDATE"},{"gtasId":"8284436","tamrId":"16070628-800b-3a9c-bc11-9febd01425eb","version":342,"action":"UPDATE"},{"gtasId":"12468027","tamrId":"a446b61f-48db-3d06-9aea-a315b6079ea6","version":342,"action":"UPDATE"},{"gtasId":"9751778","tamrId":"1ec88184-587a-3154-a893-d373aba25165","version":342,"action":"UPDATE"},{"gtasId":"21578347","tamrId":"587f374c-327b-31e4-8ce2-fea3d3bfce91","version":342,"action":"UPDATE"},{"gtasId":"5299836","tamrId":"7703d9a2-1fdc-3649-92c4-8c342f725066","version":342,"action":"UPDATE"},{"gtasId":"13793812","tamrId":"ac68ab58-589d-341c-94b7-2bc70b0be849","version":342,"action":"UPDATE"},{"gtasId":"9010388","tamrId":"6cf73fd8-e3f8-3dd8-8bd6-d5271161dfcf","version":342,"action":"UPDATE"},{"gtasId":"1060548","tamrId":"014a115b-744e-34f7-be84-759e93c7bedb","version":342,"action":"UPDATE"},{"gtasId":"21387649","tamrId":"a201611e-4fce-3e47-bba5-3a30bf5e7334","version":342,"action":"UPDATE"},{"gtasId":"23200955","tamrId":"c1fd43c2-9761-3f5d-942d-7e255cfaa702","version":342,"action":"UPDATE"},{"gtasId":"1960170","tamrId":"0c47dc6a-87ca-3d03-a8ac-2e613dc7572f","version":342,"action":"UPDATE"},{"gtasId":"7529698","tamrId":"c9b28994-150a-31b3-a9dd-48a543dfc2fa","version":342,"action":"UPDATE"},{"gtasId":"5237711","tamrId":"977b77a1-12be-37b9-831d-f73398cc3e0c","version":342,"action":"UPDATE"},{"gtasId":"17630159","tamrId":"214af7a8-feae-3ced-aaf5-2cc870bc04ef","version":342,"action":"UPDATE"},{"gtasId":"6854702","tamrId":"4c0c9e4d-5858-3312-b95f-f8324bb7cf4f","version":342,"action":"UPDATE"},{"gtasId":"8044135","tamrId":"7db55165-a2e8-34d4-b916-209d7a87a1e3","version":342,"action":"UPDATE"},{"gtasId":"17966602","tamrId":"edddcf03-a511-3927-83ac-ab5b7d197098","version":342,"action":"UPDATE"},{"gtasId":"991094","tamrId":"67ddcb89-9122-37de-8cc6-dc5b3a0f5020","version":342,"action":"UPDATE"},{"gtasId":"13825926","tamrId":"3a62a55a-fc7e-345c-869a-eaee809eefd3","version":342,"action":"UPDATE"},{"gtasId":"24057834","tamrId":"d3f6a889-8ba0-39d9-8349-de2c4adf8a82","version":342,"action":"UPDATE"},{"gtasId":"22580087","tamrId":"57244845-1d8f-351e-95a4-b8957f393986","version":342,"action":"UPDATE"},{"gtasId":"2370073","tamrId":"26527633-94de-3b80-b254-c569f060de1f","version":342,"action":"UPDATE"},{"gtasId":"4964298","tamrId":"ae23c89e-a697-3555-bf8f-b240acb83864","version":342,"action":"UPDATE"},{"gtasId":"2684980","tamrId":"3f47b809-777c-3039-80c1-513b7fec0938","version":342,"action":"UPDATE"},{"gtasId":"10347036","tamrId":"4021bbc3-7677-3c46-868f-cc6ac4a6db73","version":342,"action":"UPDATE"},{"gtasId":"13154258","tamrId":"f551e99b-5ef7-3f5e-88dc-0d56914e82b2","version":342,"action":"UPDATE"},{"gtasId":"13709660","tamrId":"33482479-19d5-3520-b5a7-500e70dc7c91","version":342,"action":"UPDATE"},{"gtasId":"21669419","tamrId":"29d349a7-a56d-3d66-97fe-61c91b6a093e","version":342,"action":"UPDATE"},{"gtasId":"12722307","tamrId":"e47fb01d-fc1e-31d3-b515-91a6c42d831c","version":342,"action":"UPDATE"},{"gtasId":"2380209","tamrId":"60440d27-2c01-3ce7-9c41-4ea5a0d2f42f","version":342,"action":"UPDATE"},{"gtasId":"7835170","tamrId":"98ebd472-a8db-36a9-ae71-74cbd2e5f571","version":342,"action":"UPDATE"},{"gtasId":"4629326","tamrId":"faa91f71-d876-339f-b7ac-c5dd21ef2764","version":342,"action":"UPDATE"},{"gtasId":"10220545","tamrId":"0f2b93da-50a6-3c03-93b3-e452733b009e","version":342,"action":"UPDATE"},{"gtasId":"7472215","tamrId":"099348b6-879b-3cb2-954f-36618111da69","version":342,"action":"UPDATE"},{"gtasId":"9157067","tamrId":"5ccee1f8-e562-3a78-85fb-c8762e4f5d13","version":342,"action":"UPDATE"},{"gtasId":"10218232","tamrId":"6c84f9da-511d-3327-a96c-d093efb31ffc","version":342,"action":"UPDATE"},{"gtasId":"19727514","tamrId":"3ada178a-719c-3f53-b24a-4f707ccd224d","version":342,"action":"UPDATE"},{"gtasId":"20576129","tamrId":"45033c76-45b4-349f-ba0e-e81be3da9e51","version":342,"action":"UPDATE"},{"gtasId":"23191573","tamrId":"3fc2e47d-56c3-30e2-95d4-74f3803eff0a","version":342,"action":"UPDATE"},{"gtasId":"10830943","tamrId":"296c7232-10b1-3fdc-8d19-d57c912179cd","version":342,"action":"UPDATE"},{"gtasId":"22093497","tamrId":"f435a8fb-707b-39cf-a8b0-4e382138b778","version":342,"action":"UPDATE"},{"gtasId":"6641991","tamrId":"d162e2ae-4ded-35ba-bded-fb2842543694","version":342,"action":"UPDATE"},{"gtasId":"3701613","tamrId":"d368b733-1a91-3d36-b3d2-e408be3aaffd","version":342,"action":"UPDATE"},{"gtasId":"11987553","tamrId":"476acdee-f81a-3cb3-86a0-18d031097e85","version":342,"action":"UPDATE"},{"gtasId":"17337920","tamrId":"7a866290-a08a-30ba-91fa-79f70f169959","version":342,"action":"UPDATE"},{"gtasId":"13898908","tamrId":"13ca877a-e9f6-3da9-903b-c698b2a9a7ef","version":342,"action":"UPDATE"},{"gtasId":"5653535","tamrId":"16935c6d-75b7-3a44-bd75-0dcd519ce51f","version":342,"action":"UPDATE"},{"gtasId":"22808380","tamrId":"ba72f3a6-6c35-33ab-8aca-4f5452fa0826","version":342,"action":"UPDATE"},{"gtasId":"2418368","tamrId":"4a496326-6ff9-38ea-b3f6-6c35cda5c1d2","version":342,"action":"UPDATE"},{"gtasId":"15857419","tamrId":"3cedd3fe-4431-3d5e-8f41-e313df79c14d","version":342,"action":"UPDATE"},{"gtasId":"19027318","tamrId":"5b183297-302e-325a-a7f4-e531cb6f8917","version":342,"action":"UPDATE"},{"gtasId":"12776861","tamrId":"a5e7c968-3d58-3706-a82c-4fc606f22632","version":342,"action":"UPDATE"},{"gtasId":"8683686","tamrId":"ba75b27e-0c69-3673-bc2c-1e0fc1e495bf","version":342,"action":"UPDATE"},{"gtasId":"7044516","tamrId":"ebdcacb8-5678-372d-9aea-69f4c8718a70","version":342,"action":"UPDATE"},{"gtasId":"18096244","tamrId":"05c0a368-face-3dc5-b55d-3cecbcf6ba31","version":342,"action":"UPDATE"},{"gtasId":"7251070","tamrId":"99815733-3ee3-32d4-b7dd-d18c92139b42","version":342,"action":"UPDATE"},{"gtasId":"13569812","tamrId":"89549336-a8d2-321a-bd7e-db21fc93e607","version":342,"action":"UPDATE"},{"gtasId":"17830490","tamrId":"baeced24-eb39-323e-ae57-0b54eb909c82","version":342,"action":"UPDATE"},{"gtasId":"2079613","tamrId":"1bb876dd-f298-3837-bacc-ab59f7257570","version":342,"action":"UPDATE"},{"gtasId":"18510766","tamrId":"13cfa302-3095-3c53-a0ec-d294ed88bd93","version":342,"action":"UPDATE"},{"gtasId":"8077884","tamrId":"5629acf6-8efd-380d-a2a8-4019757c5c1e","version":342,"action":"UPDATE"},{"gtasId":"12463234","tamrId":"a7ffec96-e76c-3ff9-99be-a8e019206b18","version":342,"action":"UPDATE"},{"gtasId":"22825709","tamrId":"8e70bf66-124c-3481-b1ae-6aa0eea4ecf4","version":342,"action":"UPDATE"},{"gtasId":"2101154","tamrId":"c6ccc894-0b67-3ec1-9f1a-3e49182d9768","version":342,"action":"UPDATE"},{"gtasId":"1153661","tamrId":"40282e86-d065-3017-a980-45b63f61a69e","version":342,"action":"UPDATE"},{"gtasId":"9043989","tamrId":"8f01d74e-555f-3658-9f9c-3d3103ad2db2","version":342,"action":"UPDATE"},{"gtasId":"21767987","tamrId":"73462fb5-41c7-3222-a4a6-ed4ce189577e","version":342,"action":"UPDATE"},{"gtasId":"4465668","tamrId":"b71f2afb-421c-3d31-9f11-eee3880365a2","version":342,"action":"UPDATE"},{"gtasId":"6836872","tamrId":"e5ab6bdb-b379-3155-814d-1e53eff94bf5","version":342,"action":"UPDATE"},{"gtasId":"24403771","tamrId":"f17f3643-af62-31c6-af67-bb275f262852","version":342,"action":"UPDATE"},{"gtasId":"2744241","tamrId":"1eb4b4f9-3691-378e-82f3-3663e49b621a","version":342,"action":"UPDATE"},{"gtasId":"709257","tamrId":"d8f50b75-29af-3727-9f0e-8e9af274fa57","version":342,"action":"UPDATE"},{"gtasId":"10556262","tamrId":"c5bed355-f380-34fd-8a7a-b4c157ed7341","version":342,"action":"UPDATE"},{"gtasId":"4867031","tamrId":"8fbf304a-00aa-3f8d-a26d-423790f302f5","version":342,"action":"UPDATE"},{"gtasId":"17307239","tamrId":"7a065585-8c89-3a65-929b-0750692fce55","version":342,"action":"UPDATE"},{"gtasId":"20889056","tamrId":"fc439965-8729-32be-bc12-2145fade1362","version":342,"action":"UPDATE"},{"gtasId":"15032797","tamrId":"45b04dd9-91a5-3a37-beb5-a757bd5dd382","version":342,"action":"UPDATE"},{"gtasId":"12484143","tamrId":"2d3464fc-7749-3df4-8926-faec80f67b96","version":342,"action":"UPDATE"},{"gtasId":"16885084","tamrId":"3f172be0-0429-364f-a26f-0fbf4a4fbb34","version":342,"action":"UPDATE"},{"gtasId":"113361","tamrId":"eb73c17b-29f4-3d02-b594-35f0f378d604","version":342,"action":"UPDATE"},{"gtasId":"21633494","tamrId":"3012dec1-a4cb-3224-833d-6f5773a8bedd","version":342,"action":"UPDATE"},{"gtasId":"7816889","tamrId":"05f1da76-19f3-3c43-a34d-3ab4e74c2acc","version":342,"action":"UPDATE"},{"gtasId":"12171102","tamrId":"c959f403-cecf-3e96-ac67-8f45abe9e27c","version":342,"action":"UPDATE"},{"gtasId":"4530176","tamrId":"e21f2b68-0125-331c-af9d-9f296e99d852","version":342,"action":"UPDATE"},{"gtasId":"10378108","tamrId":"44c374d2-8360-3c78-b2d6-67ef0a030393","version":342,"action":"UPDATE"},{"gtasId":"9518073","tamrId":"79f10a82-1287-3615-8f94-81ceb10266cc","version":342,"action":"UPDATE"},{"gtasId":"7509278","tamrId":"4a8ac972-a0a4-31bc-9009-c8b7475a2b8e","version":342,"action":"UPDATE"},{"gtasId":"14892339","tamrId":"cce9e6be-bd78-3794-b540-f265369c5f36","version":342,"action":"UPDATE"},{"gtasId":"8064561","tamrId":"da3c70c0-7aa1-3a03-97e3-f9b79bb3254b","version":342,"action":"UPDATE"},{"gtasId":"4589678","tamrId":"59abae1b-e3fd-3fe5-bebf-75a2ec09a173","version":342,"action":"UPDATE"},{"gtasId":"444985","tamrId":"b146c160-beda-3976-95cf-ee4a57ac73a3","version":342,"action":"UPDATE"},{"gtasId":"3026732","tamrId":"f3f5028a-3bc6-3d99-a579-4fbf94d22003","version":342,"action":"UPDATE"},{"gtasId":"22508763","tamrId":"a65b65a0-f1f3-305d-9f4e-974f4a3ef97b","version":342,"action":"UPDATE"},{"gtasId":"7088122","tamrId":"043e4cbb-318b-3b0b-a7df-86bd16987363","version":342,"action":"UPDATE"},{"gtasId":"5997416","tamrId":"573640e2-f39a-3e21-bdb4-b02d171d41d3","version":342,"action":"UPDATE"},{"gtasId":"15943852","tamrId":"10c8cf54-8213-371b-a888-b1333212787c","version":342,"action":"UPDATE"},{"gtasId":"15472482","tamrId":"5d8e0284-493e-38eb-9160-c518cbc67af8","version":342,"action":"UPDATE"},{"gtasId":"17785368","tamrId":"00b27e34-5176-3285-baa3-6803506e8373","version":342,"action":"UPDATE"},{"gtasId":"12299791","tamrId":"28d9a3b4-78bb-3cdd-a838-500ad554a210","version":342,"action":"UPDATE"},{"gtasId":"22800443","tamrId":"f4bab301-5894-3fb4-b355-ae60fb6ee30f","version":342,"action":"UPDATE"},{"gtasId":"4380154","tamrId":"0bbf8cc6-e1d0-3dee-a086-0970a1386405","version":342,"action":"UPDATE"},{"gtasId":"6722882","tamrId":"7b05646e-32de-3447-a175-12015b92676e","version":342,"action":"UPDATE"},{"gtasId":"7127308","tamrId":"ed8f47f3-8d44-333c-8fc5-d496cb0fdc79","version":342,"action":"UPDATE"},{"gtasId":"7804874","tamrId":"d695e182-35b4-397b-94b1-4af756163e13","version":342,"action":"UPDATE"},{"gtasId":"12096284","tamrId":"fbab2b92-51c1-32c7-b2e3-dd75372f9f2c","version":342,"action":"UPDATE"},{"gtasId":"14475957","tamrId":"db52931f-b9df-328d-bde5-5e3e095814c6","version":342,"action":"UPDATE"},{"gtasId":"4212862","tamrId":"9c0d22ab-2a62-37b2-80ba-4d1929e0fd5c","version":342,"action":"UPDATE"},{"gtasId":"23472872","tamrId":"1dd5d223-4f7c-3695-84ad-8ef3134733db","version":342,"action":"UPDATE"},{"gtasId":"13325994","tamrId":"8ef9a3ae-a908-368a-af6b-bb29f6d752a4","version":342,"action":"UPDATE"},{"gtasId":"19473711","tamrId":"03f288d8-52df-3849-863e-a94f40976bc5","version":342,"action":"UPDATE"},{"gtasId":"8170412","tamrId":"37573977-8a74-39cc-9d3b-594c41476376","version":342,"action":"UPDATE"},{"gtasId":"6880133","tamrId":"136dd4c6-7ed8-3493-8359-74e7eb53e473","version":342,"action":"UPDATE"},{"gtasId":"5422917","tamrId":"0409b2d6-91a3-3693-afd0-97d1b6610b72","version":342,"action":"UPDATE"},{"gtasId":"10369216","tamrId":"c56a3a9b-6816-394f-9fae-b8173b36529b","version":342,"action":"UPDATE"},{"gtasId":"15112327","tamrId":"35bdf9a6-219f-306f-8f98-d2026729bcd7","version":342,"action":"UPDATE"},{"gtasId":"1106443","tamrId":"86557799-ba3f-3674-acf3-d7f0ea53204b","version":342,"action":"UPDATE"},{"gtasId":"16203271","tamrId":"18d40496-53ee-3d93-a5de-0f5f7ab3da41","version":342,"action":"UPDATE"},{"gtasId":"13032682","tamrId":"ce205f90-b829-38f8-83b6-a3a43d9036ee","version":342,"action":"UPDATE"},{"gtasId":"11849851","tamrId":"b0c7f540-ad90-368e-94c0-8a5e5416bb3d","version":342,"action":"UPDATE"},{"gtasId":"15356337","tamrId":"c98fb4c9-4980-3e68-a8b1-3257da96c23c","version":342,"action":"UPDATE"},{"gtasId":"2410413","tamrId":"c5316cdc-c33e-30e7-bd31-ddefa04d356b","version":342,"action":"UPDATE"},{"gtasId":"1963298","tamrId":"472facf7-f553-30fc-911b-f5c49c1da884","version":342,"action":"UPDATE"},{"gtasId":"1984179","tamrId":"6be48fc5-853d-306b-bbcd-6735cec62635","version":342,"action":"UPDATE"},{"gtasId":"20261345","tamrId":"6746ed8e-7d17-3d16-b656-62b2178b5851","version":342,"action":"UPDATE"},{"gtasId":"25249214","tamrId":"d587f66f-e831-30bc-8c7a-f7a05922774b","version":342,"action":"UPDATE"},{"gtasId":"273084","tamrId":"35dfb98c-600f-347e-8625-8656e274ebba","version":342,"action":"UPDATE"},{"gtasId":"10399052","tamrId":"5e47f027-912d-3c4a-8b80-5403f338baa8","version":342,"action":"UPDATE"},{"gtasId":"2079654","tamrId":"6d790f83-ac78-314f-af7e-b85a97486821","version":342,"action":"UPDATE"},{"gtasId":"10525950","tamrId":"90774caa-918d-37f8-aba5-bf80db7994f5","version":342,"action":"UPDATE"},{"gtasId":"9217245","tamrId":"9054fbba-33f1-327b-afc1-3de0e8981be8","version":342,"action":"UPDATE"},{"gtasId":"24770153","tamrId":"9768465f-bfa1-3f9c-8780-9239116a72b0","version":342,"action":"UPDATE"},{"gtasId":"24181712","tamrId":"0f8310b1-abab-35a5-b08b-c344f3e5a74b","version":342,"action":"UPDATE"},{"gtasId":"11588260","tamrId":"6d4a9454-9b14-3d9f-a1a1-65e4f2af33f5","version":342,"action":"UPDATE"},{"gtasId":"13696864","tamrId":"5b183297-302e-325a-a7f4-e531cb6f8917","version":342,"action":"UPDATE"},{"gtasId":"10882890","tamrId":"c1473be2-734f-3d70-ba56-73306f562901","version":342,"action":"UPDATE"},{"gtasId":"15091948","tamrId":"0dd113e9-ff98-3403-ba6c-21f822b46c25","version":342,"action":"UPDATE"},{"gtasId":"426294","tamrId":"5f9280c3-4515-3c68-83a6-d00e79d2888d","version":342,"action":"UPDATE"},{"gtasId":"11497898","tamrId":"b18ce5be-cc41-38c7-9834-316b914673b4","version":342,"action":"UPDATE"},{"gtasId":"12533444","tamrId":"5ccee1f8-e562-3a78-85fb-c8762e4f5d13","version":342,"action":"UPDATE"},{"gtasId":"6469092","tamrId":"ecf5efc4-4f0b-33c9-886e-b42c947b3854","version":342,"action":"UPDATE"},{"gtasId":"6390485","tamrId":"f7119a35-84e6-3144-8d13-3e35f55bb174","version":342,"action":"UPDATE"},{"gtasId":"739072","tamrId":"93a656f9-00e7-3e3f-978b-d710d0a39134","version":342,"action":"UPDATE"},{"gtasId":"10192008","tamrId":"26000e6b-65a7-30b2-93fc-a7d8a3fb7c7f","version":342,"action":"UPDATE"},{"gtasId":"20052222","tamrId":"9a8056dc-ed29-3a50-b1b7-295ef21f2c39","version":342,"action":"UPDATE"},{"gtasId":"7278966","tamrId":"a2f18695-d768-3831-b08c-d6b6e94a4ba6","version":342,"action":"UPDATE"},{"gtasId":"7357436","tamrId":"e3273b01-6d06-33ca-9857-2bebac70f8eb","version":342,"action":"UPDATE"},{"gtasId":"16920810","tamrId":"318cc11d-b8fc-3a0a-85a2-35a1a39cac6e","version":342,"action":"UPDATE"},{"gtasId":"14681229","tamrId":"24d0aef6-248f-3b21-87d6-46f64dcb0685","version":342,"action":"UPDATE"},{"gtasId":"10164929","tamrId":"cf1f755d-b968-3157-b5c8-71216d47db4d","version":342,"action":"UPDATE"},{"gtasId":"5443853","tamrId":"cc6ef29c-142b-3932-8d61-f1c3d1fab9a0","version":342,"action":"UPDATE"},{"gtasId":"777336","tamrId":"5e61aa3a-8679-3183-a26c-d85cf95f36e5","version":342,"action":"UPDATE"},{"gtasId":"7671227","tamrId":"2bc4e45d-9fb2-3c04-ad36-8ce331c8cf0f","version":342,"action":"UPDATE"},{"gtasId":"18249334","tamrId":"94bb40f7-949a-3f0f-8121-79c558062087","version":342,"action":"UPDATE"},{"gtasId":"5709449","tamrId":"772dd509-cbac-3012-a530-b09240a3e01b","version":342,"action":"UPDATE"},{"gtasId":"577026","tamrId":"cb62d45e-e7b0-34a3-be66-61c3459d16ca","version":342,"action":"UPDATE"},{"gtasId":"17133362","tamrId":"edf779bd-cf27-36e5-93bd-10064fed989e","version":342,"action":"UPDATE"},{"gtasId":"16028261","tamrId":"4c3c2645-5df6-337b-a4b8-b2d9db103016","version":342,"action":"UPDATE"},{"gtasId":"11137679","tamrId":"9f50d8d7-86fd-39af-9cad-ceeb2e0b4b49","version":342,"action":"UPDATE"},{"gtasId":"4426064","tamrId":"78f406ef-38cb-3d49-9174-62782de763aa","version":342,"action":"UPDATE"},{"gtasId":"20604524","tamrId":"62439512-fa44-37fa-859f-c9f7890607a8","version":342,"action":"UPDATE"},{"gtasId":"1118402","tamrId":"aaa88265-1499-3d38-a301-e5c1cb1a7ce7","version":342,"action":"UPDATE"},{"gtasId":"1277694","tamrId":"a7898076-602d-3c50-ac74-3dcaa4635706","version":342,"action":"UPDATE"},{"gtasId":"4042394","tamrId":"0540f13e-ae1c-30de-9e9c-8a03116d293c","version":342,"action":"UPDATE"},{"gtasId":"18238699","tamrId":"35d21275-c28e-35f6-84c0-5bce41019158","version":342,"action":"UPDATE"},{"gtasId":"1621956","tamrId":"9256ec9a-5f88-3280-ba6d-4556f37b9385","version":342,"action":"UPDATE"},{"gtasId":"14287632","tamrId":"b7bdb934-f676-3b69-bc7e-8c35ec8414bd","version":342,"action":"UPDATE"},{"gtasId":"8520008","tamrId":"2a81eadc-2306-39f5-ba76-e5566093638c","version":342,"action":"UPDATE"},{"gtasId":"3654706","tamrId":"aa4d8286-66c6-30ec-8315-cd1e31b6d596","version":342,"action":"UPDATE"},{"gtasId":"2814614","tamrId":"5c85e514-dd2c-34ad-973e-1ed45ef7f804","version":342,"action":"UPDATE"},{"gtasId":"13950166","tamrId":"1bb876dd-f298-3837-bacc-ab59f7257570","version":342,"action":"UPDATE"},{"gtasId":"19397680","tamrId":"acdeaeab-1474-3b2c-bf7c-4ec9f29fe6eb","version":342,"action":"UPDATE"},{"gtasId":"2942813","tamrId":"af5e307d-8166-3336-8274-2e5b04b6de29","version":342,"action":"UPDATE"},{"gtasId":"12487160","tamrId":"1ee0839b-a59b-361a-8d9c-6afc747a2e15","version":342,"action":"UPDATE"},{"gtasId":"1017785","tamrId":"077ed394-33af-332e-80d3-71bdb903f51d","version":342,"action":"UPDATE"},{"gtasId":"13395827","tamrId":"1f38d809-93ee-3820-bc30-c0e4e84b219e","version":342,"action":"UPDATE"},{"gtasId":"7172672","tamrId":"6e068b60-1178-3c5b-8ad7-ea4ef76e976e","version":342,"action":"UPDATE"},{"gtasId":"6396566","tamrId":"051ffff9-a795-3c7e-a221-1daf6c0c02f5","version":342,"action":"UPDATE"},{"gtasId":"6316412","tamrId":"8169dcfd-1720-3995-a37c-d1c94b242861","version":342,"action":"UPDATE"},{"gtasId":"15194225","tamrId":"b97a17cc-92a7-3027-9248-0270699d5235","version":342,"action":"UPDATE"},{"gtasId":"3417513","tamrId":"1cb67cce-d235-373e-a984-9001ac2fc039","version":342,"action":"UPDATE"},{"gtasId":"878818","tamrId":"ca71c2ff-c27d-37f2-89ff-dac5c6dd69d1","version":342,"action":"UPDATE"},{"gtasId":"1715328","tamrId":"a4b4fa80-7c0d-3751-9617-edd84609fa03","version":342,"action":"UPDATE"},{"gtasId":"17376797","tamrId":"08b00caa-c887-3ced-801a-c4a58129a52a","version":342,"action":"UPDATE"},{"gtasId":"4613008","tamrId":"b457e3b0-e59e-3180-96af-bb37ee3a6d5d","version":342,"action":"UPDATE"},{"gtasId":"5229237","tamrId":"950081d9-9af0-34e5-9655-1dd29666261d","version":342,"action":"UPDATE"},{"gtasId":"3350837","tamrId":"7faae4bc-dc52-3c33-b854-dd5474e9b65d","version":342,"action":"UPDATE"},{"gtasId":"10159556","tamrId":"3c30dcf9-10ab-3815-94ff-f7d223a3f5c8","version":342,"action":"UPDATE"},{"gtasId":"24877838","tamrId":"24958f94-32a5-38b9-835e-653e56f2fc3e","version":342,"action":"UPDATE"},{"gtasId":"4571544","tamrId":"45ce0568-a544-36a6-b7ed-c13e032bdc90","version":342,"action":"UPDATE"},{"gtasId":"2319560","tamrId":"a1da8673-a0c8-38b7-b406-778f05dc5102","version":342,"action":"UPDATE"},{"gtasId":"6559845","tamrId":"c24f7f3f-945d-38f0-848d-4dbe7dc919c6","version":342,"action":"UPDATE"},{"gtasId":"5648902","tamrId":"5bebab06-485e-30df-92fd-fc487adf1709","version":342,"action":"UPDATE"},{"gtasId":"10496913","tamrId":"c408e886-e584-3f02-aaaa-316ba4fd7085","version":342,"action":"UPDATE"},{"gtasId":"11759119","tamrId":"9f521c0e-1d34-3e43-9455-cc4566b36b02","version":342,"action":"UPDATE"},{"gtasId":"11762752","tamrId":"31abb933-ef3f-3292-82b8-81d39dca3ebb","version":342,"action":"UPDATE"},{"gtasId":"12925663","tamrId":"5bc58ab2-7c49-3b86-817e-62f08a137ce9","version":342,"action":"UPDATE"},{"gtasId":"18423060","tamrId":"5e2a14bf-f377-33a1-bf54-778cd0a2700e","version":342,"action":"UPDATE"},{"gtasId":"6533318","tamrId":"b5f1e712-969a-3ad0-8205-b5f2c99441bf","version":342,"action":"UPDATE"},{"gtasId":"2160300","tamrId":"45c2bc32-9603-33d6-9958-5aaf53bc6c9e","version":342,"action":"UPDATE"},{"gtasId":"17661221","tamrId":"b873bc3e-0dcc-3911-b59a-8a2007617548","version":342,"action":"UPDATE"},{"gtasId":"10538318","tamrId":"c8064e62-1b00-30fb-a9cd-66877fe65b68","version":342,"action":"UPDATE"},{"gtasId":"8989433","tamrId":"c729a71c-3af9-3851-9222-3a22df2880ce","version":342,"action":"UPDATE"},{"gtasId":"4852057","tamrId":"dc5a59b2-e20c-3514-a74d-c428ea8c0e5a","version":342,"action":"UPDATE"},{"gtasId":"18910500","tamrId":"3f73bb3a-102e-3864-b8be-bac2822ef720","version":342,"action":"UPDATE"},{"gtasId":"23809295","tamrId":"a4614fde-4207-37bd-904b-940313eb5937","version":342,"action":"UPDATE"},{"gtasId":"11003303","tamrId":"82eca763-8c54-3e29-93e2-d4f20a237e7b","version":342,"action":"UPDATE"},{"gtasId":"13066074","tamrId":"f141115e-0359-3d5b-9e7a-1099be961e0e","version":342,"action":"UPDATE"},{"gtasId":"3587565","tamrId":"e1d75b98-6b58-3725-9699-1038a02fe604","version":342,"action":"UPDATE"},{"gtasId":"9356914","tamrId":"838f660b-15d7-36a7-b696-1f2339c38176","version":342,"action":"UPDATE"},{"gtasId":"7023552","tamrId":"6a776c88-f01b-3d3b-96c2-eadedbe43dea","version":342,"action":"UPDATE"},{"gtasId":"13541519","tamrId":"4f8884e3-4d69-3d2c-a524-3dca2ce8a35f","version":342,"action":"UPDATE"},{"gtasId":"5198420","tamrId":"ec84f4f9-c27f-34a6-9c73-0e21790aa24b","version":342,"action":"UPDATE"},{"gtasId":"15252577","tamrId":"068c5be3-5e23-3fdf-ac77-077ba2221dd7","version":342,"action":"UPDATE"},{"gtasId":"4921031","tamrId":"d7c1af5f-1990-3d0b-8fc1-1a7a28e90df6","version":342,"action":"UPDATE"},{"gtasId":"7424672","tamrId":"978cdee1-c4b6-3f3f-9e90-d6f1436c3410","version":342,"action":"UPDATE"},{"gtasId":"16615826","tamrId":"d9d85513-9986-3dfd-be43-bcdfee2b4b05","version":342,"action":"UPDATE"},{"gtasId":"15494781","tamrId":"2cc2cc9d-cc9e-3d0d-815b-00795ba7f871","version":342,"action":"UPDATE"},{"gtasId":"6681115","tamrId":"b02f5d33-9532-3c62-8739-e913a84936b5","version":342,"action":"UPDATE"},{"gtasId":"4171832","tamrId":"05dd5c08-b88b-3c9b-ae3e-7228fbcb3df3","version":342,"action":"UPDATE"},{"gtasId":"2019142","tamrId":"a7d21df3-4b03-33f6-9b97-bd05224651f4","version":342,"action":"UPDATE"},{"gtasId":"24884111","tamrId":"da0e96aa-47fc-394b-b006-cd6bc144786c","version":342,"action":"UPDATE"},{"gtasId":"668336","tamrId":"ae17a6be-8783-34ea-ada9-e6f43ed9b6cb","version":342,"action":"UPDATE"},{"gtasId":"8682414","tamrId":"afce6a0e-fdab-3dc0-817b-d7fc174ae8ee","version":342,"action":"UPDATE"},{"gtasId":"7470535","tamrId":"dd23206e-3bc1-368d-a10a-47e5aa5cceb0","version":342,"action":"UPDATE"},{"gtasId":"11405790","tamrId":"889daca3-7e51-3edd-b123-5b20e331dac7","version":342,"action":"UPDATE"},{"gtasId":"24476757","tamrId":"bf111990-664d-3b12-a5a6-c77086494ccb","version":342,"action":"UPDATE"},{"gtasId":"1065419","tamrId":"b7bdb934-f676-3b69-bc7e-8c35ec8414bd","version":342,"action":"UPDATE"},{"gtasId":"256534","tamrId":"92049f5e-a5ab-318e-af25-33b78a6b261e","version":342,"action":"UPDATE"},{"gtasId":"19739480","tamrId":"17ef3ab8-f221-34e5-8232-fc3c8d5d721d","version":342,"action":"UPDATE"},{"gtasId":"16052786","tamrId":"c91bd0e9-2827-3900-9412-6b6707921863","version":342,"action":"UPDATE"},{"gtasId":"23198934","tamrId":"a602319f-40cc-32b3-bcb4-8068c713b56a","version":342,"action":"UPDATE"},{"gtasId":"14004291","tamrId":"01b3e787-21e2-368b-8e44-b7eaebf03ca7","version":342,"action":"UPDATE"},{"gtasId":"8542218","tamrId":"d4370813-8f81-33d8-8e9f-08eeb2fff5d7","version":342,"action":"UPDATE"},{"gtasId":"23377484","tamrId":"a2dbcb04-7c07-3f58-a378-d0ebbad8ca80","version":342,"action":"UPDATE"},{"gtasId":"5897315","tamrId":"6e18f9c6-bfa9-3ef2-8ce3-6b0135111996","version":342,"action":"UPDATE"},{"gtasId":"8568809","tamrId":"40c86e28-1525-3627-8526-48d5d8e52425","version":342,"action":"UPDATE"},{"gtasId":"22555139","tamrId":"ca608bdc-4c32-35e2-83cf-76866cd972cf","version":342,"action":"UPDATE"},{"gtasId":"2106826","tamrId":"f3b50367-002c-352e-8748-3c2399377bf0","version":342,"action":"UPDATE"},{"gtasId":"15482741","tamrId":"26c104e3-254e-3c4b-9128-fce6f0858de4","version":342,"action":"UPDATE"},{"gtasId":"17508044","tamrId":"32ae863c-b769-3092-ba21-573f61f9b7af","version":342,"action":"UPDATE"},{"gtasId":"21044111","tamrId":"92a9174d-a30e-3dd7-944a-5215655711a8","version":342,"action":"UPDATE"},{"gtasId":"3623603","tamrId":"9c6f526e-49d6-3c36-8d0c-c26fe791d525","version":342,"action":"UPDATE"},{"gtasId":"22658373","tamrId":"c1eef887-441f-3a29-a0d8-641a8fc39019","version":342,"action":"UPDATE"},{"gtasId":"22622457","tamrId":"37b9458f-c7f0-3268-b6b2-92a845d3d1b9","version":342,"action":"UPDATE"},{"gtasId":"16761872","tamrId":"f70a4e84-2cc1-3d1b-8446-67f44251423b","version":342,"action":"UPDATE"},{"gtasId":"8417972","tamrId":"c46cd4ce-afc3-3054-b5fa-3319f861ade9","version":342,"action":"UPDATE"},{"gtasId":"3681574","tamrId":"e3cbe00b-53af-37a1-a351-6e579b187c40","version":342,"action":"UPDATE"},{"gtasId":"14439474","tamrId":"e75daeee-be49-3eb8-a26e-c8afd4e46959","version":342,"action":"UPDATE"},{"gtasId":"3313861","tamrId":"c92a5f67-0bd9-3728-8a54-6f9d13ca0cbc","version":342,"action":"UPDATE"},{"gtasId":"12435917","tamrId":"18902f55-870a-3646-8ca1-240c93a85893","version":342,"action":"UPDATE"},{"gtasId":"25455491","tamrId":"4ab00f18-7c44-3d3a-9817-bfa99fdffff2","version":342,"action":"UPDATE"},{"gtasId":"11276597","tamrId":"d30cf8c6-3f65-3bd2-ace5-241d78732829","version":342,"action":"UPDATE"},{"gtasId":"541162","tamrId":"0d87ef4a-3ec1-300a-bb41-a362046c6b8b","version":342,"action":"UPDATE"},{"gtasId":"7290631","tamrId":"bf5631bc-f452-3ceb-a2bb-e3845857e3ce","version":342,"action":"UPDATE"},{"gtasId":"11679490","tamrId":"48dfdce2-c160-330e-a555-89eb5f5eefcd","version":342,"action":"UPDATE"},{"gtasId":"16430203","tamrId":"5db42d9b-20e6-3b2c-9e1a-c7311cabedbb","version":342,"action":"UPDATE"},{"gtasId":"11679498","tamrId":"9c8cd1d1-a962-3681-a099-eac5c3e564f3","version":342,"action":"UPDATE"},{"gtasId":"7936583","tamrId":"8ce26378-c11e-3f16-ae99-440c748ecef4","version":342,"action":"UPDATE"},{"gtasId":"11541568","tamrId":"4306379e-045a-3551-a042-1a029e7f8db0","version":342,"action":"UPDATE"},{"gtasId":"954153","tamrId":"664f4388-bad6-3f6e-945f-335d5875e2d4","version":342,"action":"UPDATE"},{"gtasId":"19179487","tamrId":"92016441-eab2-385b-8244-2183581d8866","version":342,"action":"UPDATE"},{"gtasId":"24493250","tamrId":"e7f47f06-97a4-395d-81cf-a5254f6ac0f4","version":342,"action":"UPDATE"},{"gtasId":"11545926","tamrId":"d4770eed-0a6f-33ef-b701-9195bee36eee","version":342,"action":"UPDATE"},{"gtasId":"4405087","tamrId":"8510abb3-9d98-3e59-8687-cbcca1f110a6","version":342,"action":"UPDATE"},{"gtasId":"24943743","tamrId":"2d4b1b69-87c4-3dbe-b2d6-1ad4c6d90926","version":342,"action":"UPDATE"},{"gtasId":"1212364","tamrId":"62ec5e5a-9a46-386a-ab0b-fea18d6cb00b","version":342,"action":"UPDATE"},{"gtasId":"2477588","tamrId":"2e939655-a2f9-3a4b-89ca-7e6383c70b1a","version":342,"action":"UPDATE"},{"gtasId":"21653173","tamrId":"313002dc-41a1-3794-9afb-1f7f8374e63e","version":342,"action":"UPDATE"},{"gtasId":"1598279","tamrId":"fd36d9e9-c7af-34be-9be6-b31dddcfbe0c","version":342,"action":"UPDATE"},{"gtasId":"20404291","tamrId":"87bdaf31-aeeb-39d8-bc1e-c423bed0cde1","version":342,"action":"UPDATE"},{"gtasId":"11958963","tamrId":"46146d68-bc81-35b7-96f4-a93b7d35902a","version":342,"action":"UPDATE"},{"gtasId":"4136649","tamrId":"ee687a1f-b884-3242-be36-8e3a5944ba75","version":342,"action":"UPDATE"},{"gtasId":"13481448","tamrId":"7cc15a32-7f5f-3c12-a853-e0d37e21e179","version":342,"action":"UPDATE"},{"gtasId":"20331789","tamrId":"e770e5e4-5194-3049-b7a8-7f265fb49ff2","version":342,"action":"UPDATE"},{"gtasId":"24069025","tamrId":"299e31b3-2163-3925-8dcf-77b119b9306c","version":342,"action":"UPDATE"},{"gtasId":"22748329","tamrId":"6db13a3d-1da4-3227-a981-cee04a78b7ff","version":342,"action":"UPDATE"},{"gtasId":"6076508","tamrId":"a462bcc5-ccb7-3eb5-a101-95685ead38b7","version":342,"action":"UPDATE"},{"gtasId":"10155151","tamrId":"0d9b0eec-1802-3105-a6af-4d78338324b0","version":342,"action":"UPDATE"},{"gtasId":"11255694","tamrId":"d1c97fbf-663c-3620-a4f1-c6a0f9fde629","version":342,"action":"UPDATE"},{"gtasId":"16338843","tamrId":"35786e8e-5a13-3cfb-b8ff-51dd6048642b","version":342,"action":"UPDATE"},{"gtasId":"1156600","tamrId":"19cc4530-8c2a-3b93-a62f-9ec3570d4c75","version":342,"action":"UPDATE"},{"gtasId":"4056950","tamrId":"b279a68c-7cd7-38a1-860a-87fc5abc072b","version":342,"action":"UPDATE"},{"gtasId":"4889352","tamrId":"335e135b-a05f-3862-9207-311f7d9db352","version":342,"action":"UPDATE"},{"gtasId":"24410914","tamrId":"928ed14d-1684-3f11-a9c8-05cb64b725a7","version":342,"action":"UPDATE"},{"gtasId":"3910807","tamrId":"32a4c513-a01a-3696-9333-be706ff28d9d","version":342,"action":"UPDATE"},{"gtasId":"14793493","tamrId":"da417e4a-aae6-3d6f-ba26-8340113ba564","version":342,"action":"UPDATE"},{"gtasId":"24232860","tamrId":"1a72629b-6829-31be-aca0-8ddb5df00469","version":342,"action":"UPDATE"},{"gtasId":"8299467","tamrId":"9e7ff10d-cbcf-304f-9492-640dae464a87","version":342,"action":"UPDATE"},{"gtasId":"8359572","tamrId":"a3be2232-a16d-39bf-be87-c1f8cba25919","version":342,"action":"UPDATE"},{"gtasId":"14328600","tamrId":"28e07bf2-0118-36b5-ac3c-0f8e4aec2f27","version":342,"action":"UPDATE"},{"gtasId":"7516358","tamrId":"5fe9ed69-060b-3dca-890b-00a84f76c242","version":342,"action":"UPDATE"},{"gtasId":"12609167","tamrId":"76524005-7537-36c9-b3cc-2081778c471c","version":342,"action":"UPDATE"},{"gtasId":"10074958","tamrId":"3f270ae8-5035-3800-bc19-1474bcbe2812","version":342,"action":"UPDATE"},{"gtasId":"19293993","tamrId":"57062cb6-1247-3924-8324-664148e16e0d","version":342,"action":"UPDATE"},{"gtasId":"10506782","tamrId":"9a8e5704-026e-3e3c-b950-bcdeb5cbc38a","version":342,"action":"UPDATE"},{"gtasId":"13258755","tamrId":"c6ff2525-fd38-37c2-b7e4-f876d7bbb45f","version":342,"action":"UPDATE"},{"gtasId":"18299643","tamrId":"403d8fa7-5bd4-3456-aeca-1210fe716990","version":342,"action":"UPDATE"},{"gtasId":"24555123","tamrId":"011a623a-3542-3732-be26-6f7751b7c1dc","version":342,"action":"UPDATE"},{"gtasId":"14480554","tamrId":"38e4f1db-1011-3e80-877d-f9c7cbdd7723","version":342,"action":"UPDATE"},{"gtasId":"2948992","tamrId":"ce0cdb43-4211-38be-9711-e2516828e8c6","version":342,"action":"UPDATE"},{"gtasId":"1384164","tamrId":"b70ce640-292b-3384-b480-4eca990077aa","version":342,"action":"UPDATE"},{"gtasId":"13698553","tamrId":"56624381-0458-31c1-9997-f42a3b12d25b","version":342,"action":"UPDATE"},{"gtasId":"19641656","tamrId":"27d1993a-10cd-300a-943c-02f84843a207","version":342,"action":"UPDATE"},{"gtasId":"4277290","tamrId":"43863c3f-e884-3d38-9986-c3cf6c862a4a","version":342,"action":"UPDATE"},{"gtasId":"20977132","tamrId":"7ec4b711-0745-3d2b-86b2-e6cb7c013b5c","version":342,"action":"UPDATE"},{"gtasId":"782767","tamrId":"591076ef-fb0d-34a2-9721-d5a61adca2df","version":342,"action":"UPDATE"},{"gtasId":"2687270","tamrId":"28d65833-e06b-3644-926e-e9177883a76d","version":342,"action":"UPDATE"},{"gtasId":"677207","tamrId":"0bbd289e-a266-32f8-bb4c-e6d173fda82f","version":342,"action":"UPDATE"},{"gtasId":"19464878","tamrId":"b125f2e5-2f1a-3625-afa3-7353af2272e9","version":342,"action":"UPDATE"},{"gtasId":"10794780","tamrId":"4bbbc8c3-9c21-3e0d-83d6-142b89c83b65","version":342,"action":"UPDATE"},{"gtasId":"9031195","tamrId":"87bd68c4-9044-36b4-87c5-b9d1c85ab90c","version":342,"action":"UPDATE"},{"gtasId":"2331272","tamrId":"55eb39b3-6f55-381b-ad95-98c205d171c7","version":342,"action":"UPDATE"},{"gtasId":"9550203","tamrId":"7b05646e-32de-3447-a175-12015b92676e","version":342,"action":"UPDATE"},{"gtasId":"10703177","tamrId":"4363b5a6-af1a-338f-b9b4-c5f576033254","version":342,"action":"UPDATE"},{"gtasId":"16394161","tamrId":"eb510e3a-6ea0-3e99-8397-71db03c52e3b","version":342,"action":"UPDATE"},{"gtasId":"24055277","tamrId":"b2039c88-f78f-309a-b9d2-1f2f4d0c21e6","version":342,"action":"UPDATE"},{"gtasId":"20607656","tamrId":"67022584-6958-3bda-aa3a-911ddccf08ac","version":342,"action":"UPDATE"},{"gtasId":"16246351","tamrId":"79f8adfa-d6f9-3a76-8e96-352d34bb833c","version":342,"action":"UPDATE"},{"gtasId":"3434029","tamrId":"2deeee21-5a95-30d2-abae-75f6e01f1ff8","version":342,"action":"UPDATE"},{"gtasId":"16269812","tamrId":"ec7ecd0f-8167-358a-9064-90d17dafcb8b","version":342,"action":"UPDATE"},{"gtasId":"25209274","tamrId":"cc18d499-d9ba-303b-88f0-c6005609a518","version":342,"action":"UPDATE"},{"gtasId":"22465236","tamrId":"1de9a547-8224-378b-b1bc-6a372f203711","version":342,"action":"UPDATE"},{"gtasId":"8235482","tamrId":"23c443f1-81ef-3057-88a9-6ddccf628a2b","version":342,"action":"UPDATE"},{"gtasId":"1754990","tamrId":"ab0d1e65-83af-3f7c-a9c5-f1c478285e05","version":342,"action":"UPDATE"},{"gtasId":"1887163","tamrId":"50b79869-eb75-3fda-bc20-3c3d3ea11905","version":342,"action":"UPDATE"},{"gtasId":"5594687","tamrId":"103b325c-f0ae-3deb-b20b-75a198d7bfa2","version":342,"action":"UPDATE"},{"gtasId":"22210664","tamrId":"ef113528-236c-3ab2-86de-384bdb105d84","version":342,"action":"UPDATE"},{"gtasId":"25114455","tamrId":"94bb40f7-949a-3f0f-8121-79c558062087","version":342,"action":"UPDATE"},{"gtasId":"23149103","tamrId":"2544e679-0cf3-3093-81b9-540ae077856c","version":342,"action":"UPDATE"},{"gtasId":"526343","tamrId":"1ead773c-9f6d-3a51-a7fc-89fc7454c29a","version":342,"action":"UPDATE"},{"gtasId":"806358","tamrId":"1c430247-b214-382d-95e9-0e6894179798","version":342,"action":"UPDATE"},{"gtasId":"8693947","tamrId":"7405a752-d424-3194-8ef1-4ca8fef7e295","version":342,"action":"UPDATE"},{"gtasId":"8336025","tamrId":"aa7f9cf6-a0eb-3d26-847d-0365482b7f77","version":342,"action":"UPDATE"},{"gtasId":"3061031","tamrId":"3361840d-4801-30e2-88ab-39cc4242f333","version":342,"action":"UPDATE"},{"gtasId":"6895139","tamrId":"e9622f9e-42e5-3b7b-ac77-c8da30697d2a","version":342,"action":"UPDATE"},{"gtasId":"8175302","tamrId":"46d5770a-17c2-3f9e-9e11-303bebe9b0fe","version":342,"action":"UPDATE"},{"gtasId":"8069337","tamrId":"86c2131e-857b-351c-b094-ad80e3c4b345","version":342,"action":"UPDATE"},{"gtasId":"23286262","tamrId":"03b432f3-9214-36df-9538-63a17082fb9a","version":342,"action":"UPDATE"},{"gtasId":"8727708","tamrId":"9cf1dbd3-bac5-3ca1-b21c-24ad349d3a42","version":342,"action":"UPDATE"},{"gtasId":"4015564","tamrId":"9d5f4a37-0b6b-3c9f-9940-3dfd5013331d","version":342,"action":"UPDATE"},{"gtasId":"9368076","tamrId":"7f019774-1dbf-3d71-8027-138a319c7aae","version":342,"action":"UPDATE"},{"gtasId":"3932172","tamrId":"2d826930-9ce8-3a07-8af0-b987c3f6fed0","version":342,"action":"UPDATE"},{"gtasId":"8680631","tamrId":"4a53c70e-97da-36c3-a5cf-acabc9954da1","version":342,"action":"UPDATE"},{"gtasId":"25295172","tamrId":"630a99a0-e55a-33f3-949c-da5e0f7d3fc6","version":342,"action":"UPDATE"},{"gtasId":"11232162","tamrId":"0d1006e1-b67d-3e8b-a19d-90d5d6a6ad54","version":342,"action":"UPDATE"},{"gtasId":"19999460","tamrId":"5094172f-de29-3fc6-9a69-b8eaedfe6b9e","version":342,"action":"UPDATE"},{"gtasId":"25512480","tamrId":"334f779d-b06a-3075-8e8f-0c2ea896b847","version":342,"action":"UPDATE"},{"gtasId":"4401574","tamrId":"90663cbd-d15d-3166-882a-a75b471ef011","version":342,"action":"UPDATE"},{"gtasId":"7957446","tamrId":"c5e2a9ee-a1be-30bc-baa4-0f027df2b2a4","version":342,"action":"UPDATE"},{"gtasId":"1241743","tamrId":"06a6c485-93da-347a-b3e0-f6f608d9a4bd","version":342,"action":"UPDATE"},{"gtasId":"3462921","tamrId":"5602f3c6-c9b5-3b94-938c-84066da87529","version":342,"action":"UPDATE"},{"gtasId":"1574215","tamrId":"cb4b03b4-8841-3012-84a0-4d66b69ca8d6","version":342,"action":"UPDATE"},{"gtasId":"3130077","tamrId":"71053eda-56df-3262-ac88-f1a135f4c654","version":342,"action":"UPDATE"},{"gtasId":"17690608","tamrId":"7c6c8f51-eeb5-3108-bd7b-c025a5e9a9ca","version":342,"action":"UPDATE"},{"gtasId":"18245892","tamrId":"a7f4a18a-ce71-3826-9009-6b961963317d","version":342,"action":"UPDATE"},{"gtasId":"1048087","tamrId":"7dcdce80-3d53-3ead-b637-89a087d23da5","version":342,"action":"UPDATE"},{"gtasId":"949614","tamrId":"6a4a2de8-a3b1-320e-8f92-6f665d7a9e51","version":342,"action":"UPDATE"},{"gtasId":"1182972","tamrId":"7dd2441d-39b8-363e-8d40-f05e9140143d","version":342,"action":"UPDATE"},{"gtasId":"14468858","tamrId":"80065a27-2843-3ea9-9d30-093319ee9b27","version":342,"action":"UPDATE"},{"gtasId":"4460719","tamrId":"ebf680d3-6ea0-3c5a-abae-01e2752dff9e","version":342,"action":"UPDATE"},{"gtasId":"9645871","tamrId":"0f038918-1858-344b-89cd-644a4ea11e9b","version":342,"action":"UPDATE"},{"gtasId":"597504","tamrId":"16d67cc5-ecfc-37af-b0d2-64c35d18c6b5","version":342,"action":"UPDATE"},{"gtasId":"6062737","tamrId":"ca5f3d35-8bee-30ab-b5ef-3b7e411c56fa","version":342,"action":"UPDATE"},{"gtasId":"12305153","tamrId":"868e41ff-2279-3b0d-b6f6-fbd7d12bc26d","version":342,"action":"UPDATE"},{"gtasId":"3102822","tamrId":"34123e17-65cb-320e-9eab-707c8101182d","version":342,"action":"UPDATE"},{"gtasId":"11740507","tamrId":"c2dccea6-e0d9-3311-af26-b3161bc2bad7","version":342,"action":"UPDATE"},{"gtasId":"1167345","tamrId":"088ffc51-ce00-3e58-af77-f9de409df943","version":342,"action":"UPDATE"},{"gtasId":"5564842","tamrId":"b56a6565-31ae-3137-aa68-0f731e6551ab","version":342,"action":"UPDATE"},{"gtasId":"15558345","tamrId":"ed113dbf-41d0-33ea-88f2-2dd220a1865a","version":342,"action":"UPDATE"},{"gtasId":"6267062","tamrId":"d8568858-f312-3339-952e-03e5f025d92f","version":342,"action":"UPDATE"},{"gtasId":"9027977","tamrId":"e38cf21e-213c-31ff-8a37-4e8dd992300f","version":342,"action":"UPDATE"},{"gtasId":"9060522","tamrId":"8e645339-5bc7-3286-8441-056cde711b93","version":342,"action":"UPDATE"},{"gtasId":"6295962","tamrId":"c8ba99ed-9520-3393-a401-c6e72831541f","version":342,"action":"UPDATE"},{"gtasId":"12797809","tamrId":"aa2eee49-7321-3edf-9619-e264dd715b5e","version":342,"action":"UPDATE"},{"gtasId":"1765607","tamrId":"db1403ee-826f-35e5-ac07-c31f93c508cc","version":342,"action":"UPDATE"},{"gtasId":"2206973","tamrId":"7d0f47dd-453b-3b52-883b-17fe8419d527","version":342,"action":"UPDATE"},{"gtasId":"20986061","tamrId":"60ac3c10-9eac-31b1-a6ab-fa536a0a0366","version":342,"action":"UPDATE"},{"gtasId":"6875598","tamrId":"8a6df637-6b56-31f4-852c-2b0d73efb739","version":342,"action":"UPDATE"},{"gtasId":"24988689","tamrId":"f159e185-f762-3448-ab7a-9e3beee666d2","version":342,"action":"UPDATE"},{"gtasId":"16651484","tamrId":"25e430ab-ce4a-3982-9a75-30a368116ccd","version":342,"action":"UPDATE"},{"gtasId":"5282200","tamrId":"6f96e2c7-4bd6-3771-a1d9-1468c6b81462","version":342,"action":"UPDATE"},{"gtasId":"15490301","tamrId":"63de4a92-dda3-3abe-9d03-e82e9377de1a","version":342,"action":"UPDATE"},{"gtasId":"8693908","tamrId":"cb7c7eb9-a372-341e-8c69-08531cc76302","version":342,"action":"UPDATE"},{"gtasId":"10549017","tamrId":"f5c333a8-7f4c-3781-a703-d4cc43a34ace","version":342,"action":"UPDATE"},{"gtasId":"14046026","tamrId":"02ad8e82-f794-3595-ab46-e127154e9867","version":342,"action":"UPDATE"},{"gtasId":"1775852","tamrId":"2055c761-9067-3436-8581-6d7d01f22c75","version":342,"action":"UPDATE"},{"gtasId":"24386818","tamrId":"ae49eb02-2708-3755-840b-a5805a1712ba","version":342,"action":"UPDATE"},{"gtasId":"18934507","tamrId":"39f060f9-a1e0-3aee-a832-527e53235b0c","version":342,"action":"UPDATE"},{"gtasId":"20504434","tamrId":"68bc998d-c02f-3834-bff0-58dddd6e499a","version":342,"action":"UPDATE"},{"gtasId":"23290304","tamrId":"66fd73c9-4bc8-3bee-8328-6ba2af77be08","version":342,"action":"UPDATE"},{"gtasId":"21131871","tamrId":"5da99ada-e050-3fd6-a566-5e4b879e792d","version":342,"action":"UPDATE"},{"gtasId":"4006659","tamrId":"c7f5b357-dbc9-385c-b666-5e9b0ea2dda3","version":342,"action":"UPDATE"},{"gtasId":"12127078","tamrId":"355b8e6f-5f12-37fc-ad2e-286fd9c5e0a6","version":342,"action":"UPDATE"},{"gtasId":"18516965","tamrId":"39ca7fb5-a0dd-3e1f-9399-23ca4518a130","version":342,"action":"UPDATE"},{"gtasId":"4657409","tamrId":"6eefa3c7-5ea2-39ea-adca-efed51f67fa5","version":342,"action":"UPDATE"},{"gtasId":"9652138","tamrId":"843e3eb0-fba0-34ef-b2ee-ccdc9ab2dcf3","version":342,"action":"UPDATE"},{"gtasId":"2386363","tamrId":"da1d26a4-bbfd-301b-8ba1-6397ce897ab7","version":342,"action":"UPDATE"},{"gtasId":"17957625","tamrId":"c50feffb-a991-357f-a06e-0a034284d523","version":342,"action":"UPDATE"},{"gtasId":"618071","tamrId":"554e9087-bcb1-37c9-8803-4d6f9f147706","version":342,"action":"UPDATE"}]} From 63ddce31b73c49a02b618963ce2723e91153c8e6 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sat, 25 Jan 2020 21:00:07 -0500 Subject: [PATCH 14/83] Add recordErrors test to ReceiveTamrMessagesTest --- .../parsers/tamr/ReceiveTamrMessagesTest.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index 8bc7021909..5e3582cbd8 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -26,6 +26,7 @@ public class ReceiveTamrMessagesTest implements ParserTestHelper { private static final String DEROG_REPLACE_RESPONSE = "/tamr-messages/derog_replace_response.json"; private static final String CLUSTERS_MESSAGE = "/tamr-messages/clusters_message.json"; private static final String DELTAS_MESSAGE = "/tamr-messages/deltas_message.json"; + private static final String RECORD_ERRORS_RESPONSE = "/tamr-messages/record_errors_response.json"; private static final String ERROR_MESSAGE = "/tamr-messages/error_message.json"; private TamrMessageReceiver receiver; @@ -122,6 +123,20 @@ public void testDeltasMessage() throws JMSException, IOException, URISyntaxExcep verify(handler, never()).handleErrorResponse(any()); } + @Test + public void testRecordErrors() throws JMSException, IOException, URISyntaxException { + TextMessage message = mock(TextMessage.class); + given(message.getJMSType()).willReturn("QUERY"); + given(message.getText()).willReturn(getMessageText(RECORD_ERRORS_RESPONSE)); + + receiver.receive(message); + + verify(handler).handleQueryResponse(any(TamrMessage.class)); + verify(handler, never()).handleAcknowledgeResponse(any()); + verify(handler, never()).handleTamrIdUpdate(any()); + verify(handler, never()).handleErrorResponse(any()); + } + @Test public void testErrorMessage() throws JMSException, IOException, URISyntaxException { TextMessage message = mock(TextMessage.class); @@ -136,12 +151,6 @@ public void testErrorMessage() throws JMSException, IOException, URISyntaxExcept verify(handler, never()).handleTamrIdUpdate(any()); } - @Test - @Ignore("Waiting on test data") - public void testRecordErrors() { - fail("Not implemented"); - } - @Test public void testUnknownMessageType() throws JMSException { TextMessage message = mock(TextMessage.class); From 567c6c8927a4e481d7d9e1513228280d877d9c59 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sat, 25 Jan 2020 21:12:12 -0500 Subject: [PATCH 15/83] Handle QUERY history responses and TH.DELTA/TH.CLUSTER messages, persisting new Tamr IDs to database --- .../tamr/TamrMessageHandlerServiceImpl.java | 51 +++++++- .../gtas/parsers/tamr/UpdateTamrIdTest.java | 116 ++++++++++++++++++ 2 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 4882e82572..5bba2c2359 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -8,7 +8,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import gov.gtas.model.PassengerIDTag; +import gov.gtas.parsers.tamr.model.TamrDerogHit; +import gov.gtas.parsers.tamr.model.TamrHistoryCluster; import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrTravelerResponse; import gov.gtas.repository.PassengerIDTagRepository; @Component @@ -27,7 +31,16 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService public void handleQueryResponse(TamrMessage response) { if (this.checkRecordErrors(response)) return; - logger.info("TODO: handle QUERY response"); + for (TamrTravelerResponse travelerResponse: response.getTravelerQuery()) { + if (travelerResponse.getTamrId() != null) { + this.updateTamrId(travelerResponse.getGtasId(), + travelerResponse.getTamrId(), + travelerResponse.getVersion()); + } + for (TamrDerogHit derogHit: travelerResponse.getDerogIds()) { + // TODO: handle derog hit. + } + } } /** @@ -58,10 +71,42 @@ public void handleAcknowledgeResponse(TamrMessage response) { public void handleTamrIdUpdate(TamrMessage message) { // The "error" field can be set on these. if (message.getError() != null) { - logger.error("Tamr error during {} request: {}", + logger.error("Tamr error in {} message: {}", message.getMessageType(), message.getError()); + return; + } + + for (TamrHistoryCluster cluster: message.getHistoryClusters()) { + if (cluster.getAction() == null || + cluster.getAction().equals("UPDATE")) { + this.updateTamrId(cluster.getGtasId(), + cluster.getTamrId(), cluster.getVersion()); + } else if (cluster.getAction().equals("DELETE")) { + // TODO: not sure what to do with these. + this.updateTamrId(cluster.getGtasId(), + null, cluster.getVersion()); + } else { + logger.warn("Unknown history cluster action \"{}\" received " + + "from Tamr for passenger {}. Ignoring...", + cluster.getAction(), cluster.getGtasId()); + } + } + } + + /** + * Updates the tamrId for the traveler in GTAS with the given gtasId. This + * also checks to see if the traveler exists in GTAS; if they do not, it + * issues a warning. + */ + private void updateTamrId(String gtasIdStr, String tamrId, int version) { + long gtasId = Long.parseLong(gtasIdStr); + PassengerIDTag currentPassengerIdTag = + passengerIDTagRepository.findByPaxId(gtasId); + if (currentPassengerIdTag == null) { + logger.warn("Unable to update tamrId of nonexistent passenger " + + "with ID {}.", gtasId); } else { - logger.info("TODO: handle Tamr ID updates"); + passengerIDTagRepository.updateTamrId(gtasId, tamrId); } } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java new file mode 100644 index 0000000000..d71168e0e8 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java @@ -0,0 +1,116 @@ +package gov.gtas.parsers.tamr; + +import static org.junit.Assert.*; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + +import java.util.Collections; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import gov.gtas.model.PassengerIDTag; +import gov.gtas.parsers.ParserTestHelper; +import gov.gtas.parsers.tamr.model.TamrHistoryCluster; +import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrTravelerResponse; +import gov.gtas.repository.PassengerIDTagRepository; + +/** + * Test the handling of messages from Tamr that are supposed to update the + * Tamr cluster IDs stored in GTAS. These include QUERY responses and + * TH.DELTA and TH.CLUSTER messages. + */ +public class UpdateTamrIdTest implements ParserTestHelper { + private TamrMessageHandlerService handler; + private PassengerIDTagRepository passengerIDTagRepository; + + private static final long gtasId = 17957625; + private static final String newTamrId = + "c50feffb-a991-357f-a06e-0a034284d523"; + + @Before + public void setUp() { + this.handler = new TamrMessageHandlerServiceImpl(); + this.passengerIDTagRepository = mock(PassengerIDTagRepository.class); + ReflectionTestUtils.setField(handler, + "passengerIDTagRepository", passengerIDTagRepository); + + // Set up the PassengerIDTagRepository to return a dummy instance when + // queried. + PassengerIDTag passengerIdTag = new PassengerIDTag(); + passengerIdTag.setPax_id(gtasId); + given(passengerIDTagRepository.findByPaxId(gtasId)).willReturn( + passengerIdTag); + } + + @Test + public void testQueryResponse() { + TamrTravelerResponse travelerResponse = new TamrTravelerResponse(); + travelerResponse.setGtasId(Long.toString(gtasId)); + travelerResponse.setDerogIds(Collections.emptyList()); + travelerResponse.setTamrId(newTamrId); + travelerResponse.setVersion(1); + travelerResponse.setScore(1); + + TamrMessage message = new TamrMessage(); + message.setTravelerQuery(Collections.singletonList(travelerResponse)); + + handler.handleQueryResponse(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, newTamrId); + } + + @Test + public void testDeltaMessageUpdate() { + TamrHistoryCluster historyCluster = new TamrHistoryCluster(); + historyCluster.setGtasId(Long.toString(gtasId)); + historyCluster.setTamrId(newTamrId); + historyCluster.setVersion(1); + historyCluster.setAction("UPDATE"); + + TamrMessage message = new TamrMessage(); + message.setHistoryClusters(Collections.singletonList(historyCluster)); + + handler.handleTamrIdUpdate(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, newTamrId); + } + + @Test + public void testDeltaMessageDelete() { + TamrHistoryCluster historyCluster = new TamrHistoryCluster(); + historyCluster.setGtasId(Long.toString(gtasId)); + historyCluster.setTamrId(null); + historyCluster.setVersion(1); + historyCluster.setAction("DELETE"); + + TamrMessage message = new TamrMessage(); + message.setHistoryClusters(Collections.singletonList(historyCluster)); + + handler.handleTamrIdUpdate(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, null); + } + + @Test + public void testClusterMessage() { + TamrHistoryCluster historyCluster = new TamrHistoryCluster(); + historyCluster.setGtasId(Long.toString(gtasId)); + historyCluster.setTamrId(newTamrId); + historyCluster.setVersion(1); + historyCluster.setAction(null); + + TamrMessage message = new TamrMessage(); + message.setHistoryClusters(Collections.singletonList(historyCluster)); + + handler.handleTamrIdUpdate(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, newTamrId); + } +} From 2ae538009cea8023c139622ba1013855ee15db24 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sun, 26 Jan 2020 09:26:28 -0500 Subject: [PATCH 16/83] Add accidentally uncommitted record_errors_response example Tamr message --- .../src/test/resources/tamr-messages/record_errors_response.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 gtas-parent/gtas-parsers/src/test/resources/tamr-messages/record_errors_response.json diff --git a/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/record_errors_response.json b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/record_errors_response.json new file mode 100644 index 0000000000..656fd1bc91 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/resources/tamr-messages/record_errors_response.json @@ -0,0 +1 @@ +{"recordErrors":[{"recordId":null,"record":"{first_name=BRUCE}","errors":["Query record has no gtasId."]}]} From 1ee37ed6b47a294c0959d40456b8042d7b33e37e Mon Sep 17 00:00:00 2001 From: Aaron Solomon Date: Mon, 27 Jan 2020 10:42:58 -0500 Subject: [PATCH 17/83] silenced NPM for dev purposes --- gtas-parent/gtas-webapp/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtas-parent/gtas-webapp/pom.xml b/gtas-parent/gtas-webapp/pom.xml index ae3632041b..7f0d647068 100644 --- a/gtas-parent/gtas-webapp/pom.xml +++ b/gtas-parent/gtas-webapp/pom.xml @@ -257,7 +257,7 @@ v8.11.1 - + From ec749729d523255fa17fb568e76a87652d91068d Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 27 Jan 2020 15:05:26 -0500 Subject: [PATCH 18/83] Remove resolved TODO --- .../gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 5bba2c2359..3b35c7d76d 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -82,7 +82,6 @@ public void handleTamrIdUpdate(TamrMessage message) { this.updateTamrId(cluster.getGtasId(), cluster.getTamrId(), cluster.getVersion()); } else if (cluster.getAction().equals("DELETE")) { - // TODO: not sure what to do with these. this.updateTamrId(cluster.getGtasId(), null, cluster.getVersion()); } else { From fc15fc7f467abeed0870f10101cf5c772d969a92 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 27 Jan 2020 15:57:33 -0500 Subject: [PATCH 19/83] Handle Tamr derog hits by adding hits to the pending_hits table --- .../tamr/TamrMessageHandlerServiceImpl.java | 72 +++++++++- .../parsers/tamr/HandleTamrDerogHitsTest.java | 126 ++++++++++++++++++ 2 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 5bba2c2359..dbf39876b1 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -1,5 +1,9 @@ package gov.gtas.parsers.tamr; +import java.util.Date; +import java.util.NoSuchElementException; +import java.util.Optional; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -8,12 +12,19 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import gov.gtas.enumtype.HitTypeEnum; +import gov.gtas.model.Passenger; import gov.gtas.model.PassengerIDTag; +import gov.gtas.model.PendingHitDetails; +import gov.gtas.model.watchlist.WatchlistItem; import gov.gtas.parsers.tamr.model.TamrDerogHit; import gov.gtas.parsers.tamr.model.TamrHistoryCluster; import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.parsers.tamr.model.TamrTravelerResponse; import gov.gtas.repository.PassengerIDTagRepository; +import gov.gtas.repository.PassengerRepository; +import gov.gtas.repository.PendingHitDetailRepository; +import gov.gtas.repository.watchlist.WatchlistItemRepository; @Component public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService { @@ -23,6 +34,15 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService @Autowired private PassengerIDTagRepository passengerIDTagRepository; + @Autowired + private WatchlistItemRepository watchlistItemRepository; + + @Autowired + private PendingHitDetailRepository pendingHitDetailRepository; + + @Autowired + private PassengerRepository passengerRepository; + /** * Handle responses to Tamr QUERY requests. This handles both the "derog * matches" and "traveler history" responses. @@ -38,10 +58,60 @@ public void handleQueryResponse(TamrMessage response) { travelerResponse.getVersion()); } for (TamrDerogHit derogHit: travelerResponse.getDerogIds()) { - // TODO: handle derog hit. + this.createPendingHit(travelerResponse.getGtasId(), derogHit); } } } + + /** + * Creates an instance of the PendingHitDetails model in GTAS based on a + * derog hit from Tamr. + */ + private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { + long gtasId = Long.parseLong(gtasIdStr); + PendingHitDetails pendingHit = new PendingHitDetails(); + + pendingHit.setTitle("Tamr Fuzzy Watchlist Hit"); + pendingHit.setDescription("This passenger closely matches a watchlist " + + "entry, according to Tamr's proprietary fuzzy matching " + + "technology."); + + pendingHit.setHitEnum(HitTypeEnum.PARTIAL_WATCHLIST); + pendingHit.setHitType(pendingHit.getHitEnum().toString()); + + // Try to get watchlist item based on derogId from Tamr. + long watchlistItemId = Long.parseLong(derogHit.getDerogId()); + Optional watchlistItem = + watchlistItemRepository.findById(watchlistItemId); + try { + pendingHit.setHitMakerId(watchlistItem.get().getId()); + pendingHit.setPercentage(derogHit.getScore()); + + // Tamr doesn't return any details about the matching algorithm, + // so leave this empty. + pendingHit.setRuleConditions(""); + } catch (NoSuchElementException e) { + logger.warn("Tamr returned derog hit for nonexistent watchlist " + + "entry with ID {}.", watchlistItemId); + return; + } + + // Try to find passenger in GTAS so we can get the associated flight. + Optional passenger = passengerRepository.findById(gtasId); + try { + pendingHit.setFlightId(passenger.get().getFlight().getId()); + pendingHit.setPassengerId(gtasId); + } catch (NoSuchElementException e) { + logger.warn("Tamr returned derog hit for nonexistent passenger " + + "with ID {}.", gtasId); + return; + } + + pendingHit.setCreatedDate(new Date()); + + // Persist to database. + pendingHitDetailRepository.save(pendingHit); + } /** * Handles an acknowledgement response from Tamr. This response is received diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java new file mode 100644 index 0000000000..ec37e44a7d --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -0,0 +1,126 @@ +package gov.gtas.parsers.tamr; + +import static org.junit.Assert.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.*; +import static org.mockito.AdditionalMatchers.*; + +import java.util.Collections; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.test.util.ReflectionTestUtils; + + +import gov.gtas.enumtype.HitTypeEnum; +import gov.gtas.model.Flight; +import gov.gtas.model.Passenger; +import gov.gtas.model.PendingHitDetails; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.ParserTestHelper; +import gov.gtas.parsers.tamr.model.TamrDerogHit; +import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrTravelerResponse; +import gov.gtas.repository.PassengerRepository; +import gov.gtas.repository.PendingHitDetailRepository; +import gov.gtas.repository.watchlist.WatchlistItemRepository; + +public class HandleTamrDerogHitsTest implements ParserTestHelper { + private TamrMessageHandlerService handler; + private WatchlistItem watchlistItem; + private WatchlistItemRepository watchlistItemRepository; + private PendingHitDetailRepository pendingHitDetailRepository; + private Passenger passenger; + private PassengerRepository passengerRepository; + + @Before + public void setUp() { + this.handler = new TamrMessageHandlerServiceImpl(); + + this.watchlistItem = new WatchlistItem(); + watchlistItem.setId(94L); + + watchlistItemRepository = mock(WatchlistItemRepository.class); + ReflectionTestUtils.setField(handler, "watchlistItemRepository", + watchlistItemRepository); + // Set up WatchlistItemRepository to return a fake watchlist item. + given(watchlistItemRepository.findById(watchlistItem.getId())) + .willReturn(Optional.of(watchlistItem)); + // Otherwise return null. + given(watchlistItemRepository.findById(not(eq(watchlistItem.getId())))) + .willReturn(Optional.empty()); + + pendingHitDetailRepository = mock(PendingHitDetailRepository.class); + ReflectionTestUtils.setField(handler, "pendingHitDetailRepository", + pendingHitDetailRepository); + + + passengerRepository = mock(PassengerRepository.class); + ReflectionTestUtils.setField(handler, "passengerRepository", + passengerRepository); + + // Set up the PassengerRepository to return a dummy instance when + // queried. + passenger = new Passenger(); + passenger.setId(1099L); + Flight flight = new Flight(); + flight.setId(22L); + passenger.setFlight(flight); + given(passengerRepository.findById(passenger.getId())).willReturn( + Optional.of(passenger)); + // Otherwise return null. + given(passengerRepository.findById(not(eq(passenger.getId())))) + .willReturn(Optional.empty()); + } + + @Test + public void testHandleDerogHit() { + float score = 0.76f; + TamrMessage derogMessage = getDerogMessage( + passenger.getId(), watchlistItem.getId(), score); + handler.handleQueryResponse(derogMessage); + + final ArgumentCaptor pendingHitCaptor = + ArgumentCaptor.forClass(PendingHitDetails.class); + verify(pendingHitDetailRepository).save(pendingHitCaptor.capture()); + PendingHitDetails pendingHit = pendingHitCaptor.getValue(); + + // We should mention Tamr somewhere in the title and description for + // the derog hit so it's clear where it came from. + assertTrue(pendingHit.getTitle().contains("Tamr")); + assertTrue(pendingHit.getDescription().contains("Tamr")); + + assertEquals(pendingHit.getHitEnum().toString(), + pendingHit.getHitType()); + assertEquals(HitTypeEnum.PARTIAL_WATCHLIST, pendingHit.getHitEnum()); + + assertEquals(watchlistItem.getId(), pendingHit.getHitMakerId()); + assertEquals(score, pendingHit.getPercentage(), 0.00001f); + + assertEquals(passenger.getId(), pendingHit.getPassengerId()); + assertEquals(passenger.getFlight().getId(), pendingHit.getFlightId()); + } + + /** + * Constructs a QUERY response TamrMessage that includes matching the + * given passenger with the given wachlist item. + */ + private TamrMessage getDerogMessage(long gtasId, long derogId, float score) { + TamrDerogHit derogHit = new TamrDerogHit(); + derogHit.setDerogId(Long.toString(derogId)); + derogHit.setScore(score); + + TamrTravelerResponse travelerResponse = new TamrTravelerResponse(); + travelerResponse.setGtasId(Long.toString(gtasId)); + travelerResponse.setDerogIds(Collections.singletonList(derogHit)); + travelerResponse.setTamrId(null); + travelerResponse.setVersion(-1); + travelerResponse.setScore(0); + + TamrMessage message = new TamrMessage(); + message.setTravelerQuery(Collections.singletonList(travelerResponse)); + return message; + } +} From ac09ff7e42328675ac873ed2291cfa44bfb19b06 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 27 Jan 2020 16:04:39 -0500 Subject: [PATCH 20/83] Add additional tests for handling Tamr derog messages when derogId/gtasId are invalid --- .../parsers/tamr/HandleTamrDerogHitsTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java index ec37e44a7d..e5f216d292 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -103,6 +103,30 @@ public void testHandleDerogHit() { assertEquals(passenger.getFlight().getId(), pendingHit.getFlightId()); } + /** + * Test when Tamr sends a nonexistent derogId. + */ + @Test + public void handleNonexistentDerogId() { + TamrMessage derogMessage = getDerogMessage( + passenger.getId(), 35L, 0.22f); + handler.handleQueryResponse(derogMessage); + + verifyZeroInteractions(pendingHitDetailRepository); + } + + /** + * Test when Tamr sends a nonexistent gtasId. + */ + @Test + public void handleNonexistentGtasId() { + TamrMessage derogMessage = getDerogMessage( + 547L, watchlistItem.getId(), 0.28f); + handler.handleQueryResponse(derogMessage); + + verifyZeroInteractions(pendingHitDetailRepository); + } + /** * Constructs a QUERY response TamrMessage that includes matching the * given passenger with the given wachlist item. From 2d163024500dde0e72a434f6c266052b20868e19 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 27 Jan 2020 17:39:11 -0500 Subject: [PATCH 21/83] Update Tamr query objects to correct format for JSON serialization, and rename TamrPassengerSendObject to TamrPassenger --- .../gtas/job/scheduler/LoaderScheduler.java | 6 +- .../gov/gtas/services/ApisMessageService.java | 6 +- .../main/java/gov/gtas/services/Loader.java | 8 +- .../gov/gtas/services/MessageInformation.java | 12 +- .../gov/gtas/services/PnrMessageService.java | 6 +- .../gov/gtas/services/ProcessedMessages.java | 12 +- .../gov/gtas/parsers/tamr/TamrAdapter.java | 4 +- .../gtas/parsers/tamr/TamrAdapterImpl.java | 97 +++++---- .../parsers/tamr/TamrConversionService.java | 24 --- .../tamr/TamrConversionServiceImpl.java | 160 --------------- .../tamr/model/TamrDerogListEntry.java | 18 ++ .../gtas/parsers/tamr/model/TamrDocument.java | 36 ++++ .../tamr/model/TamrDocumentSendObject.java | 53 ----- .../parsers/tamr/model/TamrPassenger.java | 89 ++++++++ .../tamr/model/TamrPassengerSendObject.java | 192 ------------------ .../gtas/parsers/tamr/model/TamrQuery.java | 28 +++ .../parsers/tamr/ReceiveTamrMessagesTest.java | 1 - .../parsers/tamr/TamrAdapterImplTest.java | 57 ++++-- 18 files changed, 285 insertions(+), 524 deletions(-) delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index c9514b92b7..05bc55dc57 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -16,7 +16,7 @@ import gov.gtas.json.AuditActionData; import gov.gtas.json.AuditActionTarget; import gov.gtas.model.MessageStatus; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.repository.MessageStatusRepository; import gov.gtas.services.*; import gov.gtas.services.matcher.MatchingService; @@ -105,8 +105,8 @@ private void processSingleFile(File f, LoaderStatistics stats, String[] primeFli if (tamrEnabled) { // post message on queue here. Dummy Code below: // todo : write send logic - List objectsToSend = processedMessages.getTamrPassengerSendObjectList(); - for (TamrPassengerSendObject tpso : objectsToSend) { + List objectsToSend = processedMessages.getTamrPassengers(); + for (TamrPassenger tpso : objectsToSend) { logger.info(tpso.toString()); } } diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java index b9885ace59..2b005e0f08 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java @@ -12,7 +12,7 @@ import gov.gtas.model.lookup.Airport; import gov.gtas.parsers.tamr.TamrAdapter; import gov.gtas.parsers.tamr.TamrAdapterImpl; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.vo.BagVo; import gov.gtas.repository.*; import org.apache.commons.lang3.StringUtils; @@ -134,9 +134,9 @@ public MessageInformation load(MessageDto msgDto) { apis.setPassengerCount(apis.getPassengers().size()); if (tamrEnabled) { TamrAdapter tamrAdapter = new TamrAdapterImpl(); - List tamrPassengerSendObjectList = tamrAdapter + List tamrPassengers = tamrAdapter .convert(apis.getFlights().iterator().next(), apis.getPassengers()); - messageInformation.setTamrPassengerSendObjects(tamrPassengerSendObjectList); + messageInformation.setTamrPassengers(tamrPassengers); } } catch (Exception e) { msgDto.getMessageStatus().setSuccess(false); diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java index 87dcde83fd..784ec9af8f 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java @@ -10,7 +10,7 @@ import java.util.*; import gov.gtas.model.MessageStatusEnum; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -102,7 +102,7 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { msgDto.setFilepath(filePath); rawMessages = msgDto.getRawMsgs(); List messageStatuses = new ArrayList<>(); - List tamrPassengerSendObjectList = new ArrayList<>(); + List tamrPassengers = new ArrayList<>(); for (String rawMessage : rawMessages) { msgDto.setRawMsg(rawMessage); MessageDto parsedMessageDto = svc.parse(msgDto); @@ -110,7 +110,7 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { MessageInformation messageInformation = svc.load(parsedMessageDto); MessageStatus messageStatus = messageInformation.getMessageStatus(); if (tamrEnabled) { - tamrPassengerSendObjectList.addAll(messageInformation.getTamrPassengerSendObjects()); + tamrPassengers.addAll(messageInformation.getTamrPassengers()); } messageStatuses.add(messageStatus); if (messageStatus.isSuccess()) { @@ -126,7 +126,7 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { ProcessedMessages processedMessages = new ProcessedMessages(); processedMessages.setProcessed(new int[] { successMsgCount, failedMsgCount }); processedMessages.setMessageStatusList(messageStatuses); - processedMessages.setTamrPassengerSendObjectList(tamrPassengerSendObjectList); + processedMessages.setTamrPassengers(tamrPassengers); return processedMessages; } diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java index c657335b82..875f9b6a8d 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java @@ -9,7 +9,7 @@ package gov.gtas.services; import gov.gtas.model.MessageStatus; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import java.util.List; @@ -17,7 +17,7 @@ public class MessageInformation { MessageStatus messageStatus; - private List tamrPassengerSendObjects; + private List tamrPassengers; public MessageStatus getMessageStatus() { return messageStatus; @@ -27,11 +27,11 @@ public void setMessageStatus(MessageStatus messageStatus) { this.messageStatus = messageStatus; } - public void setTamrPassengerSendObjects(List tamrPassengerSendObjects) { - this.tamrPassengerSendObjects = tamrPassengerSendObjects; + public void setTamrPassengers(List tamrPassengerSendObjects) { + this.tamrPassengers = tamrPassengerSendObjects; } - public List getTamrPassengerSendObjects() { - return tamrPassengerSendObjects; + public List getTamrPassengers() { + return tamrPassengers; } } diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java index 1784002a5b..8852652cc6 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java @@ -17,7 +17,7 @@ import gov.gtas.model.*; import gov.gtas.parsers.tamr.TamrAdapter; import gov.gtas.parsers.tamr.TamrAdapterImpl; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.vo.*; import gov.gtas.repository.*; import org.apache.commons.collections4.CollectionUtils; @@ -153,9 +153,9 @@ public MessageInformation load(MessageDto msgDto) { pnr.setTripType(tripType.toString()); if (tamrEnabled) { TamrAdapter tamrAdapter = new TamrAdapterImpl(); - List tamrPassengerSendObjectList = tamrAdapter + List tamrPassengers = tamrAdapter .convert(pnr.getFlights().iterator().next(), pnr.getPassengers()); - messageInformation.setTamrPassengerSendObjects(tamrPassengerSendObjectList); + messageInformation.setTamrPassengers(tamrPassengers); } } catch (Exception e) { msgDto.getMessageStatus().setMessageStatusEnum(MessageStatusEnum.FAILED_LOADING); diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java index d265106028..fc4aaca218 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java @@ -1,14 +1,14 @@ package gov.gtas.services; import gov.gtas.model.MessageStatus; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import java.util.List; public class ProcessedMessages { private int[] processed; private List messageStatusList; - private List tamrPassengerSendObjectList; + private List tamrPassengers; public int[] getProcessed() { return processed; } @@ -25,11 +25,11 @@ public void setMessageStatusList(List messageStatusList) { this.messageStatusList = messageStatusList; } - public List getTamrPassengerSendObjectList() { - return tamrPassengerSendObjectList; + public List getTamrPassengers() { + return tamrPassengers; } - public void setTamrPassengerSendObjectList(List tamrPassengerSendObjectList) { - this.tamrPassengerSendObjectList = tamrPassengerSendObjectList; + public void setTamrPassengers(List tamrPassengers) { + this.tamrPassengers = tamrPassengers; } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java index 0febcdb787..7b117e7bba 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java @@ -10,11 +10,11 @@ import gov.gtas.model.Flight; import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import java.util.List; import java.util.Set; public interface TamrAdapter { - List convert(Flight flight, Set passengers); + List convert(Flight flight, Set passengers); } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java index e02b76c008..3da4b78cd4 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java @@ -8,71 +8,66 @@ package gov.gtas.parsers.tamr; -import gov.gtas.model.Document; -import gov.gtas.model.Flight; -import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.model.TamrDocumentSendObject; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; - import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; + +import gov.gtas.model.Document; +import gov.gtas.model.Flight; +import gov.gtas.model.Passenger; +import gov.gtas.model.PassengerDetails; +import gov.gtas.parsers.tamr.model.TamrDocument; +import gov.gtas.parsers.tamr.model.TamrPassenger; +import gov.gtas.services.FlightService; public class TamrAdapterImpl implements TamrAdapter { + @Autowired + FlightService flightService; + @Override - public List convert(Flight flight, Set passengers) { - List tamrPassengers = new ArrayList(); - for (Passenger passenger : passengers) { - // per passenger convert to tamrPax - TamrPassengerSendObject tamrPax = convertPassengerToTamrPassenger(flight, passenger); - // get docs from passengers - for (Document doc : passenger.getDocuments()) { - // add tamrDoc to tamrPax doc list - tamrPax.getDocuments().add(convertDocumentToTamrDocument(doc)); - } - tamrPassengers.add(tamrPax); - } - return tamrPassengers; + public List convert(Flight flight, Set passengers) { + return passengers.stream() + .map(passenger -> + convertPassengerToTamrPassenger(flight, passenger)) + .collect(Collectors.toList()); } - private TamrPassengerSendObject convertPassengerToTamrPassenger(Flight flight, Passenger passenger) { - TamrPassengerSendObject tamrPax = new TamrPassengerSendObject(); - // initializing doc list - List docs = new ArrayList<>(); - tamrPax.setDocuments(docs); - - // flight related - tamrPax.setAPIS_ARVL_APRT_CD(flight.getDestination()); - tamrPax.setAPIS_DPRTR_APRT_CD(flight.getOrigin()); - tamrPax.setETA_DT(flight.getMutableFlightDetails().getEta()); - tamrPax.setIATA_CARR_CD(flight.getCarrier()); - tamrPax.setFLIT_NBR(flight.getFullFlightNumber()); - - // pax related - List nationalities = new ArrayList<>(); - nationalities.add(passenger.getPassengerDetails().getNationality()); - tamrPax.setNATIONALITY_CD(nationalities); - tamrPax.setDOB_Date(passenger.getPassengerDetails().getDob()); - tamrPax.setFirst_name(passenger.getPassengerDetails().getFirstName()); - tamrPax.setGNDR_CD(passenger.getPassengerDetails().getGender()); - tamrPax.setGtasId(passenger.getId().toString()); - tamrPax.setLast_name(passenger.getPassengerDetails().getLastName()); + private TamrPassenger convertPassengerToTamrPassenger(Flight flight, Passenger passenger) { + TamrPassenger tamrPassenger = new TamrPassenger(); - // temp values - tamrPax.setUid(""); - tamrPax.setFlt("test"); + // Basic passenger information + PassengerDetails passengerDetails = passenger.getPassengerDetails(); + tamrPassenger.setGtasId(passenger.getId().toString()); + tamrPassenger.setFirstName(passengerDetails.getFirstName()); + tamrPassenger.setMiddleName(passengerDetails.getMiddleName()); + tamrPassenger.setLastName(passengerDetails.getLastName()); + tamrPassenger.setGender(passengerDetails.getGender()); + tamrPassenger.setDob(passengerDetails.getDob()); + + // Convert documents + tamrPassenger.setDocuments(passenger.getDocuments().stream() + .map(document -> convertDocumentToTamrDocument(document)) + .collect(Collectors.toList())); + + // Nationalities (only one in GTAS) + tamrPassenger.setCitizenshipCountry(Collections + .singletonList(passengerDetails.getNationality())); - return tamrPax; + return tamrPassenger; } - private TamrDocumentSendObject convertDocumentToTamrDocument(Document doc) { - TamrDocumentSendObject tamrDoc = new TamrDocumentSendObject(); + private TamrDocument convertDocumentToTamrDocument(Document document) { + TamrDocument tamrDocument = new TamrDocument(); - tamrDoc.setDOC_CTRY_CD(doc.getIssuanceCountry()); - tamrDoc.setDOC_ID(doc.getDocumentNumber()); - tamrDoc.setDOC_TYP_NM(doc.getDocumentType()); + tamrDocument.setDocumentId(document.getDocumentNumber()); + tamrDocument.setDocumentType(document.getDocumentType()); + tamrDocument.setDocumentIssuingCountry(document.getIssuanceCountry()); - return tamrDoc; + return tamrDocument; } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java deleted file mode 100644 index 808b56a7e7..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr; - -import java.util.List; -import java.util.Set; - -import org.springframework.stereotype.Service; -import gov.gtas.model.Flight; -import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; - -@Service -public interface TamrConversionService { - - public List convertGTASFlightToTamrMessage(Flight flight); - - public List convertGTASFlightToTamrMessage(Set flights); - - public void sendPassengersToTamr(Set flights, Set passengers); -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java deleted file mode 100644 index b106487563..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import gov.gtas.model.Document; -import gov.gtas.model.Flight; -import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.jms.TamrMessageSender; -import gov.gtas.parsers.tamr.model.TamrDocumentSendObject; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; -import gov.gtas.repository.FlightRepository; -import gov.gtas.services.FlightService; - -@Component -public class TamrConversionServiceImpl implements TamrConversionService { - - @Autowired - FlightService fService; - - @Autowired - FlightRepository flightRepo; - - @Autowired - TamrMessageSender messageSender; - - static final Logger logger = LoggerFactory.getLogger(TamrConversionService.class); - - // Convenience method. Receives list of Flights to convert to send objects for - // batch dump uses other single flight method - public List convertGTASFlightToTamrMessage(Set flights) { - List passengers = new ArrayList(); - - for (Flight flight : flights) { - passengers.addAll(convertGTASFlightToTamrMessage(flight)); - } - - return passengers; - } - - public List convertGTASFlightToTamrMessage(Flight flight) { - List passengers = new ArrayList(); - - // get passengers from flight - for (Passenger passenger : fService.getAllPassengers(flight.getId())) { - // per passenger convert to tamrPax - TamrPassengerSendObject tamrPax = convertPassengerToTamrPassenger(flight, passenger); - // get docs from passengers - for (Document doc : passenger.getDocuments()) { - // add tamrDoc to tamrPax doc list - tamrPax.getDocuments().add(convertDocumentToTamrDocument(doc)); - } - } - return passengers; - } - - private List convertGTASFlightAndPassengersToTamrMessage(Flight flight, - Set passengers) { - List tamrPassengers = new ArrayList(); - for (Passenger passenger : passengers) { - // per passenger convert to tamrPax - TamrPassengerSendObject tamrPax = convertPassengerToTamrPassenger(flight, passenger); - // get docs from passengers - for (Document doc : passenger.getDocuments()) { - // add tamrDoc to tamrPax doc list - tamrPax.getDocuments().add(convertDocumentToTamrDocument(doc)); - } - tamrPassengers.add(tamrPax); - } - return tamrPassengers; - } - - private TamrPassengerSendObject convertPassengerToTamrPassenger(Flight flight, Passenger passenger) { - TamrPassengerSendObject tamrPax = new TamrPassengerSendObject(); - // initializing doc list - List docs = new ArrayList(); - tamrPax.setDocuments(docs); - - // flight related - tamrPax.setAPIS_ARVL_APRT_CD(flight.getDestination()); - tamrPax.setAPIS_DPRTR_APRT_CD(flight.getOrigin()); - tamrPax.setETA_DT(flight.getMutableFlightDetails().getEtaDate()); - tamrPax.setIATA_CARR_CD(flight.getCarrier()); - tamrPax.setFLIT_NBR(flight.getFullFlightNumber()); - - // pax related - List nationalities = new ArrayList(); - nationalities.add(passenger.getPassengerDetails().getNationality()); - tamrPax.setNATIONALITY_CD(nationalities); - tamrPax.setDOB_Date(passenger.getPassengerDetails().getDob()); - tamrPax.setFirst_name(passenger.getPassengerDetails().getFirstName()); - tamrPax.setGNDR_CD(passenger.getPassengerDetails().getGender()); - tamrPax.setGtasId(passenger.getId().toString()); - tamrPax.setLast_name(passenger.getPassengerDetails().getLastName()); - - // temp values - tamrPax.setUid(""); - tamrPax.setFlt("test"); - - return tamrPax; - } - - private TamrDocumentSendObject convertDocumentToTamrDocument(Document doc) { - TamrDocumentSendObject tamrDoc = new TamrDocumentSendObject(); - - tamrDoc.setDOC_CTRY_CD(doc.getIssuanceCountry()); - tamrDoc.setDOC_ID(doc.getDocumentNumber()); - tamrDoc.setDOC_TYP_NM(doc.getDocumentType()); - - return tamrDoc; - } - - private String convertGTASObjectToJson(List passengers) { - String tamrJSON = ""; - if (passengers != null && !passengers.isEmpty()) { - logger.debug("Converting model object to JSON String"); - logger.debug("Total number of passengers to convert: " + passengers.size()); - ObjectMapper mapper = new ObjectMapper(); - try { - tamrJSON = mapper.writeValueAsString(passengers); - } catch (JsonProcessingException e) { - logger.error("caught JsonProcessingException"); - } - } - return tamrJSON; - } - - @Override - public void sendPassengersToTamr(Set flights, Set passengers) { - List tamrPassengers = new ArrayList(); - for (Flight flight : flights) { - tamrPassengers.addAll(convertGTASFlightAndPassengersToTamrMessage(flight, passengers)); - } - String tamrJSON = convertGTASObjectToJson(tamrPassengers); - try { - // Commented out for commit, uncomment with new Tamr credentials if wanting to - // use. - // messageSender.sendMessageToTamr("InboundQueue", tamrJSON); - } catch (Exception e) { - logger.error("caught Exception"); - } - // System.out.println(tamrJSON); - } - -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java new file mode 100644 index 0000000000..65a43ab06e --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java @@ -0,0 +1,18 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +public class TamrDerogListEntry extends TamrPassenger { + private String derogId; + + public String getDerogId() { + return derogId; + } + + public void setDerogId(String derogId) { + this.derogId = derogId; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java new file mode 100644 index 0000000000..f99f7a57cf --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java @@ -0,0 +1,36 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +public class TamrDocument { + private String documentId; + private String documentType; + private String documentIssuingCountry; + + public String getDocumentId() { + return documentId; + } + + public void setDocumentId(String documentId) { + this.documentId = documentId; + } + + public String getDocumentType() { + return documentType; + } + + public void setDocumentType(String documentType) { + this.documentType = documentType; + } + + public String getDocumentIssuingCountry() { + return documentIssuingCountry; + } + + public void setDocumentIssuingCountry(String documentIssuingCountry) { + this.documentIssuingCountry = documentIssuingCountry; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java deleted file mode 100644 index 6fc9506dfb..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class TamrDocumentSendObject { - - @JsonProperty("DOC_CTRY_CD") - private String DOC_CTRY_CD; - - @JsonProperty("DOC_TYP_NM") - private String DOC_TYP_NM; - - @JsonProperty("DOC_ID") - private String DOC_ID; - - @JsonProperty("DOC_CTRY_CD") - public String getDOC_CTRY_CD() { - return DOC_CTRY_CD; - } - - public void setDOC_CTRY_CD(String dOC_CTRY_CD) { - DOC_CTRY_CD = dOC_CTRY_CD; - } - - @JsonProperty("DOC_TYP_NM") - public String getDOC_TYP_NM() { - return DOC_TYP_NM; - } - - public void setDOC_TYP_NM(String dOC_TYP_NM) { - DOC_TYP_NM = dOC_TYP_NM; - } - - @JsonProperty("DOC_ID") - public String getDOC_ID() { - return DOC_ID; - } - - public void setDOC_ID(String dOC_ID) { - DOC_ID = dOC_ID; - } - - @Override - public String toString() { - return "TamrDocumentSendObject{" + "DOC_CTRY_CD='" + DOC_CTRY_CD + '\'' + ", DOC_TYP_NM='" + DOC_TYP_NM + '\'' - + ", DOC_ID='" + DOC_ID + '\'' + '}'; - } -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java new file mode 100644 index 0000000000..9ff136c029 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java @@ -0,0 +1,89 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class TamrPassenger { + private String gtasId; + private String firstName; + private String middleName; + private String lastName; + private String gender; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date dob; + + private List documents; + private List citizenshipCountry; + + public String getGtasId() { + return gtasId; + } + + public void setGtasId(String gtasId) { + this.gtasId = gtasId; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getDob() { + return dob; + } + + public void setDob(Date dob) { + this.dob = dob; + } + + public List getDocuments() { + return documents; + } + + public void setDocuments(List documents) { + this.documents = documents; + } + + public List getCitizenshipCountry() { + return citizenshipCountry; + } + + public void setCitizenshipCountry(List citizenshipCountry) { + this.citizenshipCountry = citizenshipCountry; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java deleted file mode 100644 index b212a55c7a..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr.model; - -import java.util.Date; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class TamrPassengerSendObject { - - @JsonProperty("gtasId") - private String gtasId; - - @JsonProperty("first_name") - private String first_name; - - @JsonProperty("last_name") - private String last_name; - - @JsonProperty("Uid") - private String Uid; - - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - private Date ETA_DT; - - @JsonProperty("IATA_CARR_CD") - private String IATA_CARR_CD; - - @JsonProperty("FLIT_NBR") - private String FLIT_NBR; - - @JsonProperty("flt") - private String flt; - - @JsonProperty("APIS_DPRTR_APRT_CD") - private String APIS_DPRTR_APRT_CD; - - @JsonProperty("APIS_ARVL_APRT_CD") - private String APIS_ARVL_APRT_CD; - - @JsonProperty("NATIONALITY_CD") - private List NATIONALITY_CD; - - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - private Date DOB_Date; - - @JsonProperty("GNDR_CD") - private String GNDR_CD; - - @JsonProperty("documents") - private List documents; - - public String getGtasId() { - return gtasId; - } - - public void setGtasId(String gtasId) { - this.gtasId = gtasId; - } - - public String getFirst_name() { - return first_name; - } - - public void setFirst_name(String first_name) { - this.first_name = first_name; - } - - public String getLast_name() { - return last_name; - } - - public void setLast_name(String last_name) { - this.last_name = last_name; - } - - @JsonProperty("Uid") - public String getUid() { - return Uid; - } - - public void setUid(String uid) { - Uid = uid; - } - - @JsonProperty("ETA_DT") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - public Date getETA_DT() { - return ETA_DT; - } - - public void setETA_DT(Date eTA_DT) { - ETA_DT = eTA_DT; - } - - @JsonProperty("IATA_CARR_CD") - public String getIATA_CARR_CD() { - return IATA_CARR_CD; - } - - public void setIATA_CARR_CD(String iATA_CARR_CD) { - IATA_CARR_CD = iATA_CARR_CD; - } - - @JsonProperty("FLIT_NBR") - public String getFLIT_NBR() { - return FLIT_NBR; - } - - public void setFLIT_NBR(String fLIT_NBR) { - FLIT_NBR = fLIT_NBR; - } - - @JsonProperty("flt") - public String getFlt() { - return flt; - } - - public void setFlt(String flt) { - this.flt = flt; - } - - @JsonProperty("APIS_DPRTR_APRT_CD") - public String getAPIS_DPRTR_APRT_CD() { - return APIS_DPRTR_APRT_CD; - } - - public void setAPIS_DPRTR_APRT_CD(String aPIS_DPRTR_APRT_CD) { - APIS_DPRTR_APRT_CD = aPIS_DPRTR_APRT_CD; - } - - @JsonProperty("APIS_ARVL_APRT_CD") - public String getAPIS_ARVL_APRT_CD() { - return APIS_ARVL_APRT_CD; - } - - public void setAPIS_ARVL_APRT_CD(String aPIS_ARVL_APRT_CD) { - APIS_ARVL_APRT_CD = aPIS_ARVL_APRT_CD; - } - - @JsonProperty("NATIONALITY_CD") - public List getNATIONALITY_CD() { - return NATIONALITY_CD; - } - - public void setNATIONALITY_CD(List NATIONALITY_CD) { - this.NATIONALITY_CD = NATIONALITY_CD; - } - - @JsonProperty("DOB_Date") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - public Date getDOB_Date() { - return DOB_Date; - } - - public void setDOB_Date(Date date) { - DOB_Date = date; - } - - @JsonProperty("GNDR_CD") - public String getGNDR_CD() { - return GNDR_CD; - } - - public void setGNDR_CD(String gNDR_CD) { - GNDR_CD = gNDR_CD; - } - - @JsonProperty("documents") - public List getDocuments() { - return documents; - } - - public void setDocuments(List documents) { - this.documents = documents; - } - - @Override - public String toString() { - return "TamrPassengerSendObject{" + "gtasId='" + gtasId + '\'' + ", first_name='" + first_name + '\'' - + ", last_name='" + last_name + '\'' + ", Uid='" + Uid + '\'' + ", ETA_DT=" + ETA_DT - + ", IATA_CARR_CD='" + IATA_CARR_CD + '\'' + ", FLIT_NBR='" + FLIT_NBR + '\'' + ", flt='" + flt + '\'' - + ", APIS_DPRTR_APRT_CD='" + APIS_DPRTR_APRT_CD + '\'' + ", APIS_ARVL_APRT_CD='" + APIS_ARVL_APRT_CD - + '\'' + ", NATIONALITY_CD=" + NATIONALITY_CD + ", DOB_Date=" + DOB_Date + ", GNDR_CD='" + GNDR_CD - + '\'' + ", documents=" + documents + '}'; - } -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java new file mode 100644 index 0000000000..0694143ab7 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java @@ -0,0 +1,28 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +public class TamrQuery { + private List passengers; + + public TamrQuery() { + } + + public TamrQuery(List passengers) { + this.passengers = passengers; + } + + public List getPassengers() { + return passengers; + } + + public void setPassengers(List passengers) { + this.passengers = passengers; + } + +} diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index 5e3582cbd8..6729e8f3eb 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -10,7 +10,6 @@ import javax.jms.TextMessage; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.springframework.test.util.ReflectionTestUtils; diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java index 02c5be5ea3..e93a7de20b 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java @@ -8,16 +8,29 @@ package gov.gtas.parsers.tamr; -import gov.gtas.model.*; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import static java.time.ZoneOffset.UTC; + +import java.time.LocalDate; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.time.LocalDate; -import java.util.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; -import static java.time.ZoneOffset.UTC; +import gov.gtas.model.Document; +import gov.gtas.model.Flight; +import gov.gtas.model.MutableFlightDetails; +import gov.gtas.model.Passenger; +import gov.gtas.model.PassengerDetails; +import gov.gtas.parsers.tamr.model.TamrPassenger; +import gov.gtas.parsers.tamr.model.TamrQuery; public class TamrAdapterImplTest { @@ -62,6 +75,7 @@ public void setUp() { d.setDocumentNumber("123123123"); d.setDocumentType("P"); d.setIssuanceCountry("USA"); + documentSet.add(d); p.setDocuments(documentSet); testFlight = flight; @@ -71,16 +85,27 @@ public void setUp() { @Test public void tamrConversionTest() { TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); - List tamrPassengerSendObjectList = tamrAdapter.convert(testFlight, - Collections.singleton(testPassenger)); - TamrPassengerSendObject tpso = tamrPassengerSendObjectList.get(0); - Assert.assertEquals(birthDateTest, tpso.getDOB_Date()); - Assert.assertEquals("WALLY", tpso.getFirst_name()); - Assert.assertEquals(etaTestDate, tpso.getETA_DT()); - Assert.assertEquals("IAD", tpso.getAPIS_ARVL_APRT_CD()); - Assert.assertEquals("ABC", tpso.getAPIS_DPRTR_APRT_CD()); - Assert.assertEquals("M", tpso.getGNDR_CD()); - Assert.assertEquals("5", tpso.getGtasId()); - Assert.assertEquals("HUND", tpso.getLast_name()); + List tamrPassengers = tamrAdapter.convert( + testFlight, Collections.singleton(testPassenger)); + TamrPassenger tamrPassenger = tamrPassengers.get(0); + Assert.assertEquals(birthDateTest, tamrPassenger.getDob()); + Assert.assertEquals("WALLY", tamrPassenger.getFirstName()); + Assert.assertEquals("5", tamrPassenger.getGtasId()); + Assert.assertEquals("HUND", tamrPassenger.getLastName()); + } + + @Test + public void jsonConversionTest() throws JsonProcessingException { + TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); + List tamrPassengers = tamrAdapter.convert( + testFlight, Collections.singleton(testPassenger)); + TamrQuery tamrQuery = new TamrQuery(tamrPassengers); + + ObjectMapper mapper = new ObjectMapper(); + String tamrQueryJson = mapper.writer() + .writeValueAsString(tamrQuery); + + Assert.assertEquals("{\"passengers\":[{\"gtasId\":\"5\",\"firstName\":\"WALLY\",\"middleName\":null,\"lastName\":\"HUND\",\"gender\":\"M\",\"dob\":\"1988-04-24\",\"documents\":[{\"documentId\":\"123123123\",\"documentType\":\"P\",\"documentIssuingCountry\":\"USA\"}],\"citizenshipCountry\":[\"USA\"]}]}", + tamrQueryJson); } } From 350bc795fc1d993ac68ec3d118b9da400ff42eb0 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 27 Jan 2020 18:59:08 -0500 Subject: [PATCH 22/83] Began method to convert watchlist items to Tamr derog list entries --- .../gov/gtas/services/ApisMessageService.java | 2 +- .../gov/gtas/services/PnrMessageService.java | 2 +- .../gov/gtas/parsers/tamr/TamrAdapter.java | 13 +++++-- .../gtas/parsers/tamr/TamrAdapterImpl.java | 38 ++++++++++++++++++- .../parsers/tamr/TamrAdapterImplTest.java | 8 ++-- 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java index 2b005e0f08..2d8795fe42 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java @@ -135,7 +135,7 @@ public MessageInformation load(MessageDto msgDto) { if (tamrEnabled) { TamrAdapter tamrAdapter = new TamrAdapterImpl(); List tamrPassengers = tamrAdapter - .convert(apis.getFlights().iterator().next(), apis.getPassengers()); + .convertPassengers(apis.getFlights().iterator().next(), apis.getPassengers()); messageInformation.setTamrPassengers(tamrPassengers); } } catch (Exception e) { diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java index 8852652cc6..5eda3ba65d 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java @@ -154,7 +154,7 @@ public MessageInformation load(MessageDto msgDto) { if (tamrEnabled) { TamrAdapter tamrAdapter = new TamrAdapterImpl(); List tamrPassengers = tamrAdapter - .convert(pnr.getFlights().iterator().next(), pnr.getPassengers()); + .convertPassengers(pnr.getFlights().iterator().next(), pnr.getPassengers()); messageInformation.setTamrPassengers(tamrPassengers); } } catch (Exception e) { diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java index 7b117e7bba..d4f322fed5 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java @@ -8,13 +8,18 @@ package gov.gtas.parsers.tamr; +import java.util.Collection; +import java.util.List; +import java.util.Set; + import gov.gtas.model.Flight; import gov.gtas.model.Passenger; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.model.TamrDerogListEntry; import gov.gtas.parsers.tamr.model.TamrPassenger; -import java.util.List; -import java.util.Set; - public interface TamrAdapter { - List convert(Flight flight, Set passengers); + List convertPassengers(Flight flight, Set passengers); + + List convertWatchlist(Collection watchlistItems); } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java index 3da4b78cd4..8d40511ed1 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java @@ -8,7 +8,7 @@ package gov.gtas.parsers.tamr; -import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; @@ -20,6 +20,8 @@ import gov.gtas.model.Flight; import gov.gtas.model.Passenger; import gov.gtas.model.PassengerDetails; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.model.TamrDerogListEntry; import gov.gtas.parsers.tamr.model.TamrDocument; import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.services.FlightService; @@ -30,7 +32,8 @@ public class TamrAdapterImpl implements TamrAdapter { FlightService flightService; @Override - public List convert(Flight flight, Set passengers) { + public List convertPassengers( + Flight flight, Set passengers) { return passengers.stream() .map(passenger -> convertPassengerToTamrPassenger(flight, passenger)) @@ -70,4 +73,35 @@ private TamrDocument convertDocumentToTamrDocument(Document document) { return tamrDocument; } + + @Override + public List convertWatchlist(Collection watchlistItems) { + return watchlistItems.stream() + .map(watchlistItem -> + convertWatchlistItemToTamrDerogListEntry(watchlistItem)) + .filter(derogListEntry -> derogListEntry != null) + .collect(Collectors.toList()); + } + + /** + * Convert a GTAS watchlist item to a derog entry that can be sent to + * Tamr. This may return null for some watchlist items that should not + * be sent to Tamr. + */ + private TamrDerogListEntry convertWatchlistItemToTamrDerogListEntry( + WatchlistItem watchlistItem) { + // TODO: finish implementation. + + TamrDerogListEntry derogListEntry = new TamrDerogListEntry(); + + // We set both gtasId and derogId to the watchlist item ID from + // GTAS. Tamr can merge multiple derog list entries with the same + // derogId, but we don't use that functionality yet. + String itemIdStr = Long.toString(watchlistItem.getId()); + derogListEntry.setGtasId(itemIdStr); + derogListEntry.setDerogId(itemIdStr); + + return derogListEntry; + + } } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java index e93a7de20b..5d42662622 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java @@ -83,9 +83,9 @@ public void setUp() { } @Test - public void tamrConversionTest() { + public void passengerConversionTest() { TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); - List tamrPassengers = tamrAdapter.convert( + List tamrPassengers = tamrAdapter.convertPassengers( testFlight, Collections.singleton(testPassenger)); TamrPassenger tamrPassenger = tamrPassengers.get(0); Assert.assertEquals(birthDateTest, tamrPassenger.getDob()); @@ -95,9 +95,9 @@ public void tamrConversionTest() { } @Test - public void jsonConversionTest() throws JsonProcessingException { + public void passengerJsonConversionTest() throws JsonProcessingException { TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); - List tamrPassengers = tamrAdapter.convert( + List tamrPassengers = tamrAdapter.convertPassengers( testFlight, Collections.singleton(testPassenger)); TamrQuery tamrQuery = new TamrQuery(tamrPassengers); From 942a17ae11585014b4a6b19a86cd49c96464a8c2 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 27 Jan 2020 20:00:14 -0500 Subject: [PATCH 23/83] Finish method and tests for JSON serialization of watchlist items to send to Tamr --- .../gtas/parsers/tamr/TamrAdapterImpl.java | 69 ++++++- .../tamr/model/TamrDerogListUpdate.java | 29 +++ .../parsers/tamr/TamrAdapterImplTest.java | 172 +++++++++++------- 3 files changed, 202 insertions(+), 68 deletions(-) create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java index 8d40511ed1..bafc158f36 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java @@ -8,19 +8,29 @@ package gov.gtas.parsers.tamr; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import com.fasterxml.jackson.databind.ObjectMapper; + import gov.gtas.model.Document; import gov.gtas.model.Flight; import gov.gtas.model.Passenger; import gov.gtas.model.PassengerDetails; import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.model.watchlist.json.WatchlistItemSpec; +import gov.gtas.model.watchlist.json.WatchlistTerm; import gov.gtas.parsers.tamr.model.TamrDerogListEntry; import gov.gtas.parsers.tamr.model.TamrDocument; import gov.gtas.parsers.tamr.model.TamrPassenger; @@ -30,6 +40,10 @@ public class TamrAdapterImpl implements TamrAdapter { @Autowired FlightService flightService; + + private ObjectMapper mapper = new ObjectMapper(); + + private Logger logger = LoggerFactory.getLogger(TamrAdapterImpl.class); @Override public List convertPassengers( @@ -89,10 +103,59 @@ public List convertWatchlist(Collection watch * be sent to Tamr. */ private TamrDerogListEntry convertWatchlistItemToTamrDerogListEntry( - WatchlistItem watchlistItem) { - // TODO: finish implementation. - + WatchlistItem watchlistItem) { TamrDerogListEntry derogListEntry = new TamrDerogListEntry(); + + WatchlistItemSpec itemSpec; + try { + itemSpec = mapper.readValue(watchlistItem.getItemData(), + WatchlistItemSpec.class); + } catch (IOException e) { + logger.warn("Error parsing watchlist item data {}. Ignoring...", + watchlistItem.getItemData()); + return null; + } + + for (WatchlistTerm term: itemSpec.getTerms()) { + if(term.getField().equals("firstName")) { + derogListEntry.setFirstName(term.getValue()); + } else if (term.getField().equals("lastName")) { + derogListEntry.setLastName(term.getValue()); + } else if (term.getField().equals("dob")) { + try { + SimpleDateFormat parser = + new SimpleDateFormat("yyyy-MM-dd"); + derogListEntry.setDob(parser.parse(term.getValue())); + } catch (ParseException e) { + logger.warn("Unable to parse watchlist DOB {}. " + + "Ignoring...", term.getValue()); + } + } else if (term.getField().equals("documentType") || + term.getField().equals("documentNumber")) { + TamrDocument document; + if (derogListEntry.getDocuments() == null) { + document = new TamrDocument(); + derogListEntry.setDocuments( + Collections.singletonList(document)); + } else { + document = derogListEntry.getDocuments().get(0); + } + if (term.getField().equals("documentType")) { + document.setDocumentType(term.getValue()); + } else if (term.getField().equals("documentNumber")) { + document.setDocumentId(term.getValue()); + } + } else { + logger.warn("Unknown watchlist field \"{}\". Ignoring...", + term.getField()); + } + } + + if (derogListEntry.getLastName() == null) { + // We only add to the derog list entries where the last name + // at least is populated. + return null; + } // We set both gtasId and derogId to the watchlist item ID from // GTAS. Tamr can merge multiple derog list entries with the same diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java new file mode 100644 index 0000000000..5ef456fdf8 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java @@ -0,0 +1,29 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +public class TamrDerogListUpdate { + + private List passengers; + + public TamrDerogListUpdate() { + } + + public TamrDerogListUpdate(List passengers) { + this.passengers = passengers; + } + + public List getPassengers() { + return passengers; + } + + public void setPassengers(List passengers) { + this.passengers = passengers; + } + +} diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java index 5d42662622..22d4da6c50 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java @@ -9,16 +9,17 @@ package gov.gtas.parsers.tamr; import static java.time.ZoneOffset.UTC; +import static org.junit.Assert.*; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; -import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.core.JsonProcessingException; @@ -29,83 +30,124 @@ import gov.gtas.model.MutableFlightDetails; import gov.gtas.model.Passenger; import gov.gtas.model.PassengerDetails; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.model.TamrDerogListEntry; +import gov.gtas.parsers.tamr.model.TamrDerogListUpdate; import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.tamr.model.TamrQuery; public class TamrAdapterImplTest { - - Flight testFlight; - Passenger testPassenger; - LocalDate eta; - Date etaFlightDate; - Date etaTestDate; - LocalDate localBirthDate; - Date birthDate; - Date birthDateTest; - - @Before - public void setUp() { - eta = LocalDate.of(2020, 1, 24); - etaFlightDate = Date.from(eta.atStartOfDay(UTC).toInstant()); - etaTestDate = Date.from(eta.atStartOfDay(UTC).toInstant()); - localBirthDate = LocalDate.of(1988, 4, 24); - birthDate = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); - birthDateTest = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); - - Flight flight = new Flight(); - MutableFlightDetails mfd = new MutableFlightDetails(); - mfd.setEta(etaFlightDate); - flight.setDestination("IAD"); - flight.setOrigin("ABC"); - flight.setCarrier("WAL"); - flight.setFlightNumber("ABC123"); - flight.setMutableFlightDetails(mfd); - Passenger p = new Passenger(); - p.setId(5L); - PassengerDetails passengerDetails = new PassengerDetails(p); - p.setPassengerDetails(passengerDetails); - passengerDetails.setDob(birthDate); - passengerDetails.setNationality("USA"); - passengerDetails.setFirstName("WALLY"); - passengerDetails.setLastName("HUND"); - passengerDetails.setGender("M"); - Set documentSet = new HashSet<>(); - Document d = new Document(); - d.setId(1L); - d.setDocumentNumber("123123123"); - d.setDocumentType("P"); - d.setIssuanceCountry("USA"); - documentSet.add(d); - p.setDocuments(documentSet); - - testFlight = flight; - testPassenger = p; - } + private TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); @Test - public void passengerConversionTest() { - TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); + public void testPassengerConversion() throws JsonProcessingException { + LocalDate eta = LocalDate.of(2020, 1, 24); + Date etaFlightDate = Date.from(eta.atStartOfDay(UTC).toInstant()); + LocalDate localBirthDate = LocalDate.of(1988, 4, 24); + Date birthDate = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); + Date birthDateTest = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); + + Flight flight = new Flight(); + MutableFlightDetails mfd = new MutableFlightDetails(); + mfd.setEta(etaFlightDate); + flight.setDestination("IAD"); + flight.setOrigin("ABC"); + flight.setCarrier("WAL"); + flight.setFlightNumber("ABC123"); + flight.setMutableFlightDetails(mfd); + Passenger passenger = new Passenger(); + passenger.setId(5L); + PassengerDetails passengerDetails = new PassengerDetails(passenger); + passenger.setPassengerDetails(passengerDetails); + passengerDetails.setDob(birthDate); + passengerDetails.setNationality("USA"); + passengerDetails.setFirstName("WALLY"); + passengerDetails.setLastName("HUND"); + passengerDetails.setGender("M"); + Set documentSet = new HashSet<>(); + Document document = new Document(); + document.setId(1L); + document.setDocumentNumber("123123123"); + document.setDocumentType("P"); + document.setIssuanceCountry("USA"); + documentSet.add(document); + passenger.setDocuments(documentSet); + List tamrPassengers = tamrAdapter.convertPassengers( - testFlight, Collections.singleton(testPassenger)); + flight, Collections.singleton(passenger)); TamrPassenger tamrPassenger = tamrPassengers.get(0); - Assert.assertEquals(birthDateTest, tamrPassenger.getDob()); - Assert.assertEquals("WALLY", tamrPassenger.getFirstName()); - Assert.assertEquals("5", tamrPassenger.getGtasId()); - Assert.assertEquals("HUND", tamrPassenger.getLastName()); - } - - @Test - public void passengerJsonConversionTest() throws JsonProcessingException { - TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); - List tamrPassengers = tamrAdapter.convertPassengers( - testFlight, Collections.singleton(testPassenger)); + assertEquals(birthDateTest, tamrPassenger.getDob()); + assertEquals("WALLY", tamrPassenger.getFirstName()); + assertEquals("5", tamrPassenger.getGtasId()); + assertEquals("HUND", tamrPassenger.getLastName()); + TamrQuery tamrQuery = new TamrQuery(tamrPassengers); ObjectMapper mapper = new ObjectMapper(); String tamrQueryJson = mapper.writer() .writeValueAsString(tamrQuery); - Assert.assertEquals("{\"passengers\":[{\"gtasId\":\"5\",\"firstName\":\"WALLY\",\"middleName\":null,\"lastName\":\"HUND\",\"gender\":\"M\",\"dob\":\"1988-04-24\",\"documents\":[{\"documentId\":\"123123123\",\"documentType\":\"P\",\"documentIssuingCountry\":\"USA\"}],\"citizenshipCountry\":[\"USA\"]}]}", + assertEquals("{\"passengers\":[{\"gtasId\":\"5\",\"firstName\":\"WALLY\",\"middleName\":null,\"lastName\":\"HUND\",\"gender\":\"M\",\"dob\":\"1988-04-24\",\"documents\":[{\"documentId\":\"123123123\",\"documentType\":\"P\",\"documentIssuingCountry\":\"USA\"}],\"citizenshipCountry\":[\"USA\"]}]}", tamrQueryJson); } + + private static final String[] WATCHLIST_ITEMS = { + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"firstName\",\"type\":\"string\",\"value\":\"SHING\"},{\"field\":\"lastName\",\"type\":\"string\",\"value\":\"QUAN\"},{\"field\":\"dob\",\"type\":\"date\",\"value\":\"1998-08-08\"}]}", + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"documentType\",\"type\":\"string\",\"value\":\"P\"},{\"field\":\"documentNumber\",\"type\":\"string\",\"value\":\"221371771\"}]}", + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"firstName\",\"type\":\"string\",\"value\":\"FRIEDA\"},{\"field\":\"lastName\",\"type\":\"string\",\"value\":\"DARRINGTON\"},{\"field\":\"dob\",\"type\":\"date\",\"value\":\"1963-08-13\"}]}", + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"documentType\",\"type\":\"string\",\"value\":\"P\"},{\"field\":\"documentNumber\",\"type\":\"string\",\"value\":\"899294368\"}]}" + }; + + @Test + public void testWatchlistConversion() throws JsonProcessingException { + List watchlistItems = new ArrayList<>(); + for (int i = 0; i < WATCHLIST_ITEMS.length; i++) { + WatchlistItem watchlistItem = new WatchlistItem(); + watchlistItem.setItemData(WATCHLIST_ITEMS[i]); + watchlistItem.setId((long) i + 1); + watchlistItems.add(watchlistItem); + } + + List derogList = + tamrAdapter.convertWatchlist(watchlistItems); + + // Only 2 entries in the derog list, since document entries should + // be filtered out. + assertEquals(2, derogList.size()); + + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + TamrDerogListEntry entry = derogList.get(0); + assertEquals(entry.getFirstName(), "SHING"); + assertEquals(entry.getLastName(), "QUAN"); + calendar.set(1998, 7, 8); + assertEquals(calendar.getTime(), entry.getDob()); + assertNull(entry.getDocuments()); + + entry = derogList.get(1); + assertEquals(entry.getFirstName(), "FRIEDA"); + assertEquals(entry.getLastName(), "DARRINGTON"); + calendar.set(1963, 7, 13); + assertEquals(calendar.getTime(), entry.getDob()); + assertNull(entry.getDocuments()); + + TamrDerogListUpdate derogListUpdate = + new TamrDerogListUpdate(derogList); + + ObjectMapper mapper = new ObjectMapper(); + String derogListUpdateJson = mapper.writer() + .writeValueAsString(derogListUpdate); + + assertEquals( + "{\"passengers\":[" + + "{\"gtasId\":\"1\",\"firstName\":\"SHING\",\"middleName\":null,\"lastName\":\"QUAN\",\"gender\":null,\"dob\":\"1998-08-08\",\"documents\":null,\"citizenshipCountry\":null,\"derogId\":\"1\"}," + + "{\"gtasId\":\"3\",\"firstName\":\"FRIEDA\",\"middleName\":null,\"lastName\":\"DARRINGTON\",\"gender\":null,\"dob\":\"1963-08-13\",\"documents\":null,\"citizenshipCountry\":null,\"derogId\":\"3\"}" + + "]}", + derogListUpdateJson); + } + } From 8878e487bef071d6d5c2b607e29746ce3709af3c Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Tue, 28 Jan 2020 14:06:07 -0500 Subject: [PATCH 24/83] Make sure all fields are copied from PendingHitDetails to HitDetail instances --- .../src/main/java/gov/gtas/model/HitDetail.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java index 25ebd576bc..5c652a2d10 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/HitDetail.java @@ -210,14 +210,17 @@ public void setHitMakerId(Long hitMakerId) { public static HitDetail from(PendingHitDetails pendingHitDetails) { HitDetail hitDetail = new HitDetail(pendingHitDetails.getHitEnum()); - hitDetail.setHitType(pendingHitDetails.getHitEnum().toString()); + hitDetail.setFlightId(pendingHitDetails.getFlightId()); + hitDetail.setHitType(pendingHitDetails.getHitType()); + hitDetail.setHitEnum(pendingHitDetails.getHitEnum()); hitDetail.setPassengerId(pendingHitDetails.getPassengerId()); hitDetail.setHitMakerId(pendingHitDetails.getHitMakerId()); hitDetail.setRuleId(pendingHitDetails.getHitMakerId()); //Set as hitmaker Id - this field is typically based on drools hit. hitDetail.setDescription(pendingHitDetails.getDescription()); - hitDetail.setCreatedDate(new Date()); + hitDetail.setCreatedDate(pendingHitDetails.getCreatedDate()); hitDetail.setTitle(pendingHitDetails.getTitle()); hitDetail.setRuleConditions(pendingHitDetails.getRuleConditions()); + hitDetail.setPercentage(pendingHitDetails.getPercentage()); return hitDetail; } From 4a51cdb8cf3cd0c426711850b6a3f5632c1b90b7 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Tue, 28 Jan 2020 16:14:06 -0500 Subject: [PATCH 25/83] Use tamrId if configured and available in getBookingDetailHistoryByPaxID --- .../repository/BookingDetailRepository.java | 9 +++++++ .../gtas/services/PassengerServiceImpl.java | 24 ++++++++++++++++++- .../resources/default.application.properties | 4 ++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java index e7f2c59a15..a5f40daf6c 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java @@ -26,6 +26,15 @@ public interface BookingDetailRepository extends CrudRepository getBookingDetailsByPassengerIdTag(@Param("pax_id") Long pax_id); + @Query("SELECT pax FROM Passenger pax " + "left join fetch pax.passengerDetails " + + "left join fetch pax.bookingDetails " + "left join fetch pax.flightPaxList pfpl " + + "left join fetch pax.passengerTripDetails " + "left join fetch pfpl.flight " + + "left join fetch pfpl.passenger WHERE pax.id IN (" + + "SELECT pxtag.pax_id FROM PassengerIDTag pxtag WHERE " + + "pxtag.tamrId IN (SELECT p.tamrId FROM PassengerIDTag p WHERE p.pax_id = (:pax_id)) " + + "AND pxtag.tamrId IS NOT NULL)") + List getBookingDetailsByTamrId(@Param("pax_id") Long pax_id); + @Query("Select bd from BookingDetail bd " + "where bd.fullFlightNumber = :fullFlightNumber " + "and bd.destination = :destination " + "and bd.origin = :origin " + "and bd.etd = :etd " + "and bd.flight.id = :flightId") diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java index 0a1bf6a2fa..7f511e378a 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java @@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,6 +66,11 @@ public class PassengerServiceImpl implements PassengerService { @Autowired AppConfigurationService appConfigurationService; + @Value("${tamr.enabled}") + boolean tamrEnabled; + @Value("${tamr.resolve_passenger_history}") + boolean tamrResolvePassengerHistory; + @Override @Transactional public Passenger create(Passenger passenger) { @@ -214,7 +220,23 @@ public List getTravelHistoryNotByItinerary(Long paxId, Long pnrId, Strin @Override @Transactional public List getBookingDetailHistoryByPaxID(Long pId) { - return bookingDetailRepository.getBookingDetailsByPassengerIdTag(pId); + List tamrIdMatches; + if (tamrEnabled && tamrResolvePassengerHistory) { + tamrIdMatches = + bookingDetailRepository.getBookingDetailsByTamrId(pId); + } else { + tamrIdMatches = Collections.emptyList(); + } + + if (tamrIdMatches.size() > 0) { + return tamrIdMatches; + } else { + // If there are no tamrId matches, this means the tamrId must be + // NULL or Tamr history resolving is disabled. In that case, just + // do normal matching. + return bookingDetailRepository + .getBookingDetailsByPassengerIdTag(pId); + } } @Override diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index ea34633603..1d7d95e8ea 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -180,3 +180,7 @@ elastic.ssl.enabled=true ######### Tamr Integration ######### tamr.enabled=false tamr.activemq.broker.url=tcp://localhost:61616 +# If Tamr is enabled, this option will toggle prefential resolving of a +# passenger's travel history based on their cluster ID from Tamr. +# If tamr.enabled is false, this has no effect. +tamr.resolve_passenger_history=true From 01d21fd837790cbb7af3341c99be2310cb8c2a93 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Tue, 28 Jan 2020 16:14:33 -0500 Subject: [PATCH 26/83] Remove unused PassengerResolverService (all functionality is implemented in PassengerService.getBookingDetailHistoryByPaxID) --- .../services/PassengerResolverService.java | 8 ----- .../PassengerResolverServiceImpl.java | 35 ------------------- 2 files changed, 43 deletions(-) delete mode 100644 gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverService.java delete mode 100644 gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverServiceImpl.java diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverService.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverService.java deleted file mode 100644 index 06089413ce..0000000000 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverService.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.gtas.services; - -import java.util.List; - -public interface PassengerResolverService { - - List resolve(Long pax_id); -} diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverServiceImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverServiceImpl.java deleted file mode 100644 index 8308080581..0000000000 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerResolverServiceImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package gov.gtas.services; - -import java.util.Collections; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import gov.gtas.model.PassengerIDTag; -import gov.gtas.repository.PassengerIDTagRepository; - -@Service -public class PassengerResolverServiceImpl implements PassengerResolverService { - - @Autowired - private PassengerIDTagRepository passengerIDTagRepository; - - @Override - public List resolve(Long pax_id) { - // - PassengerIDTag idTag = this.passengerIDTagRepository.findByPaxId(pax_id); - - if (idTag != null && idTag.getTamrId() != null) { - // - return this.passengerIDTagRepository.findPaxIdsByTamrId(idTag.getTamrId()); - } else { - // Edge case - passenger failed to create pax id. - if (idTag == null || idTag.getIdTag() == null) { - return Collections.singletonList(pax_id); - } - return this.passengerIDTagRepository.findPaxIdsByTagId(idTag.getIdTag()); - } - } - -} From 99191ab38347baa02d68959015389824a27bc57a Mon Sep 17 00:00:00 2001 From: Aaron Solomon Date: Mon, 27 Jan 2020 11:55:23 -0500 Subject: [PATCH 27/83] updating loader to call sender updating TamrMessageSender to use JMS adding send config for QueueConfig updated return type to ActiveMQConnectionFactory activated ConditionalOnProperty fixed typos in single file processing coe synced exception throwing caught processing error in loaderscheduler fixed semicolon typos in scheduler moved exception throwing calls within try catch block adding service tag added service searches full space for config searches full space annotations updating message sender nomencalture isolated accurate name removed conditional settings temp removed conditional[ adding logging messages forcing tamr enablement updated loader testing for tamr object length testing size created more conservatie job scheduler using tamr enabled Handle QUERY history responses and TH.DELTA/TH.CLUSTER messages, persisting new Tamr IDs to database Remove resolved TODO Update Tamr query objects to correct format for JSON serialization, and rename TamrPassengerSendObject to TamrPassenger Began method to convert watchlist items to Tamr derog list entries loader loader cleanup migrating to passengers removing pass object Finish method and tests for JSON serialization of watchlist items to send to Tamr Handle Tamr derog hits by adding hits to the pending_hits table Add additional tests for handling Tamr derog messages when derogId/gtasId are invalid added json parsing added semi colon import List import flight removes flight and Pass instead of TamrPassengers push to inbound queue --- copy.sh | 3 + .../gtas/job/scheduler/LoaderScheduler.java | 29 ++- .../gov/gtas/services/ApisMessageService.java | 8 +- .../main/java/gov/gtas/services/Loader.java | 8 +- .../gov/gtas/services/MessageInformation.java | 12 +- .../gov/gtas/services/PnrMessageService.java | 8 +- .../gov/gtas/services/ProcessedMessages.java | 12 +- .../gov/gtas/parsers/tamr/TamrAdapter.java | 15 +- .../gtas/parsers/tamr/TamrAdapterImpl.java | 194 ++++++++++++----- .../parsers/tamr/TamrConversionService.java | 24 --- .../tamr/TamrConversionServiceImpl.java | 160 -------------- .../tamr/TamrMessageHandlerServiceImpl.java | 120 ++++++++++- .../parsers/tamr/jms/TamrMessageSender.java | 32 ++- .../parsers/tamr/jms/TamrQueueConfig.java | 22 +- .../tamr/model/TamrDerogListEntry.java | 18 ++ .../tamr/model/TamrDerogListUpdate.java | 29 +++ .../gtas/parsers/tamr/model/TamrDocument.java | 36 ++++ .../tamr/model/TamrDocumentSendObject.java | 53 ----- .../parsers/tamr/model/TamrPassenger.java | 89 ++++++++ .../tamr/model/TamrPassengerSendObject.java | 192 ----------------- .../gtas/parsers/tamr/model/TamrQuery.java | 28 +++ .../parsers/tamr/HandleTamrDerogHitsTest.java | 150 ++++++++++++++ .../parsers/tamr/ReceiveTamrMessagesTest.java | 1 - .../parsers/tamr/TamrAdapterImplTest.java | 195 ++++++++++++------ .../gtas/parsers/tamr/UpdateTamrIdTest.java | 116 +++++++++++ 25 files changed, 961 insertions(+), 593 deletions(-) create mode 100755 copy.sh delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java delete mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java diff --git a/copy.sh b/copy.sh new file mode 100755 index 0000000000..b3f1488ab2 --- /dev/null +++ b/copy.sh @@ -0,0 +1,3 @@ +fswatch -o gtas-parent | while read f; do + rsync -avz -e ssh --exclude="target/" --exclude="node_modules/" --prune-empty-dirs gtas-parent 10.20.0.147:/home/aaronsolomon/gtas/GTAS +done \ No newline at end of file diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index c9514b92b7..e55c32ad43 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -16,12 +16,18 @@ import gov.gtas.json.AuditActionData; import gov.gtas.json.AuditActionTarget; import gov.gtas.model.MessageStatus; +<<<<<<< HEAD import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.jms.TamrMessageSender; +======= +import gov.gtas.parsers.tamr.model.TamrPassenger; +>>>>>>> 2d163024... Update Tamr query objects to correct format for JSON serialization, and rename TamrPassengerSendObject to TamrPassenger import gov.gtas.repository.MessageStatusRepository; import gov.gtas.services.*; import gov.gtas.services.matcher.MatchingService; import gov.gtas.svc.TargetingService; + import java.io.File; import java.util.Date; import java.util.List; @@ -77,6 +83,9 @@ public String toString() { @Autowired private MessageStatusRepository messageStatusRepository; + @Autowired + private TamrMessageSender tamrMessageSender; + @Value("${message.dir.processed}") private String messageProcessedDir; @@ -95,20 +104,18 @@ public String toString() { @Value("${tamr.enabled}") private Boolean tamrEnabled; - private void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) { + private void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) throws Exception { logger.debug(String.format("Processing %s", f.getAbsolutePath())); ProcessedMessages processedMessages = loader.processMessage(f, primeFlightKey); int[] result = processedMessages.getProcessed(); List messageStatusList = processedMessages.getMessageStatusList(); messageStatusRepository.saveAll(messageStatusList); + if (tamrEnabled) { - // post message on queue here. Dummy Code below: - // todo : write send logic - List objectsToSend = processedMessages.getTamrPassengerSendObjectList(); - for (TamrPassengerSendObject tpso : objectsToSend) { - logger.info(tpso.toString()); - } + List passToSend = processedMessages.getTamrPassengers(); + logger.info(String.valueOf(passToSend.size())); + tamrMessageSender.sendMessageToTamr("Inbound", passToSend); } if (result != null) { @@ -126,8 +133,12 @@ public void receiveMessage(String text, String fileName, String[] primeFlightKey logger.debug("MESSAGE RECEIVED FROM QUEUE: " + messageWorkingDir + File.separator + fileName); File f = new File(messageWorkingDir + File.separator + fileName); - processSingleFile(f, stats, primeFlightKey); - saveProcessedFile(f); + try { + processSingleFile(f, stats, primeFlightKey); + saveProcessedFile(f); + } catch (Exception ex) { + logger.error("Unable to process file!"); + } } // Moves the file from the working dir to the processed, returns true on diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java index b9885ace59..2d8795fe42 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java @@ -12,7 +12,7 @@ import gov.gtas.model.lookup.Airport; import gov.gtas.parsers.tamr.TamrAdapter; import gov.gtas.parsers.tamr.TamrAdapterImpl; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.vo.BagVo; import gov.gtas.repository.*; import org.apache.commons.lang3.StringUtils; @@ -134,9 +134,9 @@ public MessageInformation load(MessageDto msgDto) { apis.setPassengerCount(apis.getPassengers().size()); if (tamrEnabled) { TamrAdapter tamrAdapter = new TamrAdapterImpl(); - List tamrPassengerSendObjectList = tamrAdapter - .convert(apis.getFlights().iterator().next(), apis.getPassengers()); - messageInformation.setTamrPassengerSendObjects(tamrPassengerSendObjectList); + List tamrPassengers = tamrAdapter + .convertPassengers(apis.getFlights().iterator().next(), apis.getPassengers()); + messageInformation.setTamrPassengers(tamrPassengers); } } catch (Exception e) { msgDto.getMessageStatus().setSuccess(false); diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java index 87dcde83fd..784ec9af8f 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/Loader.java @@ -10,7 +10,7 @@ import java.util.*; import gov.gtas.model.MessageStatusEnum; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -102,7 +102,7 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { msgDto.setFilepath(filePath); rawMessages = msgDto.getRawMsgs(); List messageStatuses = new ArrayList<>(); - List tamrPassengerSendObjectList = new ArrayList<>(); + List tamrPassengers = new ArrayList<>(); for (String rawMessage : rawMessages) { msgDto.setRawMsg(rawMessage); MessageDto parsedMessageDto = svc.parse(msgDto); @@ -110,7 +110,7 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { MessageInformation messageInformation = svc.load(parsedMessageDto); MessageStatus messageStatus = messageInformation.getMessageStatus(); if (tamrEnabled) { - tamrPassengerSendObjectList.addAll(messageInformation.getTamrPassengerSendObjects()); + tamrPassengers.addAll(messageInformation.getTamrPassengers()); } messageStatuses.add(messageStatus); if (messageStatus.isSuccess()) { @@ -126,7 +126,7 @@ public ProcessedMessages processMessage(File f, String[] primeFlightKey) { ProcessedMessages processedMessages = new ProcessedMessages(); processedMessages.setProcessed(new int[] { successMsgCount, failedMsgCount }); processedMessages.setMessageStatusList(messageStatuses); - processedMessages.setTamrPassengerSendObjectList(tamrPassengerSendObjectList); + processedMessages.setTamrPassengers(tamrPassengers); return processedMessages; } diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java index c657335b82..875f9b6a8d 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/MessageInformation.java @@ -9,7 +9,7 @@ package gov.gtas.services; import gov.gtas.model.MessageStatus; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import java.util.List; @@ -17,7 +17,7 @@ public class MessageInformation { MessageStatus messageStatus; - private List tamrPassengerSendObjects; + private List tamrPassengers; public MessageStatus getMessageStatus() { return messageStatus; @@ -27,11 +27,11 @@ public void setMessageStatus(MessageStatus messageStatus) { this.messageStatus = messageStatus; } - public void setTamrPassengerSendObjects(List tamrPassengerSendObjects) { - this.tamrPassengerSendObjects = tamrPassengerSendObjects; + public void setTamrPassengers(List tamrPassengerSendObjects) { + this.tamrPassengers = tamrPassengerSendObjects; } - public List getTamrPassengerSendObjects() { - return tamrPassengerSendObjects; + public List getTamrPassengers() { + return tamrPassengers; } } diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java index 1784002a5b..5eda3ba65d 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java @@ -17,7 +17,7 @@ import gov.gtas.model.*; import gov.gtas.parsers.tamr.TamrAdapter; import gov.gtas.parsers.tamr.TamrAdapterImpl; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.vo.*; import gov.gtas.repository.*; import org.apache.commons.collections4.CollectionUtils; @@ -153,9 +153,9 @@ public MessageInformation load(MessageDto msgDto) { pnr.setTripType(tripType.toString()); if (tamrEnabled) { TamrAdapter tamrAdapter = new TamrAdapterImpl(); - List tamrPassengerSendObjectList = tamrAdapter - .convert(pnr.getFlights().iterator().next(), pnr.getPassengers()); - messageInformation.setTamrPassengerSendObjects(tamrPassengerSendObjectList); + List tamrPassengers = tamrAdapter + .convertPassengers(pnr.getFlights().iterator().next(), pnr.getPassengers()); + messageInformation.setTamrPassengers(tamrPassengers); } } catch (Exception e) { msgDto.getMessageStatus().setMessageStatusEnum(MessageStatusEnum.FAILED_LOADING); diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java index d265106028..fc4aaca218 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ProcessedMessages.java @@ -1,14 +1,14 @@ package gov.gtas.services; import gov.gtas.model.MessageStatus; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; +import gov.gtas.parsers.tamr.model.TamrPassenger; import java.util.List; public class ProcessedMessages { private int[] processed; private List messageStatusList; - private List tamrPassengerSendObjectList; + private List tamrPassengers; public int[] getProcessed() { return processed; } @@ -25,11 +25,11 @@ public void setMessageStatusList(List messageStatusList) { this.messageStatusList = messageStatusList; } - public List getTamrPassengerSendObjectList() { - return tamrPassengerSendObjectList; + public List getTamrPassengers() { + return tamrPassengers; } - public void setTamrPassengerSendObjectList(List tamrPassengerSendObjectList) { - this.tamrPassengerSendObjectList = tamrPassengerSendObjectList; + public void setTamrPassengers(List tamrPassengers) { + this.tamrPassengers = tamrPassengers; } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java index 0febcdb787..d4f322fed5 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapter.java @@ -8,13 +8,18 @@ package gov.gtas.parsers.tamr; -import gov.gtas.model.Flight; -import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; - +import java.util.Collection; import java.util.List; import java.util.Set; +import gov.gtas.model.Flight; +import gov.gtas.model.Passenger; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.model.TamrDerogListEntry; +import gov.gtas.parsers.tamr.model.TamrPassenger; + public interface TamrAdapter { - List convert(Flight flight, Set passengers); + List convertPassengers(Flight flight, Set passengers); + + List convertWatchlist(Collection watchlistItems); } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java index e02b76c008..bafc158f36 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java @@ -8,71 +8,163 @@ package gov.gtas.parsers.tamr; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import com.fasterxml.jackson.databind.ObjectMapper; + import gov.gtas.model.Document; import gov.gtas.model.Flight; import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.model.TamrDocumentSendObject; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import gov.gtas.model.PassengerDetails; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.model.watchlist.json.WatchlistItemSpec; +import gov.gtas.model.watchlist.json.WatchlistTerm; +import gov.gtas.parsers.tamr.model.TamrDerogListEntry; +import gov.gtas.parsers.tamr.model.TamrDocument; +import gov.gtas.parsers.tamr.model.TamrPassenger; +import gov.gtas.services.FlightService; public class TamrAdapterImpl implements TamrAdapter { + @Autowired + FlightService flightService; + + private ObjectMapper mapper = new ObjectMapper(); + + private Logger logger = LoggerFactory.getLogger(TamrAdapterImpl.class); + @Override - public List convert(Flight flight, Set passengers) { - List tamrPassengers = new ArrayList(); - for (Passenger passenger : passengers) { - // per passenger convert to tamrPax - TamrPassengerSendObject tamrPax = convertPassengerToTamrPassenger(flight, passenger); - // get docs from passengers - for (Document doc : passenger.getDocuments()) { - // add tamrDoc to tamrPax doc list - tamrPax.getDocuments().add(convertDocumentToTamrDocument(doc)); - } - tamrPassengers.add(tamrPax); - } - return tamrPassengers; + public List convertPassengers( + Flight flight, Set passengers) { + return passengers.stream() + .map(passenger -> + convertPassengerToTamrPassenger(flight, passenger)) + .collect(Collectors.toList()); } - private TamrPassengerSendObject convertPassengerToTamrPassenger(Flight flight, Passenger passenger) { - TamrPassengerSendObject tamrPax = new TamrPassengerSendObject(); - // initializing doc list - List docs = new ArrayList<>(); - tamrPax.setDocuments(docs); + private TamrPassenger convertPassengerToTamrPassenger(Flight flight, Passenger passenger) { + TamrPassenger tamrPassenger = new TamrPassenger(); - // flight related - tamrPax.setAPIS_ARVL_APRT_CD(flight.getDestination()); - tamrPax.setAPIS_DPRTR_APRT_CD(flight.getOrigin()); - tamrPax.setETA_DT(flight.getMutableFlightDetails().getEta()); - tamrPax.setIATA_CARR_CD(flight.getCarrier()); - tamrPax.setFLIT_NBR(flight.getFullFlightNumber()); + // Basic passenger information + PassengerDetails passengerDetails = passenger.getPassengerDetails(); + tamrPassenger.setGtasId(passenger.getId().toString()); + tamrPassenger.setFirstName(passengerDetails.getFirstName()); + tamrPassenger.setMiddleName(passengerDetails.getMiddleName()); + tamrPassenger.setLastName(passengerDetails.getLastName()); + tamrPassenger.setGender(passengerDetails.getGender()); + tamrPassenger.setDob(passengerDetails.getDob()); + + // Convert documents + tamrPassenger.setDocuments(passenger.getDocuments().stream() + .map(document -> convertDocumentToTamrDocument(document)) + .collect(Collectors.toList())); + + // Nationalities (only one in GTAS) + tamrPassenger.setCitizenshipCountry(Collections + .singletonList(passengerDetails.getNationality())); - // pax related - List nationalities = new ArrayList<>(); - nationalities.add(passenger.getPassengerDetails().getNationality()); - tamrPax.setNATIONALITY_CD(nationalities); - tamrPax.setDOB_Date(passenger.getPassengerDetails().getDob()); - tamrPax.setFirst_name(passenger.getPassengerDetails().getFirstName()); - tamrPax.setGNDR_CD(passenger.getPassengerDetails().getGender()); - tamrPax.setGtasId(passenger.getId().toString()); - tamrPax.setLast_name(passenger.getPassengerDetails().getLastName()); - - // temp values - tamrPax.setUid(""); - tamrPax.setFlt("test"); - - return tamrPax; + return tamrPassenger; } - private TamrDocumentSendObject convertDocumentToTamrDocument(Document doc) { - TamrDocumentSendObject tamrDoc = new TamrDocumentSendObject(); + private TamrDocument convertDocumentToTamrDocument(Document document) { + TamrDocument tamrDocument = new TamrDocument(); - tamrDoc.setDOC_CTRY_CD(doc.getIssuanceCountry()); - tamrDoc.setDOC_ID(doc.getDocumentNumber()); - tamrDoc.setDOC_TYP_NM(doc.getDocumentType()); + tamrDocument.setDocumentId(document.getDocumentNumber()); + tamrDocument.setDocumentType(document.getDocumentType()); + tamrDocument.setDocumentIssuingCountry(document.getIssuanceCountry()); - return tamrDoc; + return tamrDocument; } + + @Override + public List convertWatchlist(Collection watchlistItems) { + return watchlistItems.stream() + .map(watchlistItem -> + convertWatchlistItemToTamrDerogListEntry(watchlistItem)) + .filter(derogListEntry -> derogListEntry != null) + .collect(Collectors.toList()); + } + + /** + * Convert a GTAS watchlist item to a derog entry that can be sent to + * Tamr. This may return null for some watchlist items that should not + * be sent to Tamr. + */ + private TamrDerogListEntry convertWatchlistItemToTamrDerogListEntry( + WatchlistItem watchlistItem) { + TamrDerogListEntry derogListEntry = new TamrDerogListEntry(); + + WatchlistItemSpec itemSpec; + try { + itemSpec = mapper.readValue(watchlistItem.getItemData(), + WatchlistItemSpec.class); + } catch (IOException e) { + logger.warn("Error parsing watchlist item data {}. Ignoring...", + watchlistItem.getItemData()); + return null; + } + + for (WatchlistTerm term: itemSpec.getTerms()) { + if(term.getField().equals("firstName")) { + derogListEntry.setFirstName(term.getValue()); + } else if (term.getField().equals("lastName")) { + derogListEntry.setLastName(term.getValue()); + } else if (term.getField().equals("dob")) { + try { + SimpleDateFormat parser = + new SimpleDateFormat("yyyy-MM-dd"); + derogListEntry.setDob(parser.parse(term.getValue())); + } catch (ParseException e) { + logger.warn("Unable to parse watchlist DOB {}. " + + "Ignoring...", term.getValue()); + } + } else if (term.getField().equals("documentType") || + term.getField().equals("documentNumber")) { + TamrDocument document; + if (derogListEntry.getDocuments() == null) { + document = new TamrDocument(); + derogListEntry.setDocuments( + Collections.singletonList(document)); + } else { + document = derogListEntry.getDocuments().get(0); + } + if (term.getField().equals("documentType")) { + document.setDocumentType(term.getValue()); + } else if (term.getField().equals("documentNumber")) { + document.setDocumentId(term.getValue()); + } + } else { + logger.warn("Unknown watchlist field \"{}\". Ignoring...", + term.getField()); + } + } + + if (derogListEntry.getLastName() == null) { + // We only add to the derog list entries where the last name + // at least is populated. + return null; + } + + // We set both gtasId and derogId to the watchlist item ID from + // GTAS. Tamr can merge multiple derog list entries with the same + // derogId, but we don't use that functionality yet. + String itemIdStr = Long.toString(watchlistItem.getId()); + derogListEntry.setGtasId(itemIdStr); + derogListEntry.setDerogId(itemIdStr); + + return derogListEntry; + + } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java deleted file mode 100644 index 808b56a7e7..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionService.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr; - -import java.util.List; -import java.util.Set; - -import org.springframework.stereotype.Service; -import gov.gtas.model.Flight; -import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; - -@Service -public interface TamrConversionService { - - public List convertGTASFlightToTamrMessage(Flight flight); - - public List convertGTASFlightToTamrMessage(Set flights); - - public void sendPassengersToTamr(Set flights, Set passengers); -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java deleted file mode 100644 index b106487563..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrConversionServiceImpl.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import gov.gtas.model.Document; -import gov.gtas.model.Flight; -import gov.gtas.model.Passenger; -import gov.gtas.parsers.tamr.jms.TamrMessageSender; -import gov.gtas.parsers.tamr.model.TamrDocumentSendObject; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; -import gov.gtas.repository.FlightRepository; -import gov.gtas.services.FlightService; - -@Component -public class TamrConversionServiceImpl implements TamrConversionService { - - @Autowired - FlightService fService; - - @Autowired - FlightRepository flightRepo; - - @Autowired - TamrMessageSender messageSender; - - static final Logger logger = LoggerFactory.getLogger(TamrConversionService.class); - - // Convenience method. Receives list of Flights to convert to send objects for - // batch dump uses other single flight method - public List convertGTASFlightToTamrMessage(Set flights) { - List passengers = new ArrayList(); - - for (Flight flight : flights) { - passengers.addAll(convertGTASFlightToTamrMessage(flight)); - } - - return passengers; - } - - public List convertGTASFlightToTamrMessage(Flight flight) { - List passengers = new ArrayList(); - - // get passengers from flight - for (Passenger passenger : fService.getAllPassengers(flight.getId())) { - // per passenger convert to tamrPax - TamrPassengerSendObject tamrPax = convertPassengerToTamrPassenger(flight, passenger); - // get docs from passengers - for (Document doc : passenger.getDocuments()) { - // add tamrDoc to tamrPax doc list - tamrPax.getDocuments().add(convertDocumentToTamrDocument(doc)); - } - } - return passengers; - } - - private List convertGTASFlightAndPassengersToTamrMessage(Flight flight, - Set passengers) { - List tamrPassengers = new ArrayList(); - for (Passenger passenger : passengers) { - // per passenger convert to tamrPax - TamrPassengerSendObject tamrPax = convertPassengerToTamrPassenger(flight, passenger); - // get docs from passengers - for (Document doc : passenger.getDocuments()) { - // add tamrDoc to tamrPax doc list - tamrPax.getDocuments().add(convertDocumentToTamrDocument(doc)); - } - tamrPassengers.add(tamrPax); - } - return tamrPassengers; - } - - private TamrPassengerSendObject convertPassengerToTamrPassenger(Flight flight, Passenger passenger) { - TamrPassengerSendObject tamrPax = new TamrPassengerSendObject(); - // initializing doc list - List docs = new ArrayList(); - tamrPax.setDocuments(docs); - - // flight related - tamrPax.setAPIS_ARVL_APRT_CD(flight.getDestination()); - tamrPax.setAPIS_DPRTR_APRT_CD(flight.getOrigin()); - tamrPax.setETA_DT(flight.getMutableFlightDetails().getEtaDate()); - tamrPax.setIATA_CARR_CD(flight.getCarrier()); - tamrPax.setFLIT_NBR(flight.getFullFlightNumber()); - - // pax related - List nationalities = new ArrayList(); - nationalities.add(passenger.getPassengerDetails().getNationality()); - tamrPax.setNATIONALITY_CD(nationalities); - tamrPax.setDOB_Date(passenger.getPassengerDetails().getDob()); - tamrPax.setFirst_name(passenger.getPassengerDetails().getFirstName()); - tamrPax.setGNDR_CD(passenger.getPassengerDetails().getGender()); - tamrPax.setGtasId(passenger.getId().toString()); - tamrPax.setLast_name(passenger.getPassengerDetails().getLastName()); - - // temp values - tamrPax.setUid(""); - tamrPax.setFlt("test"); - - return tamrPax; - } - - private TamrDocumentSendObject convertDocumentToTamrDocument(Document doc) { - TamrDocumentSendObject tamrDoc = new TamrDocumentSendObject(); - - tamrDoc.setDOC_CTRY_CD(doc.getIssuanceCountry()); - tamrDoc.setDOC_ID(doc.getDocumentNumber()); - tamrDoc.setDOC_TYP_NM(doc.getDocumentType()); - - return tamrDoc; - } - - private String convertGTASObjectToJson(List passengers) { - String tamrJSON = ""; - if (passengers != null && !passengers.isEmpty()) { - logger.debug("Converting model object to JSON String"); - logger.debug("Total number of passengers to convert: " + passengers.size()); - ObjectMapper mapper = new ObjectMapper(); - try { - tamrJSON = mapper.writeValueAsString(passengers); - } catch (JsonProcessingException e) { - logger.error("caught JsonProcessingException"); - } - } - return tamrJSON; - } - - @Override - public void sendPassengersToTamr(Set flights, Set passengers) { - List tamrPassengers = new ArrayList(); - for (Flight flight : flights) { - tamrPassengers.addAll(convertGTASFlightAndPassengersToTamrMessage(flight, passengers)); - } - String tamrJSON = convertGTASObjectToJson(tamrPassengers); - try { - // Commented out for commit, uncomment with new Tamr credentials if wanting to - // use. - // messageSender.sendMessageToTamr("InboundQueue", tamrJSON); - } catch (Exception e) { - logger.error("caught Exception"); - } - // System.out.println(tamrJSON); - } - -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 4882e82572..09635f158e 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -1,5 +1,9 @@ package gov.gtas.parsers.tamr; +import java.util.Date; +import java.util.NoSuchElementException; +import java.util.Optional; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -8,8 +12,19 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import gov.gtas.enumtype.HitTypeEnum; +import gov.gtas.model.Passenger; +import gov.gtas.model.PassengerIDTag; +import gov.gtas.model.PendingHitDetails; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.model.TamrDerogHit; +import gov.gtas.parsers.tamr.model.TamrHistoryCluster; import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrTravelerResponse; import gov.gtas.repository.PassengerIDTagRepository; +import gov.gtas.repository.PassengerRepository; +import gov.gtas.repository.PendingHitDetailRepository; +import gov.gtas.repository.watchlist.WatchlistItemRepository; @Component public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService { @@ -19,6 +34,15 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService @Autowired private PassengerIDTagRepository passengerIDTagRepository; + @Autowired + private WatchlistItemRepository watchlistItemRepository; + + @Autowired + private PendingHitDetailRepository pendingHitDetailRepository; + + @Autowired + private PassengerRepository passengerRepository; + /** * Handle responses to Tamr QUERY requests. This handles both the "derog * matches" and "traveler history" responses. @@ -27,7 +51,66 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService public void handleQueryResponse(TamrMessage response) { if (this.checkRecordErrors(response)) return; - logger.info("TODO: handle QUERY response"); + for (TamrTravelerResponse travelerResponse: response.getTravelerQuery()) { + if (travelerResponse.getTamrId() != null) { + this.updateTamrId(travelerResponse.getGtasId(), + travelerResponse.getTamrId(), + travelerResponse.getVersion()); + } + for (TamrDerogHit derogHit: travelerResponse.getDerogIds()) { + this.createPendingHit(travelerResponse.getGtasId(), derogHit); + } + } + } + + /** + * Creates an instance of the PendingHitDetails model in GTAS based on a + * derog hit from Tamr. + */ + private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { + long gtasId = Long.parseLong(gtasIdStr); + PendingHitDetails pendingHit = new PendingHitDetails(); + + pendingHit.setTitle("Tamr Fuzzy Watchlist Hit"); + pendingHit.setDescription("This passenger closely matches a watchlist " + + "entry, according to Tamr's proprietary fuzzy matching " + + "technology."); + + pendingHit.setHitEnum(HitTypeEnum.PARTIAL_WATCHLIST); + pendingHit.setHitType(pendingHit.getHitEnum().toString()); + + // Try to get watchlist item based on derogId from Tamr. + long watchlistItemId = Long.parseLong(derogHit.getDerogId()); + Optional watchlistItem = + watchlistItemRepository.findById(watchlistItemId); + try { + pendingHit.setHitMakerId(watchlistItem.get().getId()); + pendingHit.setPercentage(derogHit.getScore()); + + // Tamr doesn't return any details about the matching algorithm, + // so leave this empty. + pendingHit.setRuleConditions(""); + } catch (NoSuchElementException e) { + logger.warn("Tamr returned derog hit for nonexistent watchlist " + + "entry with ID {}.", watchlistItemId); + return; + } + + // Try to find passenger in GTAS so we can get the associated flight. + Optional passenger = passengerRepository.findById(gtasId); + try { + pendingHit.setFlightId(passenger.get().getFlight().getId()); + pendingHit.setPassengerId(gtasId); + } catch (NoSuchElementException e) { + logger.warn("Tamr returned derog hit for nonexistent passenger " + + "with ID {}.", gtasId); + return; + } + + pendingHit.setCreatedDate(new Date()); + + // Persist to database. + pendingHitDetailRepository.save(pendingHit); } /** @@ -58,10 +141,41 @@ public void handleAcknowledgeResponse(TamrMessage response) { public void handleTamrIdUpdate(TamrMessage message) { // The "error" field can be set on these. if (message.getError() != null) { - logger.error("Tamr error during {} request: {}", + logger.error("Tamr error in {} message: {}", message.getMessageType(), message.getError()); + return; + } + + for (TamrHistoryCluster cluster: message.getHistoryClusters()) { + if (cluster.getAction() == null || + cluster.getAction().equals("UPDATE")) { + this.updateTamrId(cluster.getGtasId(), + cluster.getTamrId(), cluster.getVersion()); + } else if (cluster.getAction().equals("DELETE")) { + this.updateTamrId(cluster.getGtasId(), + null, cluster.getVersion()); + } else { + logger.warn("Unknown history cluster action \"{}\" received " + + "from Tamr for passenger {}. Ignoring...", + cluster.getAction(), cluster.getGtasId()); + } + } + } + + /** + * Updates the tamrId for the traveler in GTAS with the given gtasId. This + * also checks to see if the traveler exists in GTAS; if they do not, it + * issues a warning. + */ + private void updateTamrId(String gtasIdStr, String tamrId, int version) { + long gtasId = Long.parseLong(gtasIdStr); + PassengerIDTag currentPassengerIdTag = + passengerIDTagRepository.findByPaxId(gtasId); + if (currentPassengerIdTag == null) { + logger.warn("Unable to update tamrId of nonexistent passenger " + + "with ID {}.", gtasId); } else { - logger.info("TODO: handle Tamr ID updates"); + passengerIDTagRepository.updateTamrId(gtasId, tamrId); } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java index 5060e1cc79..ab5cedf8e1 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java @@ -1,45 +1,65 @@ package gov.gtas.parsers.tamr.jms; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; - +import java.util.List; +import org.springframework.stereotype.Service; import org.apache.activemq.ActiveMQConnectionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Component; +import gov.gtas.model.Flight; +import gov.gtas.parsers.tamr.model.TamrPassenger; +import gov.gtas.parsers.tamr.jms.TamrQueueConfig; +import gov.gtas.parsers.tamr.TamrAdapterImpl; +import gov.gtas.parsers.tamr.model.TamrQuery; @Component +@ConditionalOnProperty(prefix = "tamr", name = "enabled") public class TamrMessageSender { private final Logger logger = LoggerFactory.getLogger(TamrMessageSender.class); + private TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); @Autowired JmsTemplate jmsTemplateFile; + @Autowired + TamrQueueConfig queueConfig; + public ConnectionFactory connectionFactory() { // Add tamr connection details here. return new ActiveMQConnectionFactory(""); } - public boolean sendMessageToTamr(String queue, String messageContent) throws Exception { + public boolean sendMessageToTamr(String queue, List passengers) throws Exception { logger.info("############### Attempting to craft tamr message .... ################"); - logger.info("############### Sending to Queue: " + queue + " .... ################"); jmsTemplateFile.setDefaultDestinationName(queue); - jmsTemplateFile.setConnectionFactory(connectionFactory()); + jmsTemplateFile.setConnectionFactory(queueConfig.cachingConnectionFactory()); + + TamrQuery tamrQuery = new TamrQuery(passengers); + ObjectMapper mapper = new ObjectMapper(); + String tamrQueryJson = mapper.writer().writeValueAsString(tamrQuery); + + logger.info("Query:"); + logger.info(tamrQueryJson); jmsTemplateFile.send(new MessageCreator() { - @Override public Message createMessage(Session session) throws JMSException { - Message message = session.createTextMessage("{\"passengers\":" + messageContent + "}"); + Message message = session.createTextMessage(tamrQueryJson); message.setJMSType("QUERY"); return message; } }); + return true; } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java index 16c3b468df..29f77403f7 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java @@ -11,13 +11,15 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; +import org.springframework.jms.core.JmsTemplate; import org.springframework.context.annotation.Configuration; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; +import org.springframework.jms.connection.CachingConnectionFactory; import org.springframework.jms.config.JmsListenerContainerFactory; @Configuration -@ConditionalOnProperty(prefix = "tamr", name = "enabled") +//@ConditionalOnProperty(prefix = "tamr", name = "enabled") @EnableJms public class TamrQueueConfig { @@ -37,4 +39,22 @@ public JmsListenerContainerFactory tamrJmsListenerContainerFactory() { return factory; } + @Bean + public ActiveMQConnectionFactory senderConnectionFactory() { + ActiveMQConnectionFactory aMQConnection = new ActiveMQConnectionFactory(); + aMQConnection.setBrokerURL(activeMQBrokerUrl); + + return aMQConnection; + } + + @Bean + public CachingConnectionFactory cachingConnectionFactory() { + return new CachingConnectionFactory(senderConnectionFactory()); + } + + @Bean + public JmsTemplate jmsTemplate() { + return new JmsTemplate(cachingConnectionFactory()); + } + } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java new file mode 100644 index 0000000000..65a43ab06e --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListEntry.java @@ -0,0 +1,18 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +public class TamrDerogListEntry extends TamrPassenger { + private String derogId; + + public String getDerogId() { + return derogId; + } + + public void setDerogId(String derogId) { + this.derogId = derogId; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java new file mode 100644 index 0000000000..5ef456fdf8 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDerogListUpdate.java @@ -0,0 +1,29 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +public class TamrDerogListUpdate { + + private List passengers; + + public TamrDerogListUpdate() { + } + + public TamrDerogListUpdate(List passengers) { + this.passengers = passengers; + } + + public List getPassengers() { + return passengers; + } + + public void setPassengers(List passengers) { + this.passengers = passengers; + } + +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java new file mode 100644 index 0000000000..f99f7a57cf --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocument.java @@ -0,0 +1,36 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +public class TamrDocument { + private String documentId; + private String documentType; + private String documentIssuingCountry; + + public String getDocumentId() { + return documentId; + } + + public void setDocumentId(String documentId) { + this.documentId = documentId; + } + + public String getDocumentType() { + return documentType; + } + + public void setDocumentType(String documentType) { + this.documentType = documentType; + } + + public String getDocumentIssuingCountry() { + return documentIssuingCountry; + } + + public void setDocumentIssuingCountry(String documentIssuingCountry) { + this.documentIssuingCountry = documentIssuingCountry; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java deleted file mode 100644 index 6fc9506dfb..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrDocumentSendObject.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class TamrDocumentSendObject { - - @JsonProperty("DOC_CTRY_CD") - private String DOC_CTRY_CD; - - @JsonProperty("DOC_TYP_NM") - private String DOC_TYP_NM; - - @JsonProperty("DOC_ID") - private String DOC_ID; - - @JsonProperty("DOC_CTRY_CD") - public String getDOC_CTRY_CD() { - return DOC_CTRY_CD; - } - - public void setDOC_CTRY_CD(String dOC_CTRY_CD) { - DOC_CTRY_CD = dOC_CTRY_CD; - } - - @JsonProperty("DOC_TYP_NM") - public String getDOC_TYP_NM() { - return DOC_TYP_NM; - } - - public void setDOC_TYP_NM(String dOC_TYP_NM) { - DOC_TYP_NM = dOC_TYP_NM; - } - - @JsonProperty("DOC_ID") - public String getDOC_ID() { - return DOC_ID; - } - - public void setDOC_ID(String dOC_ID) { - DOC_ID = dOC_ID; - } - - @Override - public String toString() { - return "TamrDocumentSendObject{" + "DOC_CTRY_CD='" + DOC_CTRY_CD + '\'' + ", DOC_TYP_NM='" + DOC_TYP_NM + '\'' - + ", DOC_ID='" + DOC_ID + '\'' + '}'; - } -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java new file mode 100644 index 0000000000..9ff136c029 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassenger.java @@ -0,0 +1,89 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class TamrPassenger { + private String gtasId; + private String firstName; + private String middleName; + private String lastName; + private String gender; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date dob; + + private List documents; + private List citizenshipCountry; + + public String getGtasId() { + return gtasId; + } + + public void setGtasId(String gtasId) { + this.gtasId = gtasId; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public Date getDob() { + return dob; + } + + public void setDob(Date dob) { + this.dob = dob; + } + + public List getDocuments() { + return documents; + } + + public void setDocuments(List documents) { + this.documents = documents; + } + + public List getCitizenshipCountry() { + return citizenshipCountry; + } + + public void setCitizenshipCountry(List citizenshipCountry) { + this.citizenshipCountry = citizenshipCountry; + } +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java deleted file mode 100644 index b212a55c7a..0000000000 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrPassengerSendObject.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). - * - * Please see LICENSE.txt for details. - */ -package gov.gtas.parsers.tamr.model; - -import java.util.Date; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class TamrPassengerSendObject { - - @JsonProperty("gtasId") - private String gtasId; - - @JsonProperty("first_name") - private String first_name; - - @JsonProperty("last_name") - private String last_name; - - @JsonProperty("Uid") - private String Uid; - - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - private Date ETA_DT; - - @JsonProperty("IATA_CARR_CD") - private String IATA_CARR_CD; - - @JsonProperty("FLIT_NBR") - private String FLIT_NBR; - - @JsonProperty("flt") - private String flt; - - @JsonProperty("APIS_DPRTR_APRT_CD") - private String APIS_DPRTR_APRT_CD; - - @JsonProperty("APIS_ARVL_APRT_CD") - private String APIS_ARVL_APRT_CD; - - @JsonProperty("NATIONALITY_CD") - private List NATIONALITY_CD; - - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - private Date DOB_Date; - - @JsonProperty("GNDR_CD") - private String GNDR_CD; - - @JsonProperty("documents") - private List documents; - - public String getGtasId() { - return gtasId; - } - - public void setGtasId(String gtasId) { - this.gtasId = gtasId; - } - - public String getFirst_name() { - return first_name; - } - - public void setFirst_name(String first_name) { - this.first_name = first_name; - } - - public String getLast_name() { - return last_name; - } - - public void setLast_name(String last_name) { - this.last_name = last_name; - } - - @JsonProperty("Uid") - public String getUid() { - return Uid; - } - - public void setUid(String uid) { - Uid = uid; - } - - @JsonProperty("ETA_DT") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - public Date getETA_DT() { - return ETA_DT; - } - - public void setETA_DT(Date eTA_DT) { - ETA_DT = eTA_DT; - } - - @JsonProperty("IATA_CARR_CD") - public String getIATA_CARR_CD() { - return IATA_CARR_CD; - } - - public void setIATA_CARR_CD(String iATA_CARR_CD) { - IATA_CARR_CD = iATA_CARR_CD; - } - - @JsonProperty("FLIT_NBR") - public String getFLIT_NBR() { - return FLIT_NBR; - } - - public void setFLIT_NBR(String fLIT_NBR) { - FLIT_NBR = fLIT_NBR; - } - - @JsonProperty("flt") - public String getFlt() { - return flt; - } - - public void setFlt(String flt) { - this.flt = flt; - } - - @JsonProperty("APIS_DPRTR_APRT_CD") - public String getAPIS_DPRTR_APRT_CD() { - return APIS_DPRTR_APRT_CD; - } - - public void setAPIS_DPRTR_APRT_CD(String aPIS_DPRTR_APRT_CD) { - APIS_DPRTR_APRT_CD = aPIS_DPRTR_APRT_CD; - } - - @JsonProperty("APIS_ARVL_APRT_CD") - public String getAPIS_ARVL_APRT_CD() { - return APIS_ARVL_APRT_CD; - } - - public void setAPIS_ARVL_APRT_CD(String aPIS_ARVL_APRT_CD) { - APIS_ARVL_APRT_CD = aPIS_ARVL_APRT_CD; - } - - @JsonProperty("NATIONALITY_CD") - public List getNATIONALITY_CD() { - return NATIONALITY_CD; - } - - public void setNATIONALITY_CD(List NATIONALITY_CD) { - this.NATIONALITY_CD = NATIONALITY_CD; - } - - @JsonProperty("DOB_Date") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - public Date getDOB_Date() { - return DOB_Date; - } - - public void setDOB_Date(Date date) { - DOB_Date = date; - } - - @JsonProperty("GNDR_CD") - public String getGNDR_CD() { - return GNDR_CD; - } - - public void setGNDR_CD(String gNDR_CD) { - GNDR_CD = gNDR_CD; - } - - @JsonProperty("documents") - public List getDocuments() { - return documents; - } - - public void setDocuments(List documents) { - this.documents = documents; - } - - @Override - public String toString() { - return "TamrPassengerSendObject{" + "gtasId='" + gtasId + '\'' + ", first_name='" + first_name + '\'' - + ", last_name='" + last_name + '\'' + ", Uid='" + Uid + '\'' + ", ETA_DT=" + ETA_DT - + ", IATA_CARR_CD='" + IATA_CARR_CD + '\'' + ", FLIT_NBR='" + FLIT_NBR + '\'' + ", flt='" + flt + '\'' - + ", APIS_DPRTR_APRT_CD='" + APIS_DPRTR_APRT_CD + '\'' + ", APIS_ARVL_APRT_CD='" + APIS_ARVL_APRT_CD - + '\'' + ", NATIONALITY_CD=" + NATIONALITY_CD + ", DOB_Date=" + DOB_Date + ", GNDR_CD='" + GNDR_CD - + '\'' + ", documents=" + documents + '}'; - } -} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java new file mode 100644 index 0000000000..0694143ab7 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrQuery.java @@ -0,0 +1,28 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr.model; + +import java.util.List; + +public class TamrQuery { + private List passengers; + + public TamrQuery() { + } + + public TamrQuery(List passengers) { + this.passengers = passengers; + } + + public List getPassengers() { + return passengers; + } + + public void setPassengers(List passengers) { + this.passengers = passengers; + } + +} diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java new file mode 100644 index 0000000000..e5f216d292 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -0,0 +1,150 @@ +package gov.gtas.parsers.tamr; + +import static org.junit.Assert.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.*; +import static org.mockito.AdditionalMatchers.*; + +import java.util.Collections; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.test.util.ReflectionTestUtils; + + +import gov.gtas.enumtype.HitTypeEnum; +import gov.gtas.model.Flight; +import gov.gtas.model.Passenger; +import gov.gtas.model.PendingHitDetails; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.ParserTestHelper; +import gov.gtas.parsers.tamr.model.TamrDerogHit; +import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrTravelerResponse; +import gov.gtas.repository.PassengerRepository; +import gov.gtas.repository.PendingHitDetailRepository; +import gov.gtas.repository.watchlist.WatchlistItemRepository; + +public class HandleTamrDerogHitsTest implements ParserTestHelper { + private TamrMessageHandlerService handler; + private WatchlistItem watchlistItem; + private WatchlistItemRepository watchlistItemRepository; + private PendingHitDetailRepository pendingHitDetailRepository; + private Passenger passenger; + private PassengerRepository passengerRepository; + + @Before + public void setUp() { + this.handler = new TamrMessageHandlerServiceImpl(); + + this.watchlistItem = new WatchlistItem(); + watchlistItem.setId(94L); + + watchlistItemRepository = mock(WatchlistItemRepository.class); + ReflectionTestUtils.setField(handler, "watchlistItemRepository", + watchlistItemRepository); + // Set up WatchlistItemRepository to return a fake watchlist item. + given(watchlistItemRepository.findById(watchlistItem.getId())) + .willReturn(Optional.of(watchlistItem)); + // Otherwise return null. + given(watchlistItemRepository.findById(not(eq(watchlistItem.getId())))) + .willReturn(Optional.empty()); + + pendingHitDetailRepository = mock(PendingHitDetailRepository.class); + ReflectionTestUtils.setField(handler, "pendingHitDetailRepository", + pendingHitDetailRepository); + + + passengerRepository = mock(PassengerRepository.class); + ReflectionTestUtils.setField(handler, "passengerRepository", + passengerRepository); + + // Set up the PassengerRepository to return a dummy instance when + // queried. + passenger = new Passenger(); + passenger.setId(1099L); + Flight flight = new Flight(); + flight.setId(22L); + passenger.setFlight(flight); + given(passengerRepository.findById(passenger.getId())).willReturn( + Optional.of(passenger)); + // Otherwise return null. + given(passengerRepository.findById(not(eq(passenger.getId())))) + .willReturn(Optional.empty()); + } + + @Test + public void testHandleDerogHit() { + float score = 0.76f; + TamrMessage derogMessage = getDerogMessage( + passenger.getId(), watchlistItem.getId(), score); + handler.handleQueryResponse(derogMessage); + + final ArgumentCaptor pendingHitCaptor = + ArgumentCaptor.forClass(PendingHitDetails.class); + verify(pendingHitDetailRepository).save(pendingHitCaptor.capture()); + PendingHitDetails pendingHit = pendingHitCaptor.getValue(); + + // We should mention Tamr somewhere in the title and description for + // the derog hit so it's clear where it came from. + assertTrue(pendingHit.getTitle().contains("Tamr")); + assertTrue(pendingHit.getDescription().contains("Tamr")); + + assertEquals(pendingHit.getHitEnum().toString(), + pendingHit.getHitType()); + assertEquals(HitTypeEnum.PARTIAL_WATCHLIST, pendingHit.getHitEnum()); + + assertEquals(watchlistItem.getId(), pendingHit.getHitMakerId()); + assertEquals(score, pendingHit.getPercentage(), 0.00001f); + + assertEquals(passenger.getId(), pendingHit.getPassengerId()); + assertEquals(passenger.getFlight().getId(), pendingHit.getFlightId()); + } + + /** + * Test when Tamr sends a nonexistent derogId. + */ + @Test + public void handleNonexistentDerogId() { + TamrMessage derogMessage = getDerogMessage( + passenger.getId(), 35L, 0.22f); + handler.handleQueryResponse(derogMessage); + + verifyZeroInteractions(pendingHitDetailRepository); + } + + /** + * Test when Tamr sends a nonexistent gtasId. + */ + @Test + public void handleNonexistentGtasId() { + TamrMessage derogMessage = getDerogMessage( + 547L, watchlistItem.getId(), 0.28f); + handler.handleQueryResponse(derogMessage); + + verifyZeroInteractions(pendingHitDetailRepository); + } + + /** + * Constructs a QUERY response TamrMessage that includes matching the + * given passenger with the given wachlist item. + */ + private TamrMessage getDerogMessage(long gtasId, long derogId, float score) { + TamrDerogHit derogHit = new TamrDerogHit(); + derogHit.setDerogId(Long.toString(derogId)); + derogHit.setScore(score); + + TamrTravelerResponse travelerResponse = new TamrTravelerResponse(); + travelerResponse.setGtasId(Long.toString(gtasId)); + travelerResponse.setDerogIds(Collections.singletonList(derogHit)); + travelerResponse.setTamrId(null); + travelerResponse.setVersion(-1); + travelerResponse.setScore(0); + + TamrMessage message = new TamrMessage(); + message.setTravelerQuery(Collections.singletonList(travelerResponse)); + return message; + } +} diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index 5e3582cbd8..6729e8f3eb 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -10,7 +10,6 @@ import javax.jms.TextMessage; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.springframework.test.util.ReflectionTestUtils; diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java index 02c5be5ea3..22d4da6c50 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java @@ -8,79 +8,146 @@ package gov.gtas.parsers.tamr; -import gov.gtas.model.*; -import gov.gtas.parsers.tamr.model.TamrPassengerSendObject; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import static java.time.ZoneOffset.UTC; +import static org.junit.Assert.*; import java.time.LocalDate; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; -import static java.time.ZoneOffset.UTC; +import org.junit.Test; -public class TamrAdapterImplTest { +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; - Flight testFlight; - Passenger testPassenger; - LocalDate eta; - Date etaFlightDate; - Date etaTestDate; - LocalDate localBirthDate; - Date birthDate; - Date birthDateTest; +import gov.gtas.model.Document; +import gov.gtas.model.Flight; +import gov.gtas.model.MutableFlightDetails; +import gov.gtas.model.Passenger; +import gov.gtas.model.PassengerDetails; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.model.TamrDerogListEntry; +import gov.gtas.parsers.tamr.model.TamrDerogListUpdate; +import gov.gtas.parsers.tamr.model.TamrPassenger; +import gov.gtas.parsers.tamr.model.TamrQuery; - @Before - public void setUp() { - eta = LocalDate.of(2020, 1, 24); - etaFlightDate = Date.from(eta.atStartOfDay(UTC).toInstant()); - etaTestDate = Date.from(eta.atStartOfDay(UTC).toInstant()); - localBirthDate = LocalDate.of(1988, 4, 24); - birthDate = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); - birthDateTest = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); +public class TamrAdapterImplTest { + private TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); - Flight flight = new Flight(); - MutableFlightDetails mfd = new MutableFlightDetails(); - mfd.setEta(etaFlightDate); - flight.setDestination("IAD"); - flight.setOrigin("ABC"); - flight.setCarrier("WAL"); - flight.setFlightNumber("ABC123"); - flight.setMutableFlightDetails(mfd); - Passenger p = new Passenger(); - p.setId(5L); - PassengerDetails passengerDetails = new PassengerDetails(p); - p.setPassengerDetails(passengerDetails); - passengerDetails.setDob(birthDate); - passengerDetails.setNationality("USA"); - passengerDetails.setFirstName("WALLY"); - passengerDetails.setLastName("HUND"); - passengerDetails.setGender("M"); - Set documentSet = new HashSet<>(); - Document d = new Document(); - d.setId(1L); - d.setDocumentNumber("123123123"); - d.setDocumentType("P"); - d.setIssuanceCountry("USA"); - p.setDocuments(documentSet); + @Test + public void testPassengerConversion() throws JsonProcessingException { + LocalDate eta = LocalDate.of(2020, 1, 24); + Date etaFlightDate = Date.from(eta.atStartOfDay(UTC).toInstant()); + LocalDate localBirthDate = LocalDate.of(1988, 4, 24); + Date birthDate = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); + Date birthDateTest = Date.from(localBirthDate.atStartOfDay(UTC).toInstant()); - testFlight = flight; - testPassenger = p; - } + Flight flight = new Flight(); + MutableFlightDetails mfd = new MutableFlightDetails(); + mfd.setEta(etaFlightDate); + flight.setDestination("IAD"); + flight.setOrigin("ABC"); + flight.setCarrier("WAL"); + flight.setFlightNumber("ABC123"); + flight.setMutableFlightDetails(mfd); + Passenger passenger = new Passenger(); + passenger.setId(5L); + PassengerDetails passengerDetails = new PassengerDetails(passenger); + passenger.setPassengerDetails(passengerDetails); + passengerDetails.setDob(birthDate); + passengerDetails.setNationality("USA"); + passengerDetails.setFirstName("WALLY"); + passengerDetails.setLastName("HUND"); + passengerDetails.setGender("M"); + Set documentSet = new HashSet<>(); + Document document = new Document(); + document.setId(1L); + document.setDocumentNumber("123123123"); + document.setDocumentType("P"); + document.setIssuanceCountry("USA"); + documentSet.add(document); + passenger.setDocuments(documentSet); + + List tamrPassengers = tamrAdapter.convertPassengers( + flight, Collections.singleton(passenger)); + TamrPassenger tamrPassenger = tamrPassengers.get(0); + assertEquals(birthDateTest, tamrPassenger.getDob()); + assertEquals("WALLY", tamrPassenger.getFirstName()); + assertEquals("5", tamrPassenger.getGtasId()); + assertEquals("HUND", tamrPassenger.getLastName()); + TamrQuery tamrQuery = new TamrQuery(tamrPassengers); + + ObjectMapper mapper = new ObjectMapper(); + String tamrQueryJson = mapper.writer() + .writeValueAsString(tamrQuery); + + assertEquals("{\"passengers\":[{\"gtasId\":\"5\",\"firstName\":\"WALLY\",\"middleName\":null,\"lastName\":\"HUND\",\"gender\":\"M\",\"dob\":\"1988-04-24\",\"documents\":[{\"documentId\":\"123123123\",\"documentType\":\"P\",\"documentIssuingCountry\":\"USA\"}],\"citizenshipCountry\":[\"USA\"]}]}", + tamrQueryJson); + } + + private static final String[] WATCHLIST_ITEMS = { + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"firstName\",\"type\":\"string\",\"value\":\"SHING\"},{\"field\":\"lastName\",\"type\":\"string\",\"value\":\"QUAN\"},{\"field\":\"dob\",\"type\":\"date\",\"value\":\"1998-08-08\"}]}", + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"documentType\",\"type\":\"string\",\"value\":\"P\"},{\"field\":\"documentNumber\",\"type\":\"string\",\"value\":\"221371771\"}]}", + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"firstName\",\"type\":\"string\",\"value\":\"FRIEDA\"},{\"field\":\"lastName\",\"type\":\"string\",\"value\":\"DARRINGTON\"},{\"field\":\"dob\",\"type\":\"date\",\"value\":\"1963-08-13\"}]}", + "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"documentType\",\"type\":\"string\",\"value\":\"P\"},{\"field\":\"documentNumber\",\"type\":\"string\",\"value\":\"899294368\"}]}" + }; + @Test - public void tamrConversionTest() { - TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); - List tamrPassengerSendObjectList = tamrAdapter.convert(testFlight, - Collections.singleton(testPassenger)); - TamrPassengerSendObject tpso = tamrPassengerSendObjectList.get(0); - Assert.assertEquals(birthDateTest, tpso.getDOB_Date()); - Assert.assertEquals("WALLY", tpso.getFirst_name()); - Assert.assertEquals(etaTestDate, tpso.getETA_DT()); - Assert.assertEquals("IAD", tpso.getAPIS_ARVL_APRT_CD()); - Assert.assertEquals("ABC", tpso.getAPIS_DPRTR_APRT_CD()); - Assert.assertEquals("M", tpso.getGNDR_CD()); - Assert.assertEquals("5", tpso.getGtasId()); - Assert.assertEquals("HUND", tpso.getLast_name()); + public void testWatchlistConversion() throws JsonProcessingException { + List watchlistItems = new ArrayList<>(); + for (int i = 0; i < WATCHLIST_ITEMS.length; i++) { + WatchlistItem watchlistItem = new WatchlistItem(); + watchlistItem.setItemData(WATCHLIST_ITEMS[i]); + watchlistItem.setId((long) i + 1); + watchlistItems.add(watchlistItem); + } + + List derogList = + tamrAdapter.convertWatchlist(watchlistItems); + + // Only 2 entries in the derog list, since document entries should + // be filtered out. + assertEquals(2, derogList.size()); + + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + TamrDerogListEntry entry = derogList.get(0); + assertEquals(entry.getFirstName(), "SHING"); + assertEquals(entry.getLastName(), "QUAN"); + calendar.set(1998, 7, 8); + assertEquals(calendar.getTime(), entry.getDob()); + assertNull(entry.getDocuments()); + + entry = derogList.get(1); + assertEquals(entry.getFirstName(), "FRIEDA"); + assertEquals(entry.getLastName(), "DARRINGTON"); + calendar.set(1963, 7, 13); + assertEquals(calendar.getTime(), entry.getDob()); + assertNull(entry.getDocuments()); + + TamrDerogListUpdate derogListUpdate = + new TamrDerogListUpdate(derogList); + + ObjectMapper mapper = new ObjectMapper(); + String derogListUpdateJson = mapper.writer() + .writeValueAsString(derogListUpdate); + + assertEquals( + "{\"passengers\":[" + + "{\"gtasId\":\"1\",\"firstName\":\"SHING\",\"middleName\":null,\"lastName\":\"QUAN\",\"gender\":null,\"dob\":\"1998-08-08\",\"documents\":null,\"citizenshipCountry\":null,\"derogId\":\"1\"}," + + "{\"gtasId\":\"3\",\"firstName\":\"FRIEDA\",\"middleName\":null,\"lastName\":\"DARRINGTON\",\"gender\":null,\"dob\":\"1963-08-13\",\"documents\":null,\"citizenshipCountry\":null,\"derogId\":\"3\"}" + + "]}", + derogListUpdateJson); } + } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java new file mode 100644 index 0000000000..d71168e0e8 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java @@ -0,0 +1,116 @@ +package gov.gtas.parsers.tamr; + +import static org.junit.Assert.*; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + +import java.util.Collections; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import gov.gtas.model.PassengerIDTag; +import gov.gtas.parsers.ParserTestHelper; +import gov.gtas.parsers.tamr.model.TamrHistoryCluster; +import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrTravelerResponse; +import gov.gtas.repository.PassengerIDTagRepository; + +/** + * Test the handling of messages from Tamr that are supposed to update the + * Tamr cluster IDs stored in GTAS. These include QUERY responses and + * TH.DELTA and TH.CLUSTER messages. + */ +public class UpdateTamrIdTest implements ParserTestHelper { + private TamrMessageHandlerService handler; + private PassengerIDTagRepository passengerIDTagRepository; + + private static final long gtasId = 17957625; + private static final String newTamrId = + "c50feffb-a991-357f-a06e-0a034284d523"; + + @Before + public void setUp() { + this.handler = new TamrMessageHandlerServiceImpl(); + this.passengerIDTagRepository = mock(PassengerIDTagRepository.class); + ReflectionTestUtils.setField(handler, + "passengerIDTagRepository", passengerIDTagRepository); + + // Set up the PassengerIDTagRepository to return a dummy instance when + // queried. + PassengerIDTag passengerIdTag = new PassengerIDTag(); + passengerIdTag.setPax_id(gtasId); + given(passengerIDTagRepository.findByPaxId(gtasId)).willReturn( + passengerIdTag); + } + + @Test + public void testQueryResponse() { + TamrTravelerResponse travelerResponse = new TamrTravelerResponse(); + travelerResponse.setGtasId(Long.toString(gtasId)); + travelerResponse.setDerogIds(Collections.emptyList()); + travelerResponse.setTamrId(newTamrId); + travelerResponse.setVersion(1); + travelerResponse.setScore(1); + + TamrMessage message = new TamrMessage(); + message.setTravelerQuery(Collections.singletonList(travelerResponse)); + + handler.handleQueryResponse(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, newTamrId); + } + + @Test + public void testDeltaMessageUpdate() { + TamrHistoryCluster historyCluster = new TamrHistoryCluster(); + historyCluster.setGtasId(Long.toString(gtasId)); + historyCluster.setTamrId(newTamrId); + historyCluster.setVersion(1); + historyCluster.setAction("UPDATE"); + + TamrMessage message = new TamrMessage(); + message.setHistoryClusters(Collections.singletonList(historyCluster)); + + handler.handleTamrIdUpdate(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, newTamrId); + } + + @Test + public void testDeltaMessageDelete() { + TamrHistoryCluster historyCluster = new TamrHistoryCluster(); + historyCluster.setGtasId(Long.toString(gtasId)); + historyCluster.setTamrId(null); + historyCluster.setVersion(1); + historyCluster.setAction("DELETE"); + + TamrMessage message = new TamrMessage(); + message.setHistoryClusters(Collections.singletonList(historyCluster)); + + handler.handleTamrIdUpdate(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, null); + } + + @Test + public void testClusterMessage() { + TamrHistoryCluster historyCluster = new TamrHistoryCluster(); + historyCluster.setGtasId(Long.toString(gtasId)); + historyCluster.setTamrId(newTamrId); + historyCluster.setVersion(1); + historyCluster.setAction(null); + + TamrMessage message = new TamrMessage(); + message.setHistoryClusters(Collections.singletonList(historyCluster)); + + handler.handleTamrIdUpdate(message); + + verify(passengerIDTagRepository).updateTamrId( + gtasId, newTamrId); + } +} From 328cb81ec89b50823e6a55ed3ed37903b09e161b Mon Sep 17 00:00:00 2001 From: Aaron Solomon Date: Tue, 28 Jan 2020 14:39:00 -0500 Subject: [PATCH 28/83] upading inbound queue --- .../main/java/gov/gtas/job/scheduler/LoaderScheduler.java | 2 +- .../java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index e55c32ad43..221d0ec8a3 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -115,7 +115,7 @@ private void processSingleFile(File f, LoaderStatistics stats, String[] primeFli if (tamrEnabled) { List passToSend = processedMessages.getTamrPassengers(); logger.info(String.valueOf(passToSend.size())); - tamrMessageSender.sendMessageToTamr("Inbound", passToSend); + tamrMessageSender.sendMessageToTamr("InboundQueue", passToSend); } if (result != null) { diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java index ab5cedf8e1..93aed62398 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java @@ -35,11 +35,6 @@ public class TamrMessageSender { @Autowired TamrQueueConfig queueConfig; - public ConnectionFactory connectionFactory() { - // Add tamr connection details here. - return new ActiveMQConnectionFactory(""); - } - public boolean sendMessageToTamr(String queue, List passengers) throws Exception { logger.info("############### Attempting to craft tamr message .... ################"); jmsTemplateFile.setDefaultDestinationName(queue); From b9a7c60261e4def400c8a6566973994621884ae9 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Tue, 28 Jan 2020 18:29:40 -0500 Subject: [PATCH 29/83] Revert Aaron's accidentally committed changes --- copy.sh | 3 --- gtas-parent/gtas-webapp/pom.xml | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) delete mode 100755 copy.sh diff --git a/copy.sh b/copy.sh deleted file mode 100755 index b3f1488ab2..0000000000 --- a/copy.sh +++ /dev/null @@ -1,3 +0,0 @@ -fswatch -o gtas-parent | while read f; do - rsync -avz -e ssh --exclude="target/" --exclude="node_modules/" --prune-empty-dirs gtas-parent 10.20.0.147:/home/aaronsolomon/gtas/GTAS -done \ No newline at end of file diff --git a/gtas-parent/gtas-webapp/pom.xml b/gtas-parent/gtas-webapp/pom.xml index 7f0d647068..ae3632041b 100644 --- a/gtas-parent/gtas-webapp/pom.xml +++ b/gtas-parent/gtas-webapp/pom.xml @@ -257,7 +257,7 @@ v8.11.1 - + From 75a88b79a39d38b2943b0047b22e1d82e02fd246 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Tue, 28 Jan 2020 18:48:04 -0500 Subject: [PATCH 30/83] Fix another accidental change from Aaron's PR --- .../main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java index 29f77403f7..26a22c1387 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java @@ -19,7 +19,7 @@ import org.springframework.jms.config.JmsListenerContainerFactory; @Configuration -//@ConditionalOnProperty(prefix = "tamr", name = "enabled") +@ConditionalOnProperty(prefix = "tamr", name = "enabled") @EnableJms public class TamrQueueConfig { From 1d2d502401e2eabe2de8b6d9aa65c8fbc4561393 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Wed, 29 Jan 2020 09:22:13 -0500 Subject: [PATCH 31/83] Stub TamrIT integration test --- .../gtas/job/scheduler/LoaderScheduler.java | 2 +- .../java/gov/gtas/job/scheduler/TamrIT.java | 104 ++++++++++++++++++ .../scheduler/TamrIntegrationTestConfig.java | 32 ++++++ .../resources/tamr.application.properties | 1 + 4 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestConfig.java create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index a344cadf02..3be5a231be 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -100,7 +100,7 @@ public String toString() { @Value("${tamr.enabled}") private Boolean tamrEnabled; - private void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) throws Exception { + void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) throws Exception { logger.debug(String.format("Processing %s", f.getAbsolutePath())); ProcessedMessages processedMessages = loader.processMessage(f, primeFlightKey); int[] result = processedMessages.getProcessed(); diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java new file mode 100644 index 0000000000..ddf7ca9a96 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java @@ -0,0 +1,104 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.job.scheduler; + +import java.io.File; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +import gov.gtas.config.CachingConfig; +import gov.gtas.config.TestCommonServicesConfig; +import gov.gtas.job.scheduler.LoaderScheduler; +import gov.gtas.parsers.exception.ParseException; +import gov.gtas.services.LoaderStatistics; + +/** + * End-to-end integration tests with Tamr. + * @author Cassidy Laidlaw + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { TestCommonServicesConfig.class, CachingConfig.class }) +@Rollback(true) +public class TamrIT extends AbstractTransactionalJUnit4SpringContextTests { + private File flightMessage1; + private File flightMessage2; + + @Autowired + private LoaderScheduler loaderScheduler; + + @Before + public void setUp() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + // TODO: edit file paths + this.flightMessage1 = new File( + classLoader.getResource("tamr.application.properties").getFile()); + this.flightMessage2 = new File( + classLoader.getResource("tamr.application.properties").getFile()); + } + + private void createWatchlistItems() { + // TODO: implement + } + + private void sendWatchlistItemsToTamr() { + // TODO: implement + } + + private void assertDerogListReceived() { + // TODO: implement + } + + private void loadFlight(File messageFile, String[] primeFlightKey) + throws Exception { + LoaderStatistics stats = new LoaderStatistics(); + loaderScheduler.processSingleFile(messageFile, stats, primeFlightKey); + } + + private void assertPassengersReceived(String passengerJson) { + // TODO: implement + } + + private void respondWithTravelerHistories(String historiesJson) { + // TODO: implement + } + + private void respondWithDerogHits(String derogHitsJson) { + // TODO: implement + } + + @Test() + @Transactional + public void testTamrIntegration() throws ParseException, Exception { + this.createWatchlistItems(); + this.sendWatchlistItemsToTamr(); + this.assertDerogListReceived(); + + // Flight 1 + this.loadFlight(flightMessage1, new String[] { "flight 1 key TODO" }); + this.assertPassengersReceived("flight 1 travelers TODO"); + this.respondWithTravelerHistories("flight 1 histories TODO"); + // TODO: assert tamrIds set for passengers. + this.respondWithDerogHits("flight 1 derog hits TODO"); + // TODO: check HitDetail is created. + + // Flight 2 + this.loadFlight(flightMessage2, new String[] { "flight 2 key TODO" }); + this.assertPassengersReceived("flight 2 travelers TODO"); + this.respondWithTravelerHistories("flight 2 histories TODO"); + // TODO: check tamrIds set for passengers. + + // TODO: check traveler history groups passengers with same tamrId. + } +} diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestConfig.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestConfig.java new file mode 100644 index 0000000000..5513807b45 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestConfig.java @@ -0,0 +1,32 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.job.scheduler; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import gov.gtas.config.TestCommonServicesConfig; + +/** + * The configuration class can be imported into an XML configuration by:
+ * + * + */ +@Configuration +@ComponentScan("gov.gtas") +@PropertySource({ + "classpath:default.application.properties", + "classpath:tamr.application.properties" +}) +@EnableJpaRepositories("gov.gtas") +@EnableTransactionManagement +@Import({ TestCommonServicesConfig.class }) +public class TamrIntegrationTestConfig { +} diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties new file mode 100644 index 0000000000..cdf1168552 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties @@ -0,0 +1 @@ +tamr.enabled=true \ No newline at end of file From 81a093cd3d0a539e6e61a265057643375b8b3177 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Thu, 30 Jan 2020 16:02:38 -0500 Subject: [PATCH 32/83] Fix a couple issues with sending messages from GTAS to Tamr --- .../parsers/tamr/jms/TamrMessageSender.java | 20 +++++++++---------- .../parsers/tamr/jms/TamrQueueConfig.java | 14 +------------ 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java index 93aed62398..c53931670c 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java @@ -27,27 +27,26 @@ public class TamrMessageSender { private final Logger logger = LoggerFactory.getLogger(TamrMessageSender.class); - private TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); - @Autowired - JmsTemplate jmsTemplateFile; + JmsTemplate jmsTemplate; @Autowired TamrQueueConfig queueConfig; - + public boolean sendMessageToTamr(String queue, List passengers) throws Exception { - logger.info("############### Attempting to craft tamr message .... ################"); - jmsTemplateFile.setDefaultDestinationName(queue); - jmsTemplateFile.setConnectionFactory(queueConfig.cachingConnectionFactory()); + logger.info("Sending passengers to Tamr..."); + if (jmsTemplate == null) { + this.jmsTemplate = new JmsTemplate( + queueConfig.senderConnectionFactory()); + } TamrQuery tamrQuery = new TamrQuery(passengers); ObjectMapper mapper = new ObjectMapper(); String tamrQueryJson = mapper.writer().writeValueAsString(tamrQuery); - logger.info("Query:"); - logger.info(tamrQueryJson); + logger.debug("QUERY {}", tamrQueryJson); - jmsTemplateFile.send(new MessageCreator() { + jmsTemplate.send(queue, new MessageCreator() { public Message createMessage(Session session) throws JMSException { Message message = session.createTextMessage(tamrQueryJson); message.setJMSType("QUERY"); @@ -57,4 +56,5 @@ public Message createMessage(Session session) throws JMSException { return true; } + } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java index 26a22c1387..9c9bf069f0 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrQueueConfig.java @@ -11,11 +11,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; -import org.springframework.jms.core.JmsTemplate; import org.springframework.context.annotation.Configuration; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; -import org.springframework.jms.connection.CachingConnectionFactory; import org.springframework.jms.config.JmsListenerContainerFactory; @Configuration @@ -31,7 +29,7 @@ public class TamrQueueConfig { @Bean public JmsListenerContainerFactory tamrJmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); - + factory.setConnectionFactory( new ActiveMQConnectionFactory(activeMQBrokerUrl)); factory.setSessionTransacted(true); @@ -47,14 +45,4 @@ public ActiveMQConnectionFactory senderConnectionFactory() { return aMQConnection; } - @Bean - public CachingConnectionFactory cachingConnectionFactory() { - return new CachingConnectionFactory(senderConnectionFactory()); - } - - @Bean - public JmsTemplate jmsTemplate() { - return new JmsTemplate(cachingConnectionFactory()); - } - } From ec62b145456e34c3a94c839eaa4784152c093084 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Thu, 30 Jan 2020 17:15:57 -0500 Subject: [PATCH 33/83] Complete Tamr integration test for passenger history matching Still need to write derog hit test. --- .../gov/gtas/model/FlightPassengerCount.java | 2 +- .../java/gov/gtas/model/MessageStatus.java | 2 +- .../gov/gtas/model/MutableFlightDetails.java | 2 +- .../java/gov/gtas/job/scheduler/TamrIT.java | 230 +++++++++++++----- .../scheduler/TamrIntegrationTestUtils.java | 108 ++++++++ .../java/gov/gtas/job/scheduler/TamrMock.java | 124 ++++++++++ .../tamr-integration-data/flight1.txt | 183 ++++++++++++++ .../tamr-integration-data/flight2.txt | 189 ++++++++++++++ .../tamr-integration-data/flight3.txt | 182 ++++++++++++++ 9 files changed, 952 insertions(+), 70 deletions(-) create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight1.txt create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java index 51c41e01b6..793725333b 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java @@ -10,7 +10,7 @@ public class FlightPassengerCount { @Column(name = "fp_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(optional = false, fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fp_flight_id", referencedColumnName = "id", updatable = false, insertable = false) private Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java index ed4c0f6c11..37ec79e7b2 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java @@ -16,7 +16,7 @@ public class MessageStatus { @Column(name = "ms_message_id", columnDefinition = "bigint unsigned") private Long messageId; - @OneToOne(optional = false, fetch = FetchType.EAGER) + @OneToOne(fetch = FetchType.EAGER) @JoinColumn(name = "ms_message_id", referencedColumnName = "id", updatable = false, insertable = false) private Message message; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java index a4c97ec142..c74006153f 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java @@ -19,7 +19,7 @@ public MutableFlightDetails(Long id) { @Column(name = "flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(optional = false, fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "flight_id", referencedColumnName = "id", updatable = false, insertable = false) private Flight flight; diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java index ddf7ca9a96..127808668a 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java @@ -5,7 +5,13 @@ */ package gov.gtas.job.scheduler; +import static org.junit.Assert.*; + import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; import org.junit.Before; import org.junit.Test; @@ -17,11 +23,16 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; -import gov.gtas.config.CachingConfig; +import com.google.common.collect.Iterables; + import gov.gtas.config.TestCommonServicesConfig; -import gov.gtas.job.scheduler.LoaderScheduler; -import gov.gtas.parsers.exception.ParseException; +import gov.gtas.model.Flight; +import gov.gtas.model.Passenger; +import gov.gtas.repository.FlightRepository; +import gov.gtas.repository.PassengerIDTagRepository; +import gov.gtas.repository.PassengerRepository; import gov.gtas.services.LoaderStatistics; +import gov.gtas.services.PassengerService; /** * End-to-end integration tests with Tamr. @@ -29,76 +40,161 @@ * */ @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { TestCommonServicesConfig.class, CachingConfig.class }) +@ContextConfiguration(classes = { TestCommonServicesConfig.class }) @Rollback(true) public class TamrIT extends AbstractTransactionalJUnit4SpringContextTests { - private File flightMessage1; - private File flightMessage2; - - @Autowired - private LoaderScheduler loaderScheduler; + private ClassLoader classLoader; + + @Autowired + private LoaderScheduler loaderScheduler; - @Before - public void setUp() throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); - // TODO: edit file paths - this.flightMessage1 = new File( - classLoader.getResource("tamr.application.properties").getFile()); - this.flightMessage2 = new File( - classLoader.getResource("tamr.application.properties").getFile()); - } + @Autowired + private FlightRepository flightRepository; + + @Autowired + private PassengerRepository passengerRepository; + + @Autowired + private PassengerService passengerService; + + @Autowired + private PassengerIDTagRepository passengerIDTagRepository; + + @Autowired + private TamrIntegrationTestUtils tamrUtils; + + @Autowired + private TamrMock tamrMock; - private void createWatchlistItems() { - // TODO: implement - } - - private void sendWatchlistItemsToTamr() { - // TODO: implement - } - - private void assertDerogListReceived() { - // TODO: implement - } - - private void loadFlight(File messageFile, String[] primeFlightKey) - throws Exception { - LoaderStatistics stats = new LoaderStatistics(); - loaderScheduler.processSingleFile(messageFile, stats, primeFlightKey); - } - - private void assertPassengersReceived(String passengerJson) { + @Before + public void setUp() throws Exception { + classLoader = getClass().getClassLoader(); + } + + private void createWatchlistItems() { // TODO: implement - } - - private void respondWithTravelerHistories(String historiesJson) { + } + + private void sendWatchlistItemsToTamr() { // TODO: implement - } - - private void respondWithDerogHits(String derogHitsJson) { + } + + private void assertDerogListReceived() { // TODO: implement - } - - @Test() - @Transactional - public void testTamrIntegration() throws ParseException, Exception { - this.createWatchlistItems(); - this.sendWatchlistItemsToTamr(); - this.assertDerogListReceived(); + } + + private void loadFlight(String messageFilePath, String[] primeFlightKey) + throws Exception { + File messageFile = new File(classLoader.getResource( + messageFilePath).getFile()); + LoaderStatistics stats = new LoaderStatistics(); + loaderScheduler.processSingleFile(messageFile, stats, primeFlightKey); + } + + private long getPassengerIdFromName(String firstName, String lastName) { + Long passengerId = null; + for (Flight flight: flightRepository.findAll()) { + Set passengers = + passengerRepository.returnAPassengerFromParameters( + flight.getId(), firstName, lastName); + if (passengers.isEmpty()) { + // Keep trying more flights. + } else { + assertEquals(1, passengers.size()); + if (passengerId == null) { + passengerId = Iterables.getOnlyElement(passengers).getId(); + } else { + fail(String.format("Multiple passengers matched %s %s", + firstName, lastName)); + } + } + } + assertNotNull(passengerId); + return passengerId; + } + + /** + * Makes sure the tamrIds match for the passengers with the given names + * and also that GTAS traveler history groups them together. + */ + private void assertTamrIdsMatch(String ...names) { + Set passengerIds = Arrays.stream(names).map((name) -> { + String[] nameParts = name.split(" "); + assertEquals(2, nameParts.length); + String firstName = nameParts[0], lastName = nameParts[1]; + return getPassengerIdFromName(firstName, lastName); + }).collect(Collectors.toSet()); + + Set tamrIds = passengerIds.stream() + .map((passengerId) -> passengerIDTagRepository + .findByPaxId(passengerId).getTamrId()) + .collect(Collectors.toSet()); + // Should be only one tamrId for all these passengers. + assertEquals(1, tamrIds.size()); + + for (long passengerId: passengerIds) { + Set historyMatches = passengerService + .getBookingDetailHistoryByPaxID(passengerId) + .stream() + .map((passenger) -> passenger.getId()) + .collect(Collectors.toSet()); + // Looking up booking history should give all matching passengers. + assertEquals(passengerIds, historyMatches); + } + } + + @Test + @Transactional + public void testTamrIntegration() throws Exception { + tamrUtils.disableJmsListeners(); + + this.createWatchlistItems(); + this.sendWatchlistItemsToTamr(); + this.assertDerogListReceived(); + + // Flight 1 + this.loadFlight( + "tamr-integration-data/flight1.txt", + new String[] { "SCL", "JFK", "LA", "0532", + "1579392000000", "1579394000000" } + ); + // 10 passengers should be processed by Tamr. + assertEquals(10, tamrMock.respondToQuery()); + // Let GTAS process responses (should be 2). + assertEquals(2, tamrUtils.synchronouslyProcessMessagesFromTamr()); + + // TODO: check derog hits. + + // Flight 2 + this.loadFlight( + "tamr-integration-data/flight2.txt", + new String[] { "IAD", "BRU", "YY", "0123", + "1587686400000", "1587686500000" } + ); + // 10 passengers should be processed by Tamr. + assertEquals(10, tamrMock.respondToQuery()); + + // Flight 3 + this.loadFlight( + "tamr-integration-data/flight3.txt", + new String[] { "KEF", "JFK", "FI", "0615", + "1582675200000", "1582675400000" } + ); + // 10 passengers should be processed by Tamr. + assertEquals(10, tamrMock.respondToQuery()); + + // Let GTAS process responses (should be 4). + assertEquals(4, tamrUtils.synchronouslyProcessMessagesFromTamr()); + tamrUtils.synchronouslyProcessMessagesFromTamr(); - // Flight 1 - this.loadFlight(flightMessage1, new String[] { "flight 1 key TODO" }); - this.assertPassengersReceived("flight 1 travelers TODO"); - this.respondWithTravelerHistories("flight 1 histories TODO"); - // TODO: assert tamrIds set for passengers. - this.respondWithDerogHits("flight 1 derog hits TODO"); - // TODO: check HitDetail is created. - - // Flight 2 - this.loadFlight(flightMessage2, new String[] { "flight 2 key TODO" }); - this.assertPassengersReceived("flight 2 travelers TODO"); - this.respondWithTravelerHistories("flight 2 histories TODO"); - // TODO: check tamrIds set for passengers. - - // TODO: check traveler history groups passengers with same tamrId. - } + assertTamrIdsMatch( + "HSIUYUAN JIANG", + "XIUYUAN JIANG", + "XIUYUAN CHIANG" + ); + assertTamrIdsMatch( + "GAYLA JOSEPH", + "GAELLA JOSEPH" + ); + } } diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java new file mode 100644 index 0000000000..344eaf90f4 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java @@ -0,0 +1,108 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.job.scheduler; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.Session; +import javax.jms.TextMessage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.config.JmsListenerEndpointRegistry; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.core.MessageCreator; +import org.springframework.jms.listener.DefaultMessageListenerContainer; +import org.springframework.jms.listener.MessageListenerContainer; +import org.springframework.stereotype.Component; + +import gov.gtas.parsers.tamr.jms.TamrMessageReceiver; +import gov.gtas.parsers.tamr.jms.TamrQueueConfig; + + +/** + * Utilities for testing Tamr integration. + */ +@Component +public class TamrIntegrationTestUtils { + + private final Logger logger = LoggerFactory.getLogger(TamrIntegrationTestUtils.class); + + private JmsTemplate jmsTemplate; + + @Autowired + private JmsListenerEndpointRegistry jmsListenerRegistry; + + @Autowired + private TamrQueueConfig tamrQueueConfig; + + @Autowired + private TamrMessageReceiver tamrMessageReceiver; + + private void configureJmsTemplate() { + if (jmsTemplate == null) { + this.jmsTemplate = new JmsTemplate( + tamrQueueConfig.senderConnectionFactory()); + this.jmsTemplate.setReceiveTimeout(1000); + } + } + + /** + * Disables JMS listeners, since they are problematic for transactional + * tests (anything run by the listener will be outside the test + * transaction). After calling this, call + * synchronouslyProcessMessagesFromTamr to process all messages from Tamr + * within the test transaction. + */ + public void disableJmsListeners() { + for (MessageListenerContainer container: jmsListenerRegistry.getListenerContainers()) { + if (container instanceof DefaultMessageListenerContainer) { + ((DefaultMessageListenerContainer) container).shutdown(); + } else { + container.stop(); + } + } + } + + /** + * Returns a message that was sent to Tamr by GTAS, waiting up to 3 + * seconds for one to become available. If there is no message sent to + * Tamr in the given timeout, returns null. + */ + public TextMessage getMessageSentToTamr() { + this.configureJmsTemplate(); + return (TextMessage) jmsTemplate.receive("InboundQueue"); + } + + public void sendMessageToGtasFromTamr(String messageType, String messageText) { + jmsTemplate.send("OutboundQueue", new MessageCreator() { + public Message createMessage(Session session) throws JMSException { + Message message = session.createTextMessage(messageText); + message.setJMSType(messageType); + return message; + } + }); + } + + /** + * Sends all messages received from Tamr to the TamrMessageReceiver. + * Calling this method after disableJmsListeners() will ensure that + * any receiver logic that accesses the database will run within the + * test transaction. + */ + public int synchronouslyProcessMessagesFromTamr() { + this.configureJmsTemplate(); + int messagesProcessed = 0; + Message message; + while ((message = jmsTemplate.receive("OutboundQueue")) != null) { + tamrMessageReceiver.receive(message); + messagesProcessed += 1; + } + return messagesProcessed; + } + +} diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java new file mode 100644 index 0000000000..243d8348b1 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java @@ -0,0 +1,124 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.job.scheduler; + +import static org.junit.Assert.*; + +import java.util.Map; +import java.util.StringJoiner; +import java.util.UUID; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.jms.JMSException; +import javax.jms.TextMessage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +/** + * A mock of the functionality Tamr provides, for performing integration + * testing against. + */ +@Component +public class TamrMock { + + private final Logger logger = LoggerFactory.getLogger(TamrMock.class); + + private final static String queryPassengerRegex = + "\\{\"gtasId\":\"(?\\d+)\",\"firstName\":\"(?[^\"]+)\",\"middleName\":[\"\\w ]+,\"lastName\":\"(?[^\"]+)\",\"gender\":\"[MF]\",\"dob\":\"(?[^\"]+)\",\"documents\":\\[[^\\]]+\\],\"citizenshipCountry\":\\[[^\\]]+\\]\\}"; + private final static String queryRegex = + "\\{\"passengers\":\\[(?:" + queryPassengerRegex + ",?)+\\]\\}"; + + private final static Map nameToTamrId = new HashMap() {{ + put("HSIUYUAN JIANG", "00738a54-e024-3dcf-9df0-6a982022c8ea"); + put("XIUYUAN JIANG", "00738a54-e024-3dcf-9df0-6a982022c8ea"); + put("XIUYUAN CHIANG", "00738a54-e024-3dcf-9df0-6a982022c8ea"); + + put("GAYLA JOSEPH", "00647e30-95ba-31a9-8660-2143e7dae0d3"); + put("GAELLA JOSEPH", "00647e30-95ba-31a9-8660-2143e7dae0d3"); + }}; + + @Autowired + private TamrIntegrationTestUtils tamrUtils; + + /** + * Get the JSON clustering information Tamr should return for a single + * passenger with the given gtasId and name. + */ + private String getPassengerHistoryResponse(String gtasId, String name) { + String tamrId = nameToTamrId.get(name); + if (tamrId == null) { + tamrId = UUID.randomUUID().toString(); + } + + return String.format("{\"gtasId\":\"%s\",\"derogIds\":[],\"tamrId\":\"%s\",\"version\":1,\"score\":1.0}", + gtasId, tamrId); + } + + /** + * Get the JSON derog hit information Tamr should return for a single + * passenger with the given gtasId and name. + */ + private String getPassengerDerogResponse(String gtasId, String name) { + // TODO: implement + return String.format("{\"gtasId\":\"%s\",\"derogIds\":[],\"tamrId\":null,\"version\":-1,\"score\":0.0}", + gtasId); + } + + /** + * Responds to a QUERY message that has been sent to the ActiveMQ broker. + * Returns the number of passengers processed. + */ + public int respondToQuery() throws JMSException { + TextMessage queryMessage = tamrUtils.getMessageSentToTamr(); + assertNotNull(queryMessage); + assertEquals("QUERY", queryMessage.getJMSType()); + + String queryJson = queryMessage.getText(); + logger.info("Processing QUERY message."); + + // First, make sure the entire message is well-formed. + Matcher queryMatcher = Pattern.compile(queryRegex).matcher(queryJson); + assertTrue(queryMatcher.matches()); + + StringJoiner historiesResponseJoiner = new StringJoiner( + ",", "{\"travelerQuery\":[", "]}"); + StringJoiner derogsResponseJoiner = new StringJoiner( + ",", "{\"travelerQuery\":[", "]}"); + + // Then, extract the individual passengers and build responses. + int passengersProcessed = 0; + Matcher passengerMatcher = Pattern.compile(queryPassengerRegex) + .matcher(queryJson); + while (passengerMatcher.find()) { + String gtasId = passengerMatcher.group("gtasId"); + String name = passengerMatcher.group("firstName") + " " + + passengerMatcher.group("lastName"); + + historiesResponseJoiner.add( + getPassengerHistoryResponse(gtasId, name)); + derogsResponseJoiner.add( + getPassengerDerogResponse(gtasId, name)); + + passengersProcessed += 1; + } + + // Finally, send messages back to GTAS from Tamr mock. + logger.info("Processed {} passengers. Responding with histories and derog hits.", + passengersProcessed); + tamrUtils.sendMessageToGtasFromTamr("QUERY", + historiesResponseJoiner.toString()); + tamrUtils.sendMessageToGtasFromTamr("QUERY", + derogsResponseJoiner.toString()); + + return passengersProcessed; + } +} diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight1.txt b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight1.txt new file mode 100644 index 0000000000..b33a5cd4e0 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight1.txt @@ -0,0 +1,183 @@ +UNB+UNOA:4+LUFTHANSA:ZZ+HDQCH2X:ZZ+200130:0300+123456789++PAXLST' +UNH+53371718146010+PAXLST:D:02B:UN:IATA' +BGM+745' +NAD+MS+++WORLD CUSTOMS ORGANIZATION BRU' +COM+17037919383:TE' +TDT+20+LA532' +LOC+125+SCL' +DTM+189:2001192300:201' +LOC+87+JFK' +DTM+232:2001200740:201' +NAD+FL+++JIANG:HSIUYUAN:' +ATT+2++F' +DTM+329:670603' +MEA+CT++1' +MEA+WT++KGM:13' +FTX+BAG+++2660001' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+CHN' +NAT+2+CHN' +RFF+AVF:7F5F21' +RFF+SEA:056F' +DOC++433419360' +DTM+36:230920' +LOC+91+CHN' +DOC+V+57131424' +DTM+36:210729' +LOC+91+USA' +NAD+FL+++CAPONE:LISA:ALVINA' +ATT+2++F' +DTM+329:720805' +MEA+CT++1' +MEA+WT++KGM:44' +FTX+BAG+++2660002' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:65A6BB' +RFF+SEA:019F' +DOC+P+907316631' +DTM+36:251103' +LOC+91+USA' +NAD+FL+++CANNON:ALEXANDRA:EVA' +ATT+2++F' +DTM+329:850914' +MEA+CT++4' +MEA+WT++KGM:0' +FTX+BAG+++2660003' +FTX+BAG+++2660004' +FTX+BAG+++SU0005' +FTX+BAG+++2660006' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:647DA3' +RFF+SEA:088C' +DOC+P+396949747' +DTM+36:261205' +LOC+91+' +DOC+V+86443634' +DTM+36:200517' +LOC+91+USA' +NAD+FL+++STEFANSKI:GUY:GUILLERMO' +ATT+2++M' +DTM+329:611021' +MEA+CT++1' +MEA+WT++KGM:0' +FTX+BAG+++2660007' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:647DA3' +RFF+SEA:020B' +DOC+P+816522620' +DTM+36:240229' +LOC+91+USA' +NAD+FL+++JOSEPH:GAYLA:COOKE' +ATT+2++F' +DTM+329:700202' +MEA+CT++1' +MEA+WT++KGM:15' +FTX+BAG+++2660008' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:647DA3' +RFF+SEA:072A' +DOC+P+276616110' +DTM+36:210131' +LOC+91+GBR' +DOC+V+07970853' +DTM+36:200208' +LOC+91+USA' +NAD+FL+++NOOD:TEGAN:EMILY' +ATT+2++F' +DTM+329:641221' +MEA+CT++2' +MEA+WT++KGM:32' +FTX+BAG+++2660009:2' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:647DA3' +RFF+SEA:046A' +DOC+P+611192669' +DTM+36:211026' +LOC+91+GBR' +DOC+V+95130935' +DTM+36:210723' +LOC+91+USA' +NAD+FL+++CROUCH:MILES:RODGER' +ATT+2++M' +DTM+329:971102' +MEA+CT++1' +MEA+WT++KGM:11' +FTX+BAG+++2660011' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:647DA3' +RFF+SEA:084K' +DOC+P+67972726' +DTM+36:181223' +LOC+91+USA' +NAD+FL+++MUNOZ:CHARLES:STEVE' +ATT+2++M' +DTM+329:410108' +MEA+CT++1' +MEA+WT++KGM:15' +FTX+BAG+++2660012' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:0AE5BF' +RFF+SEA:047F' +DOC+P+910936537' +DTM+36:190928' +LOC+91+USA' +NAD+FL+++HARPOLE:AIDA:REBBECA' +ATT+2++F' +DTM+329:800420' +MEA+CT++2' +MEA+WT++KGM:88' +FTX+BAG+++2660013' +FTX+BAG+++2660014' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:0AE5BF' +RFF+SEA:050K' +DOC+P+118810667' +DTM+36:190706' +LOC+91+USA' +NAD+FL+++O GRADY:EMMA:MAISIE' +ATT+2++F' +DTM+329:000520' +MEA+CT++2' +MEA+WT++KGM:48' +FTX+BAG+++2660015' +FTX+BAG+++2660016' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:0AE5BF' +RFF+SEA:054K' +DOC+P+209415811' +DTM+36:180805' +LOC+91+GBR' +DOC+V+39528517' +DTM+36:191217' +LOC+91+USA' +CNT+42:10' +UNT+23+53371718146010' +UNZ+1+123456789' diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt new file mode 100644 index 0000000000..eacca51ab0 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt @@ -0,0 +1,189 @@ +UNB+UNOA:4+LUFTHANSA:ZZ+HDQCH2X:ZZ+200130:0300+123456789++PAXLST' +UNH+53371718146010+PAXLST:D:02B:UN:IATA' +BGM+745' +NAD+MS+++WORLD CUSTOMS ORGANIZATION BRU' +COM+17037919383:TE' +TDT+20+YY123' +LOC+125+IAD' +DTM+189:2004241200:201' +LOC+87+BRU' +DTM+232:2004241322:201' +NAD+FL+++MCLOUGHLIN:BEN:HARRY' +ATT+2++M' +DTM+329:461007' +MEA+CT++2' +MEA+WT++KGM:79' +FTX+BAG+++2660017' +FTX+BAG+++2660018' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:BD6A38' +RFF+SEA:045H' +DOC+P+563056942' +DTM+36:200909' +LOC+91+GBR' +DOC+V+67379768' +DTM+36:200522' +LOC+91+USA' +NAD+FL+++DELEON:ANGELA:THERESA' +ATT+2++F' +DTM+329:530919' +MEA+CT++1' +MEA+WT++KGM:53' +FTX+BAG+++2660019' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:C64EDF' +RFF+SEA:071F' +DOC+P+792869438' +DTM+36:170724' +LOC+91+USA' +NAD+FL+++MUHLBAUER:JINDRA:SABINA' +ATT+2++F' +DTM+329:560128' +MEA+CT++1' +MEA+WT++KGM:35' +FTX+BAG+++2660020' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+ERI' +NAT+2+ERI' +RFF+AVF:C64EDF' +RFF+SEA:047G' +DOC+P+741425896' +DTM+36:190807' +LOC+91+ERI' +DOC+V+12781931' +DTM+36:200826' +LOC+91+USA' +NAD+FL+++OBRIEN:HARLEY:ELLIS' +ATT+2++M' +DTM+329:931128' +MEA+CT++4' +MEA+WT++KGM:56' +FTX+BAG+++2660021' +FTX+BAG+++2660022' +FTX+BAG+++SU0023' +FTX+BAG+++2660024' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:C64EDF' +RFF+SEA:078J' +DOC+P+489741956' +DTM+36:240423' +LOC+91+GBR' +DOC+V+77328686' +DTM+36:200729' +LOC+91+USA' +NAD+FL+++WARREN:KAYLEIGH:ELOISE' +ATT+2++F' +DTM+329:010328' +MEA+CT++1' +MEA+WT++KGM:29' +FTX+BAG+++2660025' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:CE9203' +RFF+SEA:063A' +DOC+P+291326056' +DTM+36:260614' +LOC+91+GBR' +DOC+V+59088135' +DTM+36:210416' +LOC+91+USA' +NAD+FL+++STRINGER:WILLIAM:MORGAN' +ATT+2++M' +DTM+329:960125' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:72C51C' +RFF+SEA:058K' +DOC+P+91950436' +DTM+36:170331' +LOC+91+GBR' +DOC+V+39947468' +DTM+36:210612' +LOC+91+USA' +NAD+FL+++JIANG:XIUYUAN:' +ATT+2++F' +DTM+329: 670603' +MEA+CT++1' +MEA+WT++KGM:40' +FTX+BAG+++2660162' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+CHN' +NAT+2+CHN' +RFF+AVF:574397' +RFF+SEA:082B' +DOC+P+461448207' +DTM+36:210226' +LOC+91+CHN' +DOC+V+19495986' +DTM+36:200815' +LOC+91+USA' +NAD+FL+++SPOONER:GROVER:RUBIN' +ATT+2++M' +DTM+329:721223' +MEA+CT++1' +MEA+WT++KGM:33' +FTX+BAG+++2660028' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:48225A' +RFF+SEA:068E' +DOC+P+115610430' +DTM+36:260110' +LOC+91+USA' +NAD+FL+++JOSEPH:GAELLA:COOK' +ATT+2++M' +DTM+329:700202' +MEA+CT++1' +MEA+WT++KGM:48' +FTX+BAG+++2660200' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:3D7C5C' +RFF+SEA:060J' +DOC+P+581607302' +DTM+36:210107' +LOC+91+GBR' +DOC+V+23030162' +DTM+36:210327' +LOC+91+USA' +NAD+FL+++YOHANNES:MUSTAFA:DAWIT' +ATT+2++M' +DTM+329:670326' +MEA+CT++4' +MEA+WT++KGM:176' +FTX+BAG+++2660030' +FTX+BAG+++2660031:3' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+IND' +NAT+2+IND' +RFF+AVF:13D0F4' +RFF+SEA:048D' +DOC+P+849816808' +DTM+36:260914' +LOC+91+IND' +DOC+V+23366392' +DTM+36:210213' +LOC+91+USA' +CNT+42:10' +UNT+23+53371718146010' +UNZ+1+123456789' diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt new file mode 100644 index 0000000000..f58cddc617 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt @@ -0,0 +1,182 @@ +UNB+UNOA:4+LUFTHANSA:ZZ+HDQCH2X:ZZ+200129:1200+123456789++PAXLST' +UNH+53371718146010+PAXLST:D:02B:UN:IATA' +BGM+745' +NAD+MS+++WORLD CUSTOMS ORGANIZATION BRU' +COM+17037919383:TE' +TDT+20+FI615' +LOC+125+KEF' +DTM+189:2002261200:201' +LOC+87+JFK' +DTM+232:2002261800:201' +NAD+FL+++WATERFIELD:RHYS:THOMAS' +ATT+2++M' +DTM+329:531224' +MEA+CT++1' +MEA+WT++KGM:22' +FTX+BAG+++2660034' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:13D0F4' +RFF+SEA:062J' +DOC++482606407' +DTM+36:181109' +LOC+91+' +DOC+K+48302004' +DTM+36:210425' +LOC+91+USA' +NAD+FL+++CHIANG:XIUYUAN:' +ATT+2++F' +DTM+329:670603' +MEA+CT++1' +MEA+WT++KGM:33' +FTX+BAG+++2660198' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+CHN' +NAT+2+CHN' +RFF+AVF:EC791C' +RFF+SEA:047K' +DOC+P+51447450' +DTM+36:191110' +LOC+91+CHN' +DOC+V+69396759' +DTM+36:200327' +LOC+91+USA' +NAD+FL+++BAIRD:EMOGENE:EMERITA' +ATT+2++F' +DTM+329:470520' +MEA+CT++1' +MEA+WT++KGM:33' +FTX+BAG+++2660037' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:55F2AB' +RFF+SEA:056D' +DOC+P+480251811' +DTM+36:260708' +LOC+91+USA' +NAD+FL+++LARSON:ROBBIN:ZORA' +ATT+2++F' +DTM+329:660519' +MEA+CT++1' +MEA+WT++KGM:35' +FTX+BAG+++2660038' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:55F2AB' +RFF+SEA:056A' +DOC+P+548938958' +DTM+36:180828' +LOC+91+USA' +NAD+FL+++PARNELL:JACOB:BAILEY' +ATT+2++M' +DTM+329:790920' +MEA+CT++1' +MEA+WT++KGM:31' +FTX+BAG+++2660039' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:55F2AB' +RFF+SEA:024B' +DOC+P+40360733' +DTM+36:250728' +LOC+91+GBR' +DOC+V+44829663' +DTM+36:200918' +LOC+91+USA' +NAD+FL+++GWOCK:HUI:ZHEN' +ATT+2++F' +DTM+329:660628' +MEA+CT++4' +MEA+WT++KGM:141' +FTX+BAG+++2660040:3' +FTX+BAG+++2660043' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+ERI' +NAT+2+ERI' +RFF+AVF:55F2AB' +RFF+SEA:082D' +DOC+P+404520533' +DTM+36:241003' +LOC+91+ERI' +DOC+V+47832521' +DTM+36:200825' +LOC+91+USA' +NAD+FL+++XUE:YUL:KONG' +ATT+2++M' +DTM+329:551227' +MEA+CT++1' +MEA+WT++KGM:33' +FTX+BAG+++2660044' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+ERI' +NAT+2+ERI' +RFF+AVF:1D32B2' +RFF+SEA:056H' +DOC+P+700731195' +DTM+36:190116' +LOC+91+ERI' +DOC+V+90814620' +DTM+36:210531' +LOC+91+USA' +NAD+FL+++PANG:MIKA:CASSIE' +ATT+2++F' +DTM+329:430515' +MEA+CT++1' +MEA+WT++KGM:22' +FTX+BAG+++2660045' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:1D32B2' +RFF+SEA:078G' +DOC+P+776756271' +DTM+36:180609' +LOC+91+USA' +NAD+FL+++ERNEST:MARISA:MALVINA' +ATT+2++F' +DTM+329:640501' +MEA+CT++1' +MEA+WT++KGM:40' +FTX+BAG+++2660046' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:A7D924' +RFF+SEA:015A' +DOC+P+971686627' +DTM+36:261019' +LOC+91+USA' +NAD+FL+++LOWE:JESSICA:KATE' +ATT+2++F' +DTM+329:650308' +MEA+CT++2' +MEA+WT++KGM:106' +FTX+BAG+++2660047:2' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:A7D924' +RFF+SEA:054B' +DOC+P+339436223' +DTM+36:231202' +LOC+91+GBR' +DOC+K+33303259' +DTM+36:201109' +LOC+91+USA' +CNT+42:10' +UNT+23+53371718146010' +UNZ+1+123456789' From 8b3f5ea0c402a1291fac43da734b336fa32e4c0b Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Thu, 30 Jan 2020 18:36:17 -0500 Subject: [PATCH 34/83] Regularly send derog list (watchlist) to Tamr if edited --- .../resources/default.application.properties | 4 + .../gtas/job/scheduler/LoaderScheduler.java | 5 +- .../scheduler/TamrDerogReplaceScheduler.java | 95 +++++++++++++++++++ .../parsers/tamr/jms/TamrMessageSender.java | 62 ++++++------ 4 files changed, 136 insertions(+), 30 deletions(-) create mode 100644 gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/TamrDerogReplaceScheduler.java diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index 1d7d95e8ea..78623395c4 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -184,3 +184,7 @@ tamr.activemq.broker.url=tcp://localhost:61616 # passenger's travel history based on their cluster ID from Tamr. # If tamr.enabled is false, this has no effect. tamr.resolve_passenger_history=true +# By default, send updated derog list (watchlists) to Tamr at most once per +# hour if they've changed. +tamr.derogReplace.fixedDelay.in.milliseconds=3600000 +tamr.derogReplace.initialDelay.in.milliseconds=1000 diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index a344cadf02..e8c77c2bff 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -18,6 +18,7 @@ import gov.gtas.model.MessageStatus; import gov.gtas.parsers.tamr.jms.TamrMessageSender; import gov.gtas.parsers.tamr.model.TamrPassenger; +import gov.gtas.parsers.tamr.model.TamrQuery; import gov.gtas.repository.MessageStatusRepository; import gov.gtas.services.*; import gov.gtas.services.matcher.MatchingService; @@ -110,8 +111,8 @@ private void processSingleFile(File f, LoaderStatistics stats, String[] primeFli if (tamrEnabled) { List passToSend = processedMessages.getTamrPassengers(); - logger.info(String.valueOf(passToSend.size())); - tamrMessageSender.sendMessageToTamr("InboundQueue", passToSend); + TamrQuery tamrQuery = new TamrQuery(passToSend); + tamrMessageSender.sendMessageToTamr("QUERY", tamrQuery); } if (result != null) { diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/TamrDerogReplaceScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/TamrDerogReplaceScheduler.java new file mode 100644 index 0000000000..63de4913fb --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/TamrDerogReplaceScheduler.java @@ -0,0 +1,95 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.job.scheduler; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.TamrAdapter; +import gov.gtas.parsers.tamr.TamrAdapterImpl; +import gov.gtas.parsers.tamr.jms.TamrMessageSender; +import gov.gtas.parsers.tamr.model.TamrDerogListEntry; +import gov.gtas.parsers.tamr.model.TamrDerogListUpdate; +import gov.gtas.repository.watchlist.WatchlistItemRepository; +import gov.gtas.repository.watchlist.WatchlistRepository; + +/** + * Scheduler class for sending the derog list (watchlist) to Tamr when changed. + * Uses Spring's Scheduled annotation for scheduling tasks. The class reads + * configuration values from an external file. + * + * @author Cassidy Laidlaw + */ +@Component +@ConditionalOnProperty(prefix = "tamr", name = "enabled") +public class TamrDerogReplaceScheduler { + + private static final Logger logger = + LoggerFactory.getLogger(TamrDerogReplaceScheduler.class); + + @Autowired + WatchlistRepository watchlistRepository; + + @Autowired + WatchlistItemRepository watchlistItemRepository; + + TamrAdapter tamrAdapter = new TamrAdapterImpl(); + + @Autowired + TamrMessageSender tamrMessageSender; + + private Date lastRun = null; + + /** + * Replace the watchlist in Tamr if the GTAS ons has changed. + **/ + @Scheduled(fixedDelayString = "${tamr.derogReplace.fixedDelay.in.milliseconds}", + initialDelayString = "${tamr.derogReplace.initialDelay.in.milliseconds}") + public void jobScheduling() throws InterruptedException { + logger.info("Checking for watchlist edits to send to Tamr..."); + + // Get the latest time that a watchlist was edited. + Optional latestWatchlistEdit = StreamSupport.stream( + watchlistRepository.findAll().spliterator(), false) + .map((watchlist) -> watchlist.getEditTimestamp()) + .collect(Collectors.maxBy(Comparator.naturalOrder())); + + // Return if there are no watchlists to send. + if (!latestWatchlistEdit.isPresent()) return; + + // If there has been an edit to a watchlist since the last time this + // job was run... + if (lastRun == null || lastRun.before(latestWatchlistEdit.get())) { + logger.info("Sending latest watchlist to Tamr."); + + List watchlistItems = new ArrayList<>(); + watchlistItemRepository.findAll().forEach(watchlistItems::add); + List derogListEntries = + tamrAdapter.convertWatchlist(watchlistItems); + TamrDerogListUpdate derogReplace = + new TamrDerogListUpdate(derogListEntries); + tamrMessageSender.sendMessageToTamr("DC.REPLACE", derogReplace); + + lastRun = new Date(); + } else { + logger.info("No recent watchlist edits found."); + } + } + +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java index c53931670c..958cda2752 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java @@ -26,35 +26,41 @@ @ConditionalOnProperty(prefix = "tamr", name = "enabled") public class TamrMessageSender { - private final Logger logger = LoggerFactory.getLogger(TamrMessageSender.class); + private final Logger logger = LoggerFactory.getLogger(TamrMessageSender.class); - JmsTemplate jmsTemplate; + JmsTemplate jmsTemplate; - @Autowired - TamrQueueConfig queueConfig; - - public boolean sendMessageToTamr(String queue, List passengers) throws Exception { - logger.info("Sending passengers to Tamr..."); - if (jmsTemplate == null) { - this.jmsTemplate = new JmsTemplate( - queueConfig.senderConnectionFactory()); - } - - TamrQuery tamrQuery = new TamrQuery(passengers); - ObjectMapper mapper = new ObjectMapper(); - String tamrQueryJson = mapper.writer().writeValueAsString(tamrQuery); - - logger.debug("QUERY {}", tamrQueryJson); - - jmsTemplate.send(queue, new MessageCreator() { - public Message createMessage(Session session) throws JMSException { - Message message = session.createTextMessage(tamrQueryJson); - message.setJMSType("QUERY"); - return message; - } - }); - - return true; - } + @Autowired + TamrQueueConfig queueConfig; + + public void sendMessageToTamr(String messageType, Object messageObject) { + String messageJson; + try { + ObjectMapper mapper = new ObjectMapper(); + messageJson = mapper.writer().writeValueAsString(messageObject); + } catch (JsonProcessingException e) { + logger.error("Could not send {} message (type={}) to Tamr: {}", + messageObject.getClass(), messageType, e); + return; + } + this.sendMessageToTamr(messageType, messageJson); + } + + public void sendMessageToTamr(String messageType, String messageText) { + if (jmsTemplate == null) { + this.jmsTemplate = new JmsTemplate( + queueConfig.senderConnectionFactory()); + } + logger.info("Sending {} message to Tamr.", messageType); + logger.debug(messageText); + + jmsTemplate.send("InboundQueue", new MessageCreator() { + public Message createMessage(Session session) throws JMSException { + Message message = session.createTextMessage(messageText); + message.setJMSType(messageType); + return message; + } + }); + } } From 2e5e03fbbdabb0a57c3c495c0c1d3c6cbed4643a Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 31 Jan 2020 12:19:46 -0500 Subject: [PATCH 35/83] Fix typo in comment --- .../src/main/resources/default.application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index 78623395c4..b926fbcd11 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -180,7 +180,7 @@ elastic.ssl.enabled=true ######### Tamr Integration ######### tamr.enabled=false tamr.activemq.broker.url=tcp://localhost:61616 -# If Tamr is enabled, this option will toggle prefential resolving of a +# If Tamr is enabled, this option will toggle preferential resolving of a # passenger's travel history based on their cluster ID from Tamr. # If tamr.enabled is false, this has no effect. tamr.resolve_passenger_history=true From 4c313aad740e24193e4a5a3ed5cc38bb443afd55 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 31 Jan 2020 13:13:09 -0500 Subject: [PATCH 36/83] Move TamrDerogReplaceScheduler to gtas-parsers project and write unit test --- .../tamr}/TamrDerogReplaceScheduler.java | 4 +- .../parsers/tamr/jms/TamrMessageSender.java | 4 +- .../parsers/tamr/TamrAdapterImplTest.java | 25 +++-- .../tamr/TamrDerogReplaceSchedulerTest.java | 105 ++++++++++++++++++ 4 files changed, 124 insertions(+), 14 deletions(-) rename gtas-parent/{gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler => gtas-parsers/src/main/java/gov/gtas/parsers/tamr}/TamrDerogReplaceScheduler.java (96%) create mode 100644 gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/TamrDerogReplaceScheduler.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java similarity index 96% rename from gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/TamrDerogReplaceScheduler.java rename to gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java index 63de4913fb..e6f5a06451 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/TamrDerogReplaceScheduler.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java @@ -3,7 +3,7 @@ * * Please see LICENSE.txt for details. */ -package gov.gtas.job.scheduler; +package gov.gtas.parsers.tamr; import java.util.ArrayList; import java.util.Comparator; @@ -21,8 +21,6 @@ import org.springframework.stereotype.Component; import gov.gtas.model.watchlist.WatchlistItem; -import gov.gtas.parsers.tamr.TamrAdapter; -import gov.gtas.parsers.tamr.TamrAdapterImpl; import gov.gtas.parsers.tamr.jms.TamrMessageSender; import gov.gtas.parsers.tamr.model.TamrDerogListEntry; import gov.gtas.parsers.tamr.model.TamrDerogListUpdate; diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java index 958cda2752..5c36422475 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java @@ -43,10 +43,10 @@ public void sendMessageToTamr(String messageType, Object messageObject) { messageObject.getClass(), messageType, e); return; } - this.sendMessageToTamr(messageType, messageJson); + this.sendTextMessageToTamr(messageType, messageJson); } - public void sendMessageToTamr(String messageType, String messageText) { + public void sendTextMessageToTamr(String messageType, String messageText) { if (jmsTemplate == null) { this.jmsTemplate = new JmsTemplate( queueConfig.senderConnectionFactory()); diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java index 22d4da6c50..257f4e213e 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java @@ -97,19 +97,26 @@ public void testPassengerConversion() throws JsonProcessingException { "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"firstName\",\"type\":\"string\",\"value\":\"FRIEDA\"},{\"field\":\"lastName\",\"type\":\"string\",\"value\":\"DARRINGTON\"},{\"field\":\"dob\",\"type\":\"date\",\"value\":\"1963-08-13\"}]}", "{\"id\":null,\"action\":null,\"terms\":[{\"field\":\"documentType\",\"type\":\"string\",\"value\":\"P\"},{\"field\":\"documentNumber\",\"type\":\"string\",\"value\":\"899294368\"}]}" }; + public static final String expectedDerogListJson = "{\"passengers\":[" + + "{\"gtasId\":\"1\",\"firstName\":\"SHING\",\"middleName\":null,\"lastName\":\"QUAN\",\"gender\":null,\"dob\":\"1998-08-08\",\"documents\":null,\"citizenshipCountry\":null,\"derogId\":\"1\"}," + + "{\"gtasId\":\"3\",\"firstName\":\"FRIEDA\",\"middleName\":null,\"lastName\":\"DARRINGTON\",\"gender\":null,\"dob\":\"1963-08-13\",\"documents\":null,\"citizenshipCountry\":null,\"derogId\":\"3\"}" + + "]}"; + + public static List getWatchlistItems() { + List watchlistItems = new ArrayList<>(); + for (int i = 0; i < WATCHLIST_ITEMS.length; i++) { + WatchlistItem watchlistItem = new WatchlistItem(); + watchlistItem.setItemData(WATCHLIST_ITEMS[i]); + watchlistItem.setId((long) i + 1); + watchlistItems.add(watchlistItem); + } + return watchlistItems; + } @Test public void testWatchlistConversion() throws JsonProcessingException { - List watchlistItems = new ArrayList<>(); - for (int i = 0; i < WATCHLIST_ITEMS.length; i++) { - WatchlistItem watchlistItem = new WatchlistItem(); - watchlistItem.setItemData(WATCHLIST_ITEMS[i]); - watchlistItem.setId((long) i + 1); - watchlistItems.add(watchlistItem); - } - List derogList = - tamrAdapter.convertWatchlist(watchlistItems); + tamrAdapter.convertWatchlist(getWatchlistItems()); // Only 2 entries in the derog list, since document entries should // be filtered out. diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java new file mode 100644 index 0000000000..8767a34eba --- /dev/null +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java @@ -0,0 +1,105 @@ +/* + * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.parsers.tamr; + +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.test.util.ReflectionTestUtils; + +import gov.gtas.model.watchlist.Watchlist; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.parsers.tamr.TamrDerogReplaceScheduler; +import gov.gtas.parsers.tamr.jms.TamrMessageSender; +import gov.gtas.repository.watchlist.WatchlistItemRepository; +import gov.gtas.repository.watchlist.WatchlistRepository; + +public class TamrDerogReplaceSchedulerTest { + private TamrDerogReplaceScheduler scheduler; + private TamrMessageSender messageSender; + private WatchlistItemRepository watchlistItemRepository; + private Watchlist watchlist; + private WatchlistRepository watchlistRepository; + + @Before + public void setUp() { + scheduler = new TamrDerogReplaceScheduler(); + + watchlist = new Watchlist(); + watchlist.setId(1L); + watchlist.setEditTimestamp(new Date()); + watchlistRepository = mock(WatchlistRepository.class); + ReflectionTestUtils.setField(scheduler, "watchlistRepository", + watchlistRepository); + given(watchlistRepository.findAll()) + .willReturn(Collections.singletonList(watchlist)); + + List watchlistItems = + TamrAdapterImplTest.getWatchlistItems(); + watchlistItemRepository = mock(WatchlistItemRepository.class); + ReflectionTestUtils.setField(scheduler, "watchlistItemRepository", + watchlistItemRepository); + given(watchlistItemRepository.findAll()).willReturn(watchlistItems); + + messageSender = mock(TamrMessageSender.class); + ReflectionTestUtils.setField(scheduler, "tamrMessageSender", + messageSender); + doCallRealMethod().when(messageSender).sendMessageToTamr(any(), any()); + } + + /** + * Make sure watchlist items are sent to Tamr the first time the scheduler + * runs. + */ + @Test + public void testSendWatchlist() throws InterruptedException { + scheduler.jobScheduling(); + + ArgumentCaptor messageTypeCaptor = + ArgumentCaptor.forClass(String.class); + ArgumentCaptor messageTextCaptor = + ArgumentCaptor.forClass(String.class); + verify(messageSender).sendTextMessageToTamr( + messageTypeCaptor.capture(), messageTextCaptor.capture()); + assertEquals("DC.REPLACE", messageTypeCaptor.getValue()); + assertEquals(TamrAdapterImplTest.expectedDerogListJson, + messageTextCaptor.getValue()); + } + + /** + * Make sure derog replace isn't sent to Tamr when the watchlists haven't + * been edited. + * @throws InterruptedException + */ + @Test + public void testNoSendIfNotEdited() throws InterruptedException { + scheduler.jobScheduling(); + scheduler.jobScheduling(); + scheduler.jobScheduling(); + + // Only one message should have been sent. + verify(messageSender, times(1)).sendTextMessageToTamr( + any(), any()); + + // Now update edited time... + watchlist.setEditTimestamp(new Date()); + // ...and another message should be sent. + scheduler.jobScheduling(); + scheduler.jobScheduling(); + verify(messageSender, times(2)).sendTextMessageToTamr( + any(), any()); + } +} From e2a57d78a3d16d174625714c7aa5b223d646f857 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 31 Jan 2020 14:56:06 -0500 Subject: [PATCH 37/83] Update Tamr integration test flights to include derog hit --- .../tamr-integration-data/flight2.txt | 255 +++++++++--------- .../tamr-integration-data/flight3.txt | 255 +++++++++--------- 2 files changed, 255 insertions(+), 255 deletions(-) diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt index eacca51ab0..551c4efaf6 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt @@ -1,188 +1,181 @@ -UNB+UNOA:4+LUFTHANSA:ZZ+HDQCH2X:ZZ+200130:0300+123456789++PAXLST' +UNB+UNOA:4+LUFTHANSA:ZZ+HDQCH2X:ZZ+200129:1200+123456789++PAXLST' UNH+53371718146010+PAXLST:D:02B:UN:IATA' BGM+745' NAD+MS+++WORLD CUSTOMS ORGANIZATION BRU' COM+17037919383:TE' -TDT+20+YY123' -LOC+125+IAD' -DTM+189:2004241200:201' -LOC+87+BRU' -DTM+232:2004241322:201' -NAD+FL+++MCLOUGHLIN:BEN:HARRY' +TDT+20+FI615' +LOC+125+KEF' +DTM+189:2002261200:201' +LOC+87+JFK' +DTM+232:2002261800:201' +NAD+FL+++WATERFIELD:RHYS:THOMAS' ATT+2++M' -DTM+329:461007' -MEA+CT++2' -MEA+WT++KGM:79' -FTX+BAG+++2660017' -FTX+BAG+++2660018' +DTM+329:531224' +MEA+CT++1' +MEA+WT++KGM:22' +FTX+BAG+++2660034' LOC+178+SVO' LOC+179+IAD' LOC+174+GBR' NAT+2+GBR' -RFF+AVF:BD6A38' -RFF+SEA:045H' -DOC+P+563056942' -DTM+36:200909' -LOC+91+GBR' -DOC+V+67379768' -DTM+36:200522' +RFF+AVF:13D0F4' +RFF+SEA:062J' +DOC++482606407' +DTM+36:181109' +LOC+91+' +DOC+K+48302004' +DTM+36:210425' LOC+91+USA' -NAD+FL+++DELEON:ANGELA:THERESA' +NAD+FL+++JIANG:XIUYUAN:' ATT+2++F' -DTM+329:530919' +DTM+329:670604' MEA+CT++1' -MEA+WT++KGM:53' -FTX+BAG+++2660019' +MEA+WT++KGM:33' +FTX+BAG+++2660198' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+CHN' +NAT+2+CHN' +RFF+AVF:EC791C' +RFF+SEA:047K' +DOC+P+51447450' +DTM+36:191110' +LOC+91+CHN' +DOC+V+69396759' +DTM+36:200327' +LOC+91+USA' +NAD+FL+++BAIRD:EMOGENE:EMERITA' +ATT+2++F' +DTM+329:470520' +MEA+CT++1' +MEA+WT++KGM:33' +FTX+BAG+++2660037' LOC+178+SVO' LOC+179+IAD' LOC+174+USA' NAT+2+USA' -RFF+AVF:C64EDF' -RFF+SEA:071F' -DOC+P+792869438' -DTM+36:170724' +RFF+AVF:55F2AB' +RFF+SEA:056D' +DOC+P+480251811' +DTM+36:260708' LOC+91+USA' -NAD+FL+++MUHLBAUER:JINDRA:SABINA' +NAD+FL+++LARSON:ROBBIN:ZORA' ATT+2++F' -DTM+329:560128' +DTM+329:660519' MEA+CT++1' MEA+WT++KGM:35' -FTX+BAG+++2660020' +FTX+BAG+++2660038' LOC+178+SVO' LOC+179+IAD' -LOC+174+ERI' -NAT+2+ERI' -RFF+AVF:C64EDF' -RFF+SEA:047G' -DOC+P+741425896' -DTM+36:190807' -LOC+91+ERI' -DOC+V+12781931' -DTM+36:200826' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:55F2AB' +RFF+SEA:056A' +DOC+P+548938958' +DTM+36:180828' LOC+91+USA' -NAD+FL+++OBRIEN:HARLEY:ELLIS' +NAD+FL+++PARNELL:JACOB:BAILEY' ATT+2++M' -DTM+329:931128' -MEA+CT++4' -MEA+WT++KGM:56' -FTX+BAG+++2660021' -FTX+BAG+++2660022' -FTX+BAG+++SU0023' -FTX+BAG+++2660024' +DTM+329:790920' +MEA+CT++1' +MEA+WT++KGM:31' +FTX+BAG+++2660039' LOC+178+SVO' LOC+179+IAD' LOC+174+GBR' NAT+2+GBR' -RFF+AVF:C64EDF' -RFF+SEA:078J' -DOC+P+489741956' -DTM+36:240423' +RFF+AVF:55F2AB' +RFF+SEA:024B' +DOC+P+40360733' +DTM+36:250728' LOC+91+GBR' -DOC+V+77328686' -DTM+36:200729' +DOC+V+44829663' +DTM+36:200918' LOC+91+USA' -NAD+FL+++WARREN:KAYLEIGH:ELOISE' +NAD+FL+++GWOCK:HUI:ZHEN' ATT+2++F' -DTM+329:010328' -MEA+CT++1' -MEA+WT++KGM:29' -FTX+BAG+++2660025' +DTM+329:660628' +MEA+CT++4' +MEA+WT++KGM:141' +FTX+BAG+++2660040:3' +FTX+BAG+++2660043' LOC+178+SVO' LOC+179+IAD' -LOC+174+GBR' -NAT+2+GBR' -RFF+AVF:CE9203' -RFF+SEA:063A' -DOC+P+291326056' -DTM+36:260614' -LOC+91+GBR' -DOC+V+59088135' -DTM+36:210416' +LOC+174+ERI' +NAT+2+ERI' +RFF+AVF:55F2AB' +RFF+SEA:082D' +DOC+P+404520533' +DTM+36:241003' +LOC+91+ERI' +DOC+V+47832521' +DTM+36:200825' LOC+91+USA' -NAD+FL+++STRINGER:WILLIAM:MORGAN' +NAD+FL+++THEBAULT:REUBEN:' ATT+2++M' -DTM+329:960125' +DTM+329:450113' +MEA+CT++1' +MEA+WT++KGM:33' +FTX+BAG+++2660044' LOC+178+SVO' LOC+179+IAD' -LOC+174+GBR' -NAT+2+GBR' -RFF+AVF:72C51C' -RFF+SEA:058K' -DOC+P+91950436' -DTM+36:170331' -LOC+91+GBR' -DOC+V+39947468' -DTM+36:210612' +LOC+174+ERI' +NAT+2+ERI' +RFF+AVF:1D32B2' +RFF+SEA:056H' +DOC+P+700731195' +DTM+36:190116' +LOC+91+ERI' +DOC+V+90814620' +DTM+36:210531' LOC+91+USA' -NAD+FL+++JIANG:XIUYUAN:' +NAD+FL+++PANG:MIKA:CASSIE' ATT+2++F' -DTM+329: 670603' +DTM+329:430515' MEA+CT++1' -MEA+WT++KGM:40' -FTX+BAG+++2660162' +MEA+WT++KGM:22' +FTX+BAG+++2660045' LOC+178+SVO' LOC+179+IAD' -LOC+174+CHN' -NAT+2+CHN' -RFF+AVF:574397' -RFF+SEA:082B' -DOC+P+461448207' -DTM+36:210226' -LOC+91+CHN' -DOC+V+19495986' -DTM+36:200815' +LOC+174+USA' +NAT+2+USA' +RFF+AVF:1D32B2' +RFF+SEA:078G' +DOC+P+776756271' +DTM+36:180609' LOC+91+USA' -NAD+FL+++SPOONER:GROVER:RUBIN' -ATT+2++M' -DTM+329:721223' +NAD+FL+++ERNEST:MARISA:MALVINA' +ATT+2++F' +DTM+329:640501' MEA+CT++1' -MEA+WT++KGM:33' -FTX+BAG+++2660028' +MEA+WT++KGM:40' +FTX+BAG+++2660046' LOC+178+SVO' LOC+179+IAD' LOC+174+USA' NAT+2+USA' -RFF+AVF:48225A' -RFF+SEA:068E' -DOC+P+115610430' -DTM+36:260110' +RFF+AVF:A7D924' +RFF+SEA:015A' +DOC+P+971686627' +DTM+36:261019' LOC+91+USA' -NAD+FL+++JOSEPH:GAELLA:COOK' -ATT+2++M' -DTM+329:700202' -MEA+CT++1' -MEA+WT++KGM:48' -FTX+BAG+++2660200' +NAD+FL+++LOWE:JESSICA:KATE' +ATT+2++F' +DTM+329:650308' +MEA+CT++2' +MEA+WT++KGM:106' +FTX+BAG+++2660047:2' LOC+178+SVO' LOC+179+IAD' LOC+174+GBR' NAT+2+GBR' -RFF+AVF:3D7C5C' -RFF+SEA:060J' -DOC+P+581607302' -DTM+36:210107' +RFF+AVF:A7D924' +RFF+SEA:054B' +DOC+P+339436223' +DTM+36:231202' LOC+91+GBR' -DOC+V+23030162' -DTM+36:210327' -LOC+91+USA' -NAD+FL+++YOHANNES:MUSTAFA:DAWIT' -ATT+2++M' -DTM+329:670326' -MEA+CT++4' -MEA+WT++KGM:176' -FTX+BAG+++2660030' -FTX+BAG+++2660031:3' -LOC+178+SVO' -LOC+179+IAD' -LOC+174+IND' -NAT+2+IND' -RFF+AVF:13D0F4' -RFF+SEA:048D' -DOC+P+849816808' -DTM+36:260914' -LOC+91+IND' -DOC+V+23366392' -DTM+36:210213' +DOC+K+33303259' +DTM+36:201109' LOC+91+USA' CNT+42:10' UNT+23+53371718146010' diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt index f58cddc617..eacca51ab0 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight3.txt @@ -1,181 +1,188 @@ -UNB+UNOA:4+LUFTHANSA:ZZ+HDQCH2X:ZZ+200129:1200+123456789++PAXLST' +UNB+UNOA:4+LUFTHANSA:ZZ+HDQCH2X:ZZ+200130:0300+123456789++PAXLST' UNH+53371718146010+PAXLST:D:02B:UN:IATA' BGM+745' NAD+MS+++WORLD CUSTOMS ORGANIZATION BRU' COM+17037919383:TE' -TDT+20+FI615' -LOC+125+KEF' -DTM+189:2002261200:201' -LOC+87+JFK' -DTM+232:2002261800:201' -NAD+FL+++WATERFIELD:RHYS:THOMAS' +TDT+20+YY123' +LOC+125+IAD' +DTM+189:2004241200:201' +LOC+87+BRU' +DTM+232:2004241322:201' +NAD+FL+++MCLOUGHLIN:BEN:HARRY' ATT+2++M' -DTM+329:531224' -MEA+CT++1' -MEA+WT++KGM:22' -FTX+BAG+++2660034' +DTM+329:461007' +MEA+CT++2' +MEA+WT++KGM:79' +FTX+BAG+++2660017' +FTX+BAG+++2660018' LOC+178+SVO' LOC+179+IAD' LOC+174+GBR' NAT+2+GBR' -RFF+AVF:13D0F4' -RFF+SEA:062J' -DOC++482606407' -DTM+36:181109' -LOC+91+' -DOC+K+48302004' -DTM+36:210425' -LOC+91+USA' -NAD+FL+++CHIANG:XIUYUAN:' -ATT+2++F' -DTM+329:670603' -MEA+CT++1' -MEA+WT++KGM:33' -FTX+BAG+++2660198' -LOC+178+SVO' -LOC+179+IAD' -LOC+174+CHN' -NAT+2+CHN' -RFF+AVF:EC791C' -RFF+SEA:047K' -DOC+P+51447450' -DTM+36:191110' -LOC+91+CHN' -DOC+V+69396759' -DTM+36:200327' +RFF+AVF:BD6A38' +RFF+SEA:045H' +DOC+P+563056942' +DTM+36:200909' +LOC+91+GBR' +DOC+V+67379768' +DTM+36:200522' LOC+91+USA' -NAD+FL+++BAIRD:EMOGENE:EMERITA' +NAD+FL+++DELEON:ANGELA:THERESA' ATT+2++F' -DTM+329:470520' +DTM+329:530919' MEA+CT++1' -MEA+WT++KGM:33' -FTX+BAG+++2660037' +MEA+WT++KGM:53' +FTX+BAG+++2660019' LOC+178+SVO' LOC+179+IAD' LOC+174+USA' NAT+2+USA' -RFF+AVF:55F2AB' -RFF+SEA:056D' -DOC+P+480251811' -DTM+36:260708' +RFF+AVF:C64EDF' +RFF+SEA:071F' +DOC+P+792869438' +DTM+36:170724' LOC+91+USA' -NAD+FL+++LARSON:ROBBIN:ZORA' +NAD+FL+++MUHLBAUER:JINDRA:SABINA' ATT+2++F' -DTM+329:660519' +DTM+329:560128' MEA+CT++1' MEA+WT++KGM:35' -FTX+BAG+++2660038' +FTX+BAG+++2660020' LOC+178+SVO' LOC+179+IAD' -LOC+174+USA' -NAT+2+USA' -RFF+AVF:55F2AB' -RFF+SEA:056A' -DOC+P+548938958' -DTM+36:180828' +LOC+174+ERI' +NAT+2+ERI' +RFF+AVF:C64EDF' +RFF+SEA:047G' +DOC+P+741425896' +DTM+36:190807' +LOC+91+ERI' +DOC+V+12781931' +DTM+36:200826' LOC+91+USA' -NAD+FL+++PARNELL:JACOB:BAILEY' +NAD+FL+++OBRIEN:HARLEY:ELLIS' ATT+2++M' -DTM+329:790920' -MEA+CT++1' -MEA+WT++KGM:31' -FTX+BAG+++2660039' +DTM+329:931128' +MEA+CT++4' +MEA+WT++KGM:56' +FTX+BAG+++2660021' +FTX+BAG+++2660022' +FTX+BAG+++SU0023' +FTX+BAG+++2660024' LOC+178+SVO' LOC+179+IAD' LOC+174+GBR' NAT+2+GBR' -RFF+AVF:55F2AB' -RFF+SEA:024B' -DOC+P+40360733' -DTM+36:250728' +RFF+AVF:C64EDF' +RFF+SEA:078J' +DOC+P+489741956' +DTM+36:240423' LOC+91+GBR' -DOC+V+44829663' -DTM+36:200918' +DOC+V+77328686' +DTM+36:200729' LOC+91+USA' -NAD+FL+++GWOCK:HUI:ZHEN' +NAD+FL+++WARREN:KAYLEIGH:ELOISE' ATT+2++F' -DTM+329:660628' -MEA+CT++4' -MEA+WT++KGM:141' -FTX+BAG+++2660040:3' -FTX+BAG+++2660043' +DTM+329:010328' +MEA+CT++1' +MEA+WT++KGM:29' +FTX+BAG+++2660025' LOC+178+SVO' LOC+179+IAD' -LOC+174+ERI' -NAT+2+ERI' -RFF+AVF:55F2AB' -RFF+SEA:082D' -DOC+P+404520533' -DTM+36:241003' -LOC+91+ERI' -DOC+V+47832521' -DTM+36:200825' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:CE9203' +RFF+SEA:063A' +DOC+P+291326056' +DTM+36:260614' +LOC+91+GBR' +DOC+V+59088135' +DTM+36:210416' LOC+91+USA' -NAD+FL+++XUE:YUL:KONG' +NAD+FL+++STRINGER:WILLIAM:MORGAN' ATT+2++M' -DTM+329:551227' -MEA+CT++1' -MEA+WT++KGM:33' -FTX+BAG+++2660044' +DTM+329:960125' LOC+178+SVO' LOC+179+IAD' -LOC+174+ERI' -NAT+2+ERI' -RFF+AVF:1D32B2' -RFF+SEA:056H' -DOC+P+700731195' -DTM+36:190116' -LOC+91+ERI' -DOC+V+90814620' -DTM+36:210531' +LOC+174+GBR' +NAT+2+GBR' +RFF+AVF:72C51C' +RFF+SEA:058K' +DOC+P+91950436' +DTM+36:170331' +LOC+91+GBR' +DOC+V+39947468' +DTM+36:210612' LOC+91+USA' -NAD+FL+++PANG:MIKA:CASSIE' +NAD+FL+++JIANG:XIUYUAN:' ATT+2++F' -DTM+329:430515' +DTM+329: 670603' MEA+CT++1' -MEA+WT++KGM:22' -FTX+BAG+++2660045' +MEA+WT++KGM:40' +FTX+BAG+++2660162' LOC+178+SVO' LOC+179+IAD' -LOC+174+USA' -NAT+2+USA' -RFF+AVF:1D32B2' -RFF+SEA:078G' -DOC+P+776756271' -DTM+36:180609' +LOC+174+CHN' +NAT+2+CHN' +RFF+AVF:574397' +RFF+SEA:082B' +DOC+P+461448207' +DTM+36:210226' +LOC+91+CHN' +DOC+V+19495986' +DTM+36:200815' LOC+91+USA' -NAD+FL+++ERNEST:MARISA:MALVINA' -ATT+2++F' -DTM+329:640501' +NAD+FL+++SPOONER:GROVER:RUBIN' +ATT+2++M' +DTM+329:721223' MEA+CT++1' -MEA+WT++KGM:40' -FTX+BAG+++2660046' +MEA+WT++KGM:33' +FTX+BAG+++2660028' LOC+178+SVO' LOC+179+IAD' LOC+174+USA' NAT+2+USA' -RFF+AVF:A7D924' -RFF+SEA:015A' -DOC+P+971686627' -DTM+36:261019' +RFF+AVF:48225A' +RFF+SEA:068E' +DOC+P+115610430' +DTM+36:260110' LOC+91+USA' -NAD+FL+++LOWE:JESSICA:KATE' -ATT+2++F' -DTM+329:650308' -MEA+CT++2' -MEA+WT++KGM:106' -FTX+BAG+++2660047:2' +NAD+FL+++JOSEPH:GAELLA:COOK' +ATT+2++M' +DTM+329:700202' +MEA+CT++1' +MEA+WT++KGM:48' +FTX+BAG+++2660200' LOC+178+SVO' LOC+179+IAD' LOC+174+GBR' NAT+2+GBR' -RFF+AVF:A7D924' -RFF+SEA:054B' -DOC+P+339436223' -DTM+36:231202' +RFF+AVF:3D7C5C' +RFF+SEA:060J' +DOC+P+581607302' +DTM+36:210107' LOC+91+GBR' -DOC+K+33303259' -DTM+36:201109' +DOC+V+23030162' +DTM+36:210327' +LOC+91+USA' +NAD+FL+++YOHANNES:MUSTAFA:DAWIT' +ATT+2++M' +DTM+329:670326' +MEA+CT++4' +MEA+WT++KGM:176' +FTX+BAG+++2660030' +FTX+BAG+++2660031:3' +LOC+178+SVO' +LOC+179+IAD' +LOC+174+IND' +NAT+2+IND' +RFF+AVF:13D0F4' +RFF+SEA:048D' +DOC+P+849816808' +DTM+36:260914' +LOC+91+IND' +DOC+V+23366392' +DTM+36:210213' LOC+91+USA' CNT+42:10' UNT+23+53371718146010' From 8c9041fd1f09d2824ffde31ebee9eb5411a6dc3c Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sun, 2 Feb 2020 11:12:51 -0500 Subject: [PATCH 38/83] Add derog hit to Tamr integration test --- .../java/gov/gtas/model/FlightHitsFuzzy.java | 2 +- .../java/gov/gtas/model/FlightHitsGraph.java | 2 +- .../java/gov/gtas/model/FlightHitsRule.java | 2 +- .../gov/gtas/model/FlightHitsWatchlist.java | 2 +- .../java/gov/gtas/job/scheduler/TamrIT.java | 135 +++++++++++++++--- .../java/gov/gtas/job/scheduler/TamrMock.java | 75 ++++++++-- .../tamr-integration-data/flight2.txt | 2 +- .../resources/tamr.application.properties | 6 +- 8 files changed, 192 insertions(+), 34 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java index 836e4f2618..982949a0c2 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java @@ -18,7 +18,7 @@ public class FlightHitsFuzzy { @Column(name = "fhf_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(optional = false, fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fhf_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java index a25b8e82e6..42b2350b6c 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java @@ -17,7 +17,7 @@ public class FlightHitsGraph { @Column(name = "fhg_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(optional = false, fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fhg_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java index 7dd2fc5857..0b1f32ca37 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java @@ -10,7 +10,7 @@ public class FlightHitsRule { @Column(name = "fhr_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(optional = false, fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fhr_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java index 814e1acec8..c230487e5f 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java @@ -10,7 +10,7 @@ public class FlightHitsWatchlist { @Column(name = "fhw_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(optional = false, fetch = FetchType.LAZY) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fhw_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java index 127808668a..4710e03d3a 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java @@ -9,14 +9,20 @@ import java.io.File; import java.util.Arrays; -import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.hibernate.Session; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; @@ -25,14 +31,24 @@ import com.google.common.collect.Iterables; -import gov.gtas.config.TestCommonServicesConfig; +import gov.gtas.enumtype.EntityEnum; import gov.gtas.model.Flight; +import gov.gtas.model.HitDetail; import gov.gtas.model.Passenger; +import gov.gtas.model.watchlist.WatchlistItem; +import gov.gtas.model.watchlist.json.WatchlistItemSpec; +import gov.gtas.model.watchlist.json.WatchlistSpec; +import gov.gtas.model.watchlist.json.WatchlistTerm; +import gov.gtas.parsers.tamr.TamrDerogReplaceScheduler; import gov.gtas.repository.FlightRepository; +import gov.gtas.repository.HitDetailRepository; import gov.gtas.repository.PassengerIDTagRepository; import gov.gtas.repository.PassengerRepository; +import gov.gtas.repository.PendingHitDetailRepository; +import gov.gtas.repository.watchlist.WatchlistItemRepository; import gov.gtas.services.LoaderStatistics; import gov.gtas.services.PassengerService; +import gov.gtas.svc.WatchlistService; /** * End-to-end integration tests with Tamr. @@ -40,11 +56,19 @@ * */ @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { TestCommonServicesConfig.class }) +@ContextConfiguration(classes = { TamrIntegrationTestConfig.class }) @Rollback(true) public class TamrIT extends AbstractTransactionalJUnit4SpringContextTests { + private Logger logger = LoggerFactory.getLogger(TamrIT.class); + private ClassLoader classLoader; + @Autowired + private ApplicationContext applicationContext; + + @PersistenceContext + private EntityManager entityManager; + @Autowired private LoaderScheduler loaderScheduler; @@ -60,6 +84,21 @@ public class TamrIT extends AbstractTransactionalJUnit4SpringContextTests { @Autowired private PassengerIDTagRepository passengerIDTagRepository; + @Autowired + private WatchlistService watchlistService; + + @Autowired + private PendingHitDetailRepository pendingHitDetailRepository; + + @Autowired + private HitDetailRepository hitDetailRepository; + + @Autowired + private WatchlistItemRepository watchlistItemRepository; + + @Autowired + private TamrDerogReplaceScheduler derogReplaceScheduler; + @Autowired private TamrIntegrationTestUtils tamrUtils; @@ -71,16 +110,25 @@ public void setUp() throws Exception { classLoader = getClass().getClassLoader(); } - private void createWatchlistItems() { - // TODO: implement - } - - private void sendWatchlistItemsToTamr() { - // TODO: implement + private WatchlistItemSpec createWatchlistItemSpec( + String firstName, String lastName, String dob) { + return new WatchlistItemSpec(null, "create", new WatchlistTerm[] { + new WatchlistTerm("firstName", "String", firstName), + new WatchlistTerm("lastName", "String", lastName), + new WatchlistTerm("dob", "String", dob) + }); } - private void assertDerogListReceived() { - // TODO: implement + private void createWatchlistItems() { + WatchlistSpec spec = new WatchlistSpec("Watchlist", + EntityEnum.PASSENGER.getEntityName()); + spec.addWatchlistItem(createWatchlistItemSpec( + "RUBEN", "THEBAULT", "1945-01-11")); + spec.addWatchlistItem(createWatchlistItemSpec( + "KIM", "OSAYUWAME", "1971-09-16")); + spec.addWatchlistItem(createWatchlistItemSpec( + "ALICIA", "DAVIES", "1962-05-21")); + watchlistService.createUpdateDeleteWatchlistItems("ADMIN", spec, 1L); } private void loadFlight(String messageFilePath, String[] primeFlightKey) @@ -113,6 +161,34 @@ private long getPassengerIdFromName(String firstName, String lastName) { return passengerId; } + /** + * Clears Passenger objects from Hibernate's cache, because the cache + * within the test transaction causes issues with loading passengers' + * associated flights. + */ + private void clearCachedPassengers() { + Session session = entityManager.unwrap(Session.class); + passengerRepository.findAll().forEach((passenger) -> { + session.evict(passenger); + }); + } + + /** + * Runs the normally scheduled task of persisting pending watchlist hits + * to the database. + */ + private void persistWatchlistHits() { + AsyncHitPersistenceThread persistenceThread = + new AsyncHitPersistenceThread( + pendingHitDetailRepository, applicationContext); + Set allFlightIds = flightRepository.findAll() + .stream() + .map((flight) -> flight.getId()) + .collect(Collectors.toSet()); + persistenceThread.setFlightIds(allFlightIds); + persistenceThread.call(); + } + /** * Makes sure the tamrIds match for the passengers with the given names * and also that GTAS traveler history groups them together. @@ -149,8 +225,11 @@ public void testTamrIntegration() throws Exception { tamrUtils.disableJmsListeners(); this.createWatchlistItems(); - this.sendWatchlistItemsToTamr(); - this.assertDerogListReceived(); + derogReplaceScheduler.jobScheduling(); + // 3 derog entries should be processed by Tamr. + assertEquals(3, tamrMock.respondToDerogReplace()); + // GTAS should get acknowledgement from Tamr. + assertEquals(1, tamrUtils.synchronouslyProcessMessagesFromTamr()); // Flight 1 this.loadFlight( @@ -162,14 +241,12 @@ public void testTamrIntegration() throws Exception { assertEquals(10, tamrMock.respondToQuery()); // Let GTAS process responses (should be 2). assertEquals(2, tamrUtils.synchronouslyProcessMessagesFromTamr()); - - // TODO: check derog hits. // Flight 2 this.loadFlight( "tamr-integration-data/flight2.txt", - new String[] { "IAD", "BRU", "YY", "0123", - "1587686400000", "1587686500000" } + new String[] { "KEF", "JFK", "FI", "0615", + "1582675200000", "1582675400000" } ); // 10 passengers should be processed by Tamr. assertEquals(10, tamrMock.respondToQuery()); @@ -177,11 +254,13 @@ public void testTamrIntegration() throws Exception { // Flight 3 this.loadFlight( "tamr-integration-data/flight3.txt", - new String[] { "KEF", "JFK", "FI", "0615", - "1582675200000", "1582675400000" } + new String[] { "IAD", "BRU", "YY", "0123", + "1587686400000", "1587686500000" } ); // 10 passengers should be processed by Tamr. assertEquals(10, tamrMock.respondToQuery()); + + clearCachedPassengers(); // Let GTAS process responses (should be 4). assertEquals(4, tamrUtils.synchronouslyProcessMessagesFromTamr()); @@ -196,5 +275,23 @@ public void testTamrIntegration() throws Exception { "GAYLA JOSEPH", "GAELLA JOSEPH" ); + + // Check derog hit. + this.persistWatchlistHits(); + long hitPassengerId = getPassengerIdFromName( + "REUBEN", "THEBAULT"); + Set hitDetailSet = + hitDetailRepository.getSetFromPassengerId(hitPassengerId); + assertEquals(1, hitDetailSet.size()); + HitDetail hitDetails = hitDetailSet.iterator().next(); + assertEquals(0.6, hitDetails.getPercentage(), 0.01); + assertTrue(hitDetails.getTitle().contains("Tamr")); + assertTrue(hitDetails.getDescription().contains("Tamr")); + WatchlistItem hitWatchlistItem = watchlistItemRepository.findOne( + hitDetails.getHitMakerId()); + assertNotNull(hitWatchlistItem); + assertTrue(hitWatchlistItem.getItemData().contains("RUBEN")); + assertTrue(hitWatchlistItem.getItemData().contains("THEBAULT")); + assertTrue(hitWatchlistItem.getItemData().contains("1945-01-11")); } } diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java index 243d8348b1..c35f29c73f 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java @@ -8,9 +8,11 @@ import static org.junit.Assert.*; import java.util.Map; +import java.util.Set; import java.util.StringJoiner; import java.util.UUID; import java.util.HashMap; +import java.util.HashSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -37,6 +39,11 @@ public class TamrMock { private final static String queryRegex = "\\{\"passengers\":\\[(?:" + queryPassengerRegex + ",?)+\\]\\}"; + private final static String derogEntryRegex = + "\\{\"gtasId\":\"(?\\d+)\",\"firstName\":\"(?[^\"]+)\",\"middleName\":[\"\\w ]+,\"lastName\":\"(?[^\"]+)\",\"gender\":null,\"dob\":\"(?[^\"]+)\",\"documents\":null,\"citizenshipCountry\":null,\"derogId\":\"(?\\d+)\"\\}"; + private final static String derogRegex = + "\\{\"passengers\":\\[(?:" + derogEntryRegex + ",?)+\\]\\}"; + private final static Map nameToTamrId = new HashMap() {{ put("HSIUYUAN JIANG", "00738a54-e024-3dcf-9df0-6a982022c8ea"); put("XIUYUAN JIANG", "00738a54-e024-3dcf-9df0-6a982022c8ea"); @@ -44,23 +51,31 @@ public class TamrMock { put("GAYLA JOSEPH", "00647e30-95ba-31a9-8660-2143e7dae0d3"); put("GAELLA JOSEPH", "00647e30-95ba-31a9-8660-2143e7dae0d3"); + + put("RUBEN THEBAULT", "75c317a7-e8f1-39e5-8faa-f18b757dba79"); + put("REUBEN THEBAULT", "75c317a7-e8f1-39e5-8faa-f18b757dba79"); }}; + private Map tamrIdToDerogId = new HashMap<>(); + @Autowired private TamrIntegrationTestUtils tamrUtils; + private String getTamrIdFromName(String name) { + String tamrId = nameToTamrId.get(name); + if (tamrId == null) { + tamrId = UUID.randomUUID().toString(); + } + return tamrId; + } + /** * Get the JSON clustering information Tamr should return for a single * passenger with the given gtasId and name. */ private String getPassengerHistoryResponse(String gtasId, String name) { - String tamrId = nameToTamrId.get(name); - if (tamrId == null) { - tamrId = UUID.randomUUID().toString(); - } - return String.format("{\"gtasId\":\"%s\",\"derogIds\":[],\"tamrId\":\"%s\",\"version\":1,\"score\":1.0}", - gtasId, tamrId); + gtasId, getTamrIdFromName(name)); } /** @@ -68,9 +83,14 @@ private String getPassengerHistoryResponse(String gtasId, String name) { * passenger with the given gtasId and name. */ private String getPassengerDerogResponse(String gtasId, String name) { - // TODO: implement - return String.format("{\"gtasId\":\"%s\",\"derogIds\":[],\"tamrId\":null,\"version\":-1,\"score\":0.0}", - gtasId); + String derogHit = ""; + String derogId = tamrIdToDerogId.get(getTamrIdFromName(name)); + if (derogId != null) { + derogHit = String.format("{\"derogId\":\"%s\",\"score\":0.6}", + derogId); + } + return String.format("{\"gtasId\":\"%s\",\"derogIds\":[%s],\"tamrId\":null,\"version\":-1,\"score\":0.0}", + gtasId, derogHit); } /** @@ -121,4 +141,41 @@ public int respondToQuery() throws JMSException { return passengersProcessed; } + + /** + * Respond to a DC.REPLACE message sent to Tamr. Returns the number of + * derog list entries received. + */ + public int respondToDerogReplace() throws JMSException { + TextMessage derogMessage = tamrUtils.getMessageSentToTamr(); + assertNotNull(derogMessage); + assertEquals("DC.REPLACE", derogMessage.getJMSType()); + + String derogJson = derogMessage.getText(); + logger.info("Processing DC.REPLACE message."); + + // First, make sure the entire message is well-formed. + Matcher derogMatcher = Pattern.compile(derogRegex).matcher(derogJson); + assertTrue(derogMatcher.matches()); + + // Then, extract the entries and make a new derog list from them. + int derogCount = 0; + tamrIdToDerogId.clear(); + Matcher entryMatcher = Pattern.compile(derogEntryRegex) + .matcher(derogJson); + while (entryMatcher.find()) { + String derogId = entryMatcher.group("derogId"); + String name = entryMatcher.group("firstName") + " " + + entryMatcher.group("lastName"); + tamrIdToDerogId.put(getTamrIdFromName(name), derogId); + derogCount += 1; + } + + // Finally, send an acknowledgement back to GTAS. + logger.info("Processed {} derog entries. Responding with acknowledgement.", + derogCount); + tamrUtils.sendMessageToGtasFromTamr("DC.REPLACE", + "{\"acknowledgment\":true,\"error\":null}"); + return derogCount; + } } diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt index 551c4efaf6..3458d46fc3 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr-integration-data/flight2.txt @@ -26,7 +26,7 @@ LOC+91+' DOC+K+48302004' DTM+36:210425' LOC+91+USA' -NAD+FL+++JIANG:XIUYUAN:' +NAD+FL+++CHIANG:XIUYUAN:' ATT+2++F' DTM+329:670604' MEA+CT++1' diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties index cdf1168552..6df6b12346 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties @@ -1 +1,5 @@ -tamr.enabled=true \ No newline at end of file +tamr.enabled=true +# High value so the derog replace never runs, since in the integration we +# call it manually. +tamr.derogReplace.fixedDelay.in.milliseconds=1000000000 +tamr.derogReplace.initialDelay.in.milliseconds=1000000000 From 7672f94999faec1ee798d8835c8abe8941946759 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Sun, 2 Feb 2020 12:38:07 -0500 Subject: [PATCH 39/83] Implement TamrDisabledIT --- .../gtas/job/scheduler/LoaderScheduler.java | 3 +- .../gtas/job/scheduler/TamrDisabledIT.java | 53 +++++++++++++++ .../java/gov/gtas/job/scheduler/TamrIT.java | 59 ++-------------- .../scheduler/TamrIntegrationTestUtils.java | 68 +++++++++++++++++-- .../java/gov/gtas/job/scheduler/TamrMock.java | 2 - 5 files changed, 123 insertions(+), 62 deletions(-) create mode 100644 gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrDisabledIT.java diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index 7ad078f73e..1b05ba5631 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -80,7 +80,7 @@ public String toString() { @Autowired private MessageStatusRepository messageStatusRepository; - @Autowired + @Autowired(required=false) private TamrMessageSender tamrMessageSender; @Value("${message.dir.processed}") @@ -108,7 +108,6 @@ void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) List messageStatusList = processedMessages.getMessageStatusList(); messageStatusRepository.saveAll(messageStatusList); - if (tamrEnabled) { List passToSend = processedMessages.getTamrPassengers(); TamrQuery tamrQuery = new TamrQuery(passToSend); diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrDisabledIT.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrDisabledIT.java new file mode 100644 index 0000000000..5b6d586658 --- /dev/null +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrDisabledIT.java @@ -0,0 +1,53 @@ +/* + * All GTAS code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * + * Please see LICENSE.txt for details. + */ +package gov.gtas.job.scheduler; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +import gov.gtas.config.TestCommonServicesConfig; + +/** + * Make sure that no Tamr-related code runs while tamr.enabled is false. + * @author Cassidy Laidlaw + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { TestCommonServicesConfig.class }) +@TestPropertySource(locations = { "classpath:default.application.properties" }, properties = {"tamr.enabled=false"}) +@Rollback(true) +public class TamrDisabledIT extends AbstractTransactionalJUnit4SpringContextTests { + private Logger logger = LoggerFactory.getLogger(TamrDisabledIT.class); + + @Autowired + private TamrIntegrationTestUtils tamrUtils; + + @Test + @Transactional + public void testTamrDisabled() throws Exception { + tamrUtils.disableJmsListeners(); + + tamrUtils.createWatchlistItems(); + tamrUtils.loadFlight( + "tamr-integration-data/flight1.txt", + new String[] { "SCL", "JFK", "LA", "0532", + "1579392000000", "1579394000000" } + ); + + // No messages should be sent to Tamr. + assertNull(tamrUtils.getMessageSentToTamr()); + } +} diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java index 4710e03d3a..ec37fc1b9c 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java @@ -7,7 +7,6 @@ import static org.junit.Assert.*; -import java.io.File; import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; @@ -16,7 +15,6 @@ import javax.persistence.PersistenceContext; import org.hibernate.Session; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; @@ -31,14 +29,10 @@ import com.google.common.collect.Iterables; -import gov.gtas.enumtype.EntityEnum; import gov.gtas.model.Flight; import gov.gtas.model.HitDetail; import gov.gtas.model.Passenger; import gov.gtas.model.watchlist.WatchlistItem; -import gov.gtas.model.watchlist.json.WatchlistItemSpec; -import gov.gtas.model.watchlist.json.WatchlistSpec; -import gov.gtas.model.watchlist.json.WatchlistTerm; import gov.gtas.parsers.tamr.TamrDerogReplaceScheduler; import gov.gtas.repository.FlightRepository; import gov.gtas.repository.HitDetailRepository; @@ -46,7 +40,6 @@ import gov.gtas.repository.PassengerRepository; import gov.gtas.repository.PendingHitDetailRepository; import gov.gtas.repository.watchlist.WatchlistItemRepository; -import gov.gtas.services.LoaderStatistics; import gov.gtas.services.PassengerService; import gov.gtas.svc.WatchlistService; @@ -60,17 +53,12 @@ @Rollback(true) public class TamrIT extends AbstractTransactionalJUnit4SpringContextTests { private Logger logger = LoggerFactory.getLogger(TamrIT.class); - - private ClassLoader classLoader; - + @Autowired private ApplicationContext applicationContext; @PersistenceContext private EntityManager entityManager; - - @Autowired - private LoaderScheduler loaderScheduler; @Autowired private FlightRepository flightRepository; @@ -84,9 +72,6 @@ public class TamrIT extends AbstractTransactionalJUnit4SpringContextTests { @Autowired private PassengerIDTagRepository passengerIDTagRepository; - @Autowired - private WatchlistService watchlistService; - @Autowired private PendingHitDetailRepository pendingHitDetailRepository; @@ -104,40 +89,6 @@ public class TamrIT extends AbstractTransactionalJUnit4SpringContextTests { @Autowired private TamrMock tamrMock; - - @Before - public void setUp() throws Exception { - classLoader = getClass().getClassLoader(); - } - - private WatchlistItemSpec createWatchlistItemSpec( - String firstName, String lastName, String dob) { - return new WatchlistItemSpec(null, "create", new WatchlistTerm[] { - new WatchlistTerm("firstName", "String", firstName), - new WatchlistTerm("lastName", "String", lastName), - new WatchlistTerm("dob", "String", dob) - }); - } - - private void createWatchlistItems() { - WatchlistSpec spec = new WatchlistSpec("Watchlist", - EntityEnum.PASSENGER.getEntityName()); - spec.addWatchlistItem(createWatchlistItemSpec( - "RUBEN", "THEBAULT", "1945-01-11")); - spec.addWatchlistItem(createWatchlistItemSpec( - "KIM", "OSAYUWAME", "1971-09-16")); - spec.addWatchlistItem(createWatchlistItemSpec( - "ALICIA", "DAVIES", "1962-05-21")); - watchlistService.createUpdateDeleteWatchlistItems("ADMIN", spec, 1L); - } - - private void loadFlight(String messageFilePath, String[] primeFlightKey) - throws Exception { - File messageFile = new File(classLoader.getResource( - messageFilePath).getFile()); - LoaderStatistics stats = new LoaderStatistics(); - loaderScheduler.processSingleFile(messageFile, stats, primeFlightKey); - } private long getPassengerIdFromName(String firstName, String lastName) { Long passengerId = null; @@ -224,7 +175,7 @@ private void assertTamrIdsMatch(String ...names) { public void testTamrIntegration() throws Exception { tamrUtils.disableJmsListeners(); - this.createWatchlistItems(); + tamrUtils.createWatchlistItems(); derogReplaceScheduler.jobScheduling(); // 3 derog entries should be processed by Tamr. assertEquals(3, tamrMock.respondToDerogReplace()); @@ -232,7 +183,7 @@ public void testTamrIntegration() throws Exception { assertEquals(1, tamrUtils.synchronouslyProcessMessagesFromTamr()); // Flight 1 - this.loadFlight( + tamrUtils.loadFlight( "tamr-integration-data/flight1.txt", new String[] { "SCL", "JFK", "LA", "0532", "1579392000000", "1579394000000" } @@ -243,7 +194,7 @@ public void testTamrIntegration() throws Exception { assertEquals(2, tamrUtils.synchronouslyProcessMessagesFromTamr()); // Flight 2 - this.loadFlight( + tamrUtils.loadFlight( "tamr-integration-data/flight2.txt", new String[] { "KEF", "JFK", "FI", "0615", "1582675200000", "1582675400000" } @@ -252,7 +203,7 @@ public void testTamrIntegration() throws Exception { assertEquals(10, tamrMock.respondToQuery()); // Flight 3 - this.loadFlight( + tamrUtils.loadFlight( "tamr-integration-data/flight3.txt", new String[] { "IAD", "BRU", "YY", "0123", "1587686400000", "1587686500000" } diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java index 344eaf90f4..5f337c72f8 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java @@ -5,14 +5,20 @@ */ package gov.gtas.job.scheduler; +import java.io.File; + import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import javax.jms.TextMessage; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.apache.activemq.ActiveMQConnectionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.jms.config.JmsListenerEndpointRegistry; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; @@ -20,8 +26,14 @@ import org.springframework.jms.listener.MessageListenerContainer; import org.springframework.stereotype.Component; +import gov.gtas.enumtype.EntityEnum; +import gov.gtas.model.watchlist.json.WatchlistItemSpec; +import gov.gtas.model.watchlist.json.WatchlistSpec; +import gov.gtas.model.watchlist.json.WatchlistTerm; import gov.gtas.parsers.tamr.jms.TamrMessageReceiver; import gov.gtas.parsers.tamr.jms.TamrQueueConfig; +import gov.gtas.services.LoaderStatistics; +import gov.gtas.svc.WatchlistService; /** @@ -34,19 +46,32 @@ public class TamrIntegrationTestUtils { private JmsTemplate jmsTemplate; + private ClassLoader classLoader = getClass().getClassLoader(); + @Autowired private JmsListenerEndpointRegistry jmsListenerRegistry; + + @Autowired(required=false) + private TamrMessageReceiver tamrMessageReceiver; + + @PersistenceContext + private EntityManager entityManager; @Autowired - private TamrQueueConfig tamrQueueConfig; + private LoaderScheduler loaderScheduler; @Autowired - private TamrMessageReceiver tamrMessageReceiver; + private WatchlistService watchlistService; + + @Value("${tamr.activemq.broker.url}") + private String activeMQBrokerUrl; private void configureJmsTemplate() { if (jmsTemplate == null) { - this.jmsTemplate = new JmsTemplate( - tamrQueueConfig.senderConnectionFactory()); + ActiveMQConnectionFactory aMQConnection = + new ActiveMQConnectionFactory(); + aMQConnection.setBrokerURL(activeMQBrokerUrl); + this.jmsTemplate = new JmsTemplate(aMQConnection); this.jmsTemplate.setReceiveTimeout(1000); } } @@ -105,4 +130,39 @@ public int synchronouslyProcessMessagesFromTamr() { return messagesProcessed; } + private WatchlistItemSpec createWatchlistItemSpec( + String firstName, String lastName, String dob) { + return new WatchlistItemSpec(null, "create", new WatchlistTerm[] { + new WatchlistTerm("firstName", "String", firstName), + new WatchlistTerm("lastName", "String", lastName), + new WatchlistTerm("dob", "String", dob) + }); + } + + /** + * Create some sample watchlist items. + */ + public void createWatchlistItems() { + WatchlistSpec spec = new WatchlistSpec("Watchlist", + EntityEnum.PASSENGER.getEntityName()); + spec.addWatchlistItem(createWatchlistItemSpec( + "RUBEN", "THEBAULT", "1945-01-11")); + spec.addWatchlistItem(createWatchlistItemSpec( + "KIM", "OSAYUWAME", "1971-09-16")); + spec.addWatchlistItem(createWatchlistItemSpec( + "ALICIA", "DAVIES", "1962-05-21")); + watchlistService.createUpdateDeleteWatchlistItems("ADMIN", spec, 1L); + } + + /** + * Load a flight with the given path and prime flight key. + */ + public void loadFlight(String messageFilePath, String[] primeFlightKey) + throws Exception { + File messageFile = new File(classLoader.getResource( + messageFilePath).getFile()); + LoaderStatistics stats = new LoaderStatistics(); + loaderScheduler.processSingleFile(messageFile, stats, primeFlightKey); + } + } diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java index c35f29c73f..62a2adbe68 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java @@ -8,11 +8,9 @@ import static org.junit.Assert.*; import java.util.Map; -import java.util.Set; import java.util.StringJoiner; import java.util.UUID; import java.util.HashMap; -import java.util.HashSet; import java.util.regex.Matcher; import java.util.regex.Pattern; From c8dca0f2f701b419f7e6da308f872b63054a0f33 Mon Sep 17 00:00:00 2001 From: harlankadish Date: Mon, 3 Feb 2020 13:01:14 -0500 Subject: [PATCH 40/83] Draft of LowDataOptimized mode --- .../matcher/quickmatch/MatchingContext.java | 55 +++++++++++-------- .../quickmatch/QuickMatcherConfig.java | 12 +++- .../matcher/quickmatch/QuickMatcherImpl.java | 25 ++++++--- .../gov/gtas/services/QuickMatcherTest.java | 54 +++++++++++++----- 4 files changed, 98 insertions(+), 48 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java index 5485bc85dc..8828863ab9 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java @@ -5,29 +5,21 @@ */ package gov.gtas.services.matcher.quickmatch; -import java.io.IOException; -import java.text.ParseException; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import gov.gtas.services.matcher.quickmatch.QuickMatcherConfig.AccuracyMode; +import gov.gtas.util.DateCalendarUtils; import org.apache.commons.codec.language.DoubleMetaphone; +import org.apache.commons.codec.language.Nysiis; import org.apache.commons.text.similarity.JaroWinklerDistance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; - -import gov.gtas.services.matcher.quickmatch.QuickMatcherConfig.AccuracyMode; -import gov.gtas.util.DateCalendarUtils; +import java.io.IOException; +import java.text.ParseException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; /* * Do not make this a bean without taking multithreading into account. @@ -111,15 +103,20 @@ public int getDobYearOffset() { return dobYearOffset; } + // For normal operation: get accuracyMode from config public void initialize(final List> watchListItems) { + this.initialize(watchListItems, this.config.getAccuracyMode()); + } + // For testing: force an accuracyMode + public void initialize(final List> watchListItems, final String accuracyMode) { initializeConfig(); - this.accuracyMode = this.config.getAccuracyMode(); + this.accuracyMode = accuracyMode; this.matchClauses = config.getClausesForAccuracyMode(accuracyMode); this.derogList = watchListItems; - this.derogList = this.renameAttributes(this.derogList); + this.derogList = this.prepareAttributes(this.derogList); /** * Split the list into sets where each matchClause applies; Then, for each @@ -210,7 +207,7 @@ private static Map>> mapClauseValuesToDerogIds( public MatchingResult match(List> travelers, Set foundDerogIds) { // Rename attributes - this.renameAttributes(travelers); + this.prepareAttributes(travelers); // Dictionary for match responses, so that each traveler has a single // response object that grows as hits are found from different representations @@ -445,10 +442,11 @@ private Double goodTextDistance(String name1, String name2) { } // Attribute renames and cleansing - private List> renameAttributes(List> parsedRecords) + private List> prepareAttributes(List> parsedRecords) throws IllegalArgumentException { DoubleMetaphone dmeta = new DoubleMetaphone(); + Nysiis nysiis = new Nysiis(false); // If gtasId and derogId are renamed to same thing, only change the appropriate // one. @@ -467,7 +465,8 @@ private List> renameAttributes(List> renameAttributes(List> renameAttributes(List> balanced; private List> highPrecision; private List> gtasDefault; + private List> lowDataOptimized; + public List> getGtasDefault() { return gtasDefault; @@ -107,6 +108,10 @@ public List> getHighPrecision() { return highPrecision; } + public List> getLowDataOptimized() { + return lowDataOptimized; + } + public List> getClausesForAccuracyMode(String mode) { HashMap>> modes = new HashMap<>(); // We allow the clauses in the modes to be edited, @@ -116,6 +121,7 @@ public List> getClausesForAccuracyMode(String mode) { modes.put(AccuracyMode.BALANCED_WITH_TEXT_DISTANCE.toString(), balanced); modes.put(AccuracyMode.HIGH_PRECISION.toString(), highPrecision); modes.put(AccuracyMode.GTAS_DEFAULT.toString(), gtasDefault); + modes.put(AccuracyMode.LOW_DATA_OPTIMIZED.toString(), lowDataOptimized); return modes.get(mode); } diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherImpl.java index b9c6967f09..144f9486a8 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherImpl.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherImpl.java @@ -5,18 +5,13 @@ */ package gov.gtas.services.matcher.quickmatch; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - +import gov.gtas.model.Passenger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import gov.gtas.model.Passenger; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; public class QuickMatcherImpl implements QuickMatcher { @@ -28,6 +23,7 @@ public class QuickMatcherImpl implements QuickMatcher { private final MatchingContext cxt; private static final Set EMPTY_DEROGLIST = new HashSet<>(); + // For normal operations, the MatchingContext gets accuracyMode from config files public QuickMatcherImpl(final List> watchListItems) { this.cxt = new MatchingContext(); @@ -38,6 +34,17 @@ public QuickMatcherImpl(final List> watchListItems) { this.cxt.initialize(watchListItems); } + // For testing, to force and accuracyMode + public QuickMatcherImpl(final List> watchListItems, final String accuracyMode) { + this.cxt = new MatchingContext(); + + // sanity check + if (watchListItems == null) + this.cxt.initialize(new ArrayList<>(), accuracyMode); + else + this.cxt.initialize(watchListItems, accuracyMode); + } + public MatchingContext getCxt() { return cxt; } diff --git a/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/QuickMatcherTest.java b/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/QuickMatcherTest.java index 022dccac0f..40c11ac9fc 100644 --- a/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/QuickMatcherTest.java +++ b/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/QuickMatcherTest.java @@ -8,8 +8,15 @@ package gov.gtas.services; -import static gov.gtas.services.matcher.quickmatch.MatchingContext.DOB_YEAR_OFFSET; -import static org.junit.Assert.assertEquals; +import com.fasterxml.jackson.databind.ObjectMapper; +import gov.gtas.model.Passenger; +import gov.gtas.model.PassengerDetails; +import gov.gtas.model.watchlist.json.WatchlistItemSpec; +import gov.gtas.services.matcher.quickmatch.DerogHit; +import gov.gtas.services.matcher.quickmatch.MatchingResult; +import gov.gtas.services.matcher.quickmatch.QuickMatcher; +import gov.gtas.services.matcher.quickmatch.QuickMatcherImpl; +import org.junit.Test; import java.io.IOException; import java.text.ParseException; @@ -18,17 +25,8 @@ import java.util.HashMap; import java.util.List; -import gov.gtas.services.matcher.quickmatch.QuickMatcherImpl; -import org.junit.Test; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import gov.gtas.model.Passenger; -import gov.gtas.model.PassengerDetails; -import gov.gtas.model.watchlist.json.WatchlistItemSpec; -import gov.gtas.services.matcher.quickmatch.DerogHit; -import gov.gtas.services.matcher.quickmatch.MatchingResult; -import gov.gtas.services.matcher.quickmatch.QuickMatcher; +import static gov.gtas.services.matcher.quickmatch.MatchingContext.DOB_YEAR_OFFSET; +import static org.junit.Assert.assertEquals; public class QuickMatcherTest { @@ -76,6 +74,36 @@ public void testJaroWinklerWithSameDOBYear() throws IOException { } + @Test + public void testLowDataOptimizedDobYear() throws IOException { + + Passenger p = getTestPassenger(1, "John", "Doe", null, "1988-01-01"); + + List> derogList = getTestWL(11, "John", "Doe", "1988-03-15"); + + QuickMatcher qm = new QuickMatcherImpl(derogList, "lowDataOptimized"); + MatchingResult result = qm.match(p); + result.getResponses(); + + assertEquals(1, result.getTotalHits()); + + } + + @Test + public void testLowDataOptimizedNYSIIS() throws IOException { + + Passenger p = getTestPassenger(1, "Josh", "MCKENZIE", null, "1988-01-01"); + + List> derogList = getTestWL(11, "Joshua", "MACKENZIE", "1988-03-15"); + + QuickMatcher qm = new QuickMatcherImpl(derogList, "lowDataOptimized"); + MatchingResult result = qm.match(p); + result.getResponses(); + + assertEquals(1, result.getTotalHits()); + + } + @Test public void jaroWinklerHitWith4YearsDOBYearOffsetShouldFail() throws IOException { From 6bcf8068c2831606227bff93217a30de8b70a2c3 Mon Sep 17 00:00:00 2001 From: harlankadish Date: Mon, 3 Feb 2020 14:27:10 -0500 Subject: [PATCH 41/83] QMConfig.yaml with new accuracy mode --- .../gtas-commons/src/main/resources/QMConfig.yaml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml b/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml index 01a227b9c2..46a07b9c58 100644 --- a/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml +++ b/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml @@ -99,4 +99,14 @@ gtasDefault: - first_name - DOB_Date - metaphones - + +lowDataOptimized: + - + - full_name + - dob_year + - + - metaphones + - dob_year + - + - nysiis + - dob_year From 2db751f48ccd672643fb64ad3115b2da15287645 Mon Sep 17 00:00:00 2001 From: harlankadish Date: Mon, 3 Feb 2020 15:05:42 -0500 Subject: [PATCH 42/83] Fixed NPE in MatchingContext constructor --- .../gtas/services/matcher/quickmatch/MatchingContext.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java index 8828863ab9..fe523cc687 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java @@ -105,6 +105,7 @@ public int getDobYearOffset() { // For normal operation: get accuracyMode from config public void initialize(final List> watchListItems) { + this.initializeConfig(); this.initialize(watchListItems, this.config.getAccuracyMode()); } @@ -117,7 +118,6 @@ public void initialize(final List> watchListItems, final this.derogList = watchListItems; this.derogList = this.prepareAttributes(this.derogList); - /** * Split the list into sets where each matchClause applies; Then, for each * query, we need only apply a clause to derog records where it is valid. @@ -402,7 +402,7 @@ && isSameDOBYearMonthDay(traveler.get("DOB_Date"), derogRecord.get("DOB_Date"))) /** * * @param travelerDate - * @param deragDate + * @param derogDate * @return * @throws ParseException */ @@ -422,7 +422,7 @@ private int calculateYearOffset(String travelerDate, String derogDate) { * Compares the two Dates for equality * * @param travelerDate - * @param deragDate + * @param derogDate * @return */ private boolean isSameDOBYearMonthDay(String travelerDate, String derogDate) { @@ -452,7 +452,6 @@ private List> prepareAttributes(List batchRenames = new HashMap<>(config.getAttributeRenames()); - // Begin per-record renames and pre-processing // Use iterator so we can remove records with critical errors Iterator> recordIterator = parsedRecords.iterator(); From f5a665c19e57febf0e38bb4ae19d6320cde906c6 Mon Sep 17 00:00:00 2001 From: harlankadish Date: Mon, 3 Feb 2020 15:24:05 -0500 Subject: [PATCH 43/83] Comments on LowDataOptimized mode --- .../gtas/services/matcher/quickmatch/MatchingContext.java | 6 ++++++ .../services/matcher/quickmatch/QuickMatcherConfig.java | 6 ++++++ gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml | 1 + 3 files changed, 13 insertions(+) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java index fe523cc687..9d0e01d3ec 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/MatchingContext.java @@ -62,6 +62,12 @@ public QuickMatcherConfig getConfig() { * queries where Balanced mode may struggle. On other queries, though, it simple * returns hits that Balanced mode already found. * + * LowDataOptimized: Higher recall and precision than other modes when both + * (a) the watchlist contains only first name, last name, and DOB, and + * (b) the DOBs contain accurate years but a majority of dummy birtdays, e.g. + * it is known that a traveler or watchlist person was born in 1991, but the + * birthday is arbitrarily chosen to a default value like "January 1." + * * gtasDefault: The default: * */ diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherConfig.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherConfig.java index 3c08e30105..d300a4b347 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherConfig.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/matcher/quickmatch/QuickMatcherConfig.java @@ -52,6 +52,12 @@ public String toString() { * extra algorithm finds more true hits than Balanced mode alone, for some * queries where Balanced mode may struggle. On other queries, though, it simple * returns hits that Balanced mode already found. + * + * LowDataOptimized: Higher recall and precision than other modes when both + * (a) the watchlist contains only first name, last name, and DOB, and + * (b) the DOBs contain accurate years but a majority of dummy birtdays, e.g. + * it is known that a traveler or watchlist person was born in 1991, but the + * birthday is arbitrarily chosen to a default value like "January 1." * * gtasDefault: The default: * diff --git a/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml b/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml index 46a07b9c58..95fafe2022 100644 --- a/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml +++ b/gtas-parent/gtas-commons/src/main/resources/QMConfig.yaml @@ -3,6 +3,7 @@ # Balanced # HighRecall # HighPrecision +# LowDataOptimized accuracyMode: gtasDefault derogFilterOutRegex: "^(UNKNOWN|other|NA|\\?|_)$" From a49ea7c97b61a474f58245e48edfedf20bc60d78 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Tue, 4 Feb 2020 20:31:58 +0000 Subject: [PATCH 44/83] Handle invalid (non-numeric) gtasIds and derogIds from Tamr --- .../tamr/TamrMessageHandlerServiceImpl.java | 107 +++++++++++------- .../parsers/tamr/HandleTamrDerogHitsTest.java | 27 +++++ .../gtas/parsers/tamr/UpdateTamrIdTest.java | 39 +++++++ 3 files changed, 130 insertions(+), 43 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 09635f158e..d3ba0e9b0c 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -68,49 +68,63 @@ public void handleQueryResponse(TamrMessage response) { * derog hit from Tamr. */ private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { - long gtasId = Long.parseLong(gtasIdStr); - PendingHitDetails pendingHit = new PendingHitDetails(); - - pendingHit.setTitle("Tamr Fuzzy Watchlist Hit"); - pendingHit.setDescription("This passenger closely matches a watchlist " + - "entry, according to Tamr's proprietary fuzzy matching " + - "technology."); - - pendingHit.setHitEnum(HitTypeEnum.PARTIAL_WATCHLIST); - pendingHit.setHitType(pendingHit.getHitEnum().toString()); - - // Try to get watchlist item based on derogId from Tamr. - long watchlistItemId = Long.parseLong(derogHit.getDerogId()); - Optional watchlistItem = - watchlistItemRepository.findById(watchlistItemId); - try { - pendingHit.setHitMakerId(watchlistItem.get().getId()); - pendingHit.setPercentage(derogHit.getScore()); - - // Tamr doesn't return any details about the matching algorithm, - // so leave this empty. - pendingHit.setRuleConditions(""); - } catch (NoSuchElementException e) { - logger.warn("Tamr returned derog hit for nonexistent watchlist " + - "entry with ID {}.", watchlistItemId); - return; - } - - // Try to find passenger in GTAS so we can get the associated flight. - Optional passenger = passengerRepository.findById(gtasId); - try { - pendingHit.setFlightId(passenger.get().getFlight().getId()); - pendingHit.setPassengerId(gtasId); - } catch (NoSuchElementException e) { - logger.warn("Tamr returned derog hit for nonexistent passenger " + - "with ID {}.", gtasId); - return; - } - - pendingHit.setCreatedDate(new Date()); + long gtasId; + try { + gtasId = Long.parseLong(gtasIdStr); + } catch (NumberFormatException e) { + logger.warn("Tamr returned derog hit for passenger with invalid " + + "ID \"{}\".", gtasIdStr); + return; + } + PendingHitDetails pendingHit = new PendingHitDetails(); + + pendingHit.setTitle("Tamr Fuzzy Watchlist Hit"); + pendingHit.setDescription("This passenger closely matches a watchlist " + + "entry, according to Tamr's proprietary fuzzy matching " + + "technology."); + + pendingHit.setHitEnum(HitTypeEnum.PARTIAL_WATCHLIST); + pendingHit.setHitType(pendingHit.getHitEnum().toString()); + + // Try to get watchlist item based on derogId from Tamr. + long watchlistItemId; + try { + watchlistItemId = Long.parseLong(derogHit.getDerogId()); + } catch (NumberFormatException e) { + logger.warn("Tamr returned derog hit for watchlist entry with " + + "invalid ID \"{}\".", derogHit.getDerogId()); + return; + } + Optional watchlistItem = + watchlistItemRepository.findById(watchlistItemId); + try { + pendingHit.setHitMakerId(watchlistItem.get().getId()); + pendingHit.setPercentage(derogHit.getScore()); + + // Tamr doesn't return any details about the matching algorithm, + // so leave this empty. + pendingHit.setRuleConditions(""); + } catch (NoSuchElementException e) { + logger.warn("Tamr returned derog hit for nonexistent watchlist " + + "entry with ID {}.", watchlistItemId); + return; + } + + // Try to find passenger in GTAS so we can get the associated flight. + Optional passenger = passengerRepository.findById(gtasId); + try { + pendingHit.setFlightId(passenger.get().getFlight().getId()); + pendingHit.setPassengerId(gtasId); + } catch (NoSuchElementException e) { + logger.warn("Tamr returned derog hit for nonexistent passenger " + + "with ID {}.", gtasId); + return; + } + + pendingHit.setCreatedDate(new Date()); - // Persist to database. - pendingHitDetailRepository.save(pendingHit); + // Persist to database. + pendingHitDetailRepository.save(pendingHit); } /** @@ -168,7 +182,14 @@ public void handleTamrIdUpdate(TamrMessage message) { * issues a warning. */ private void updateTamrId(String gtasIdStr, String tamrId, int version) { - long gtasId = Long.parseLong(gtasIdStr); + long gtasId; + try { + gtasId = Long.parseLong(gtasIdStr); + } catch (NumberFormatException e) { + logger.warn("Unable to update tamrId of passenger with invalid " + + "ID \"{}\".", gtasIdStr); + return; + } PassengerIDTag currentPassengerIdTag = passengerIDTagRepository.findByPaxId(gtasId); if (currentPassengerIdTag == null) { diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java index e5f216d292..98c74358eb 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -115,6 +115,20 @@ public void handleNonexistentDerogId() { verifyZeroInteractions(pendingHitDetailRepository); } + /** + * Test when Tamr sends an invalid (non-numeric) derogId. + */ + @Test + public void handleInvalidDerogId() { + TamrMessage derogMessage = getDerogMessage( + passenger.getId(), watchlistItem.getId(), 1); + derogMessage.getTravelerQuery().get(0).getDerogIds().get(0) + .setDerogId("abc"); + handler.handleQueryResponse(derogMessage); + + verifyZeroInteractions(pendingHitDetailRepository); + } + /** * Test when Tamr sends a nonexistent gtasId. */ @@ -127,6 +141,19 @@ public void handleNonexistentGtasId() { verifyZeroInteractions(pendingHitDetailRepository); } + /** + * Test when Tamr sends an invalid (non-numeric) gtasId. + */ + @Test + public void handleInvalidGtasId() { + TamrMessage derogMessage = getDerogMessage( + passenger.getId(), watchlistItem.getId(), 1); + derogMessage.getTravelerQuery().get(0).setGtasId("abc"); + handler.handleQueryResponse(derogMessage); + + verifyZeroInteractions(pendingHitDetailRepository); + } + /** * Constructs a QUERY response TamrMessage that includes matching the * given passenger with the given wachlist item. diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java index d71168e0e8..03c615f86c 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java @@ -1,10 +1,16 @@ package gov.gtas.parsers.tamr; import static org.junit.Assert.*; +import static org.mockito.AdditionalMatchers.not; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.*; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; +import java.util.Optional; import org.junit.Before; import org.junit.Test; @@ -43,6 +49,8 @@ public void setUp() { passengerIdTag.setPax_id(gtasId); given(passengerIDTagRepository.findByPaxId(gtasId)).willReturn( passengerIdTag); + given(passengerIDTagRepository.findByPaxId(not(eq(gtasId)))) + .willReturn(null); } @Test @@ -113,4 +121,35 @@ public void testClusterMessage() { verify(passengerIDTagRepository).updateTamrId( gtasId, newTamrId); } + + /** + * Make sure invalid or nonexistent gtasIds are handled correctly. + */ + @Test + public void testInvalidGtasId() { + List travelerResponses = new ArrayList<>(); + + TamrTravelerResponse travelerResponse = new TamrTravelerResponse(); + travelerResponse.setGtasId("abc"); + travelerResponse.setDerogIds(Collections.emptyList()); + travelerResponse.setTamrId(newTamrId); + travelerResponse.setVersion(1); + travelerResponse.setScore(1); + travelerResponses.add(travelerResponse); + + travelerResponse = new TamrTravelerResponse(); + travelerResponse.setGtasId("3"); + travelerResponse.setDerogIds(Collections.emptyList()); + travelerResponse.setTamrId(newTamrId); + travelerResponse.setVersion(1); + travelerResponse.setScore(1); + travelerResponses.add(travelerResponse); + + TamrMessage message = new TamrMessage(); + message.setTravelerQuery(travelerResponses); + + handler.handleQueryResponse(message); + + verify(passengerIDTagRepository, never()).updateTamrId(any(), any()); + } } From 35281ce6d903bde4f05a2db1e7c5ae1b340f8c79 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 6 Mar 2020 10:26:48 -0500 Subject: [PATCH 45/83] Re-add optional = false to @OneToOne annotations where they were removed --- .../src/main/java/gov/gtas/model/FlightHitsFuzzy.java | 2 +- .../src/main/java/gov/gtas/model/FlightHitsGraph.java | 2 +- .../src/main/java/gov/gtas/model/FlightHitsRule.java | 2 +- .../src/main/java/gov/gtas/model/FlightHitsWatchlist.java | 2 +- .../src/main/java/gov/gtas/model/FlightPassengerCount.java | 2 +- .../src/main/java/gov/gtas/model/MessageStatus.java | 2 +- .../src/main/java/gov/gtas/model/MutableFlightDetails.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java index 982949a0c2..836e4f2618 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsFuzzy.java @@ -18,7 +18,7 @@ public class FlightHitsFuzzy { @Column(name = "fhf_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(fetch = FetchType.LAZY) + @OneToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "fhf_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java index 42b2350b6c..a25b8e82e6 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsGraph.java @@ -17,7 +17,7 @@ public class FlightHitsGraph { @Column(name = "fhg_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(fetch = FetchType.LAZY) + @OneToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "fhg_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java index 0b1f32ca37..7dd2fc5857 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsRule.java @@ -10,7 +10,7 @@ public class FlightHitsRule { @Column(name = "fhr_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(fetch = FetchType.LAZY) + @OneToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "fhr_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java index c230487e5f..814e1acec8 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightHitsWatchlist.java @@ -10,7 +10,7 @@ public class FlightHitsWatchlist { @Column(name = "fhw_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(fetch = FetchType.LAZY) + @OneToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "fhw_flight_id", referencedColumnName = "id", updatable = false, insertable = false) Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java index 793725333b..51c41e01b6 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPassengerCount.java @@ -10,7 +10,7 @@ public class FlightPassengerCount { @Column(name = "fp_flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(fetch = FetchType.LAZY) + @OneToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "fp_flight_id", referencedColumnName = "id", updatable = false, insertable = false) private Flight flight; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java index 37ec79e7b2..ed4c0f6c11 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MessageStatus.java @@ -16,7 +16,7 @@ public class MessageStatus { @Column(name = "ms_message_id", columnDefinition = "bigint unsigned") private Long messageId; - @OneToOne(fetch = FetchType.EAGER) + @OneToOne(optional = false, fetch = FetchType.EAGER) @JoinColumn(name = "ms_message_id", referencedColumnName = "id", updatable = false, insertable = false) private Message message; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java index c74006153f..a4c97ec142 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/MutableFlightDetails.java @@ -19,7 +19,7 @@ public MutableFlightDetails(Long id) { @Column(name = "flight_id", columnDefinition = "bigint unsigned") private Long flightId; - @OneToOne(fetch = FetchType.LAZY) + @OneToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "flight_id", referencedColumnName = "id", updatable = false, insertable = false) private Flight flight; From 3283c6df05cd5c95cf10a2720db821c44bc0430f Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 6 Mar 2020 15:11:46 -0500 Subject: [PATCH 46/83] Fix TamrIT when OneToOne fields have nullable = false --- .../gtas-commons/src/main/resources/hibernate.properties | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gtas-parent/gtas-commons/src/main/resources/hibernate.properties b/gtas-parent/gtas-commons/src/main/resources/hibernate.properties index c25bdb0f4b..9cf8d6afd4 100755 --- a/gtas-parent/gtas-commons/src/main/resources/hibernate.properties +++ b/gtas-parent/gtas-commons/src/main/resources/hibernate.properties @@ -20,6 +20,11 @@ hibernate.cache.provider_configuration_file_resource_path = classpath:hazelcast. hibernate.id.new_generator_mappings=false +# This option must be set to false to make the Tamr integration test (TamrIT) +# work. The option is set to false by default when running in Tomcat, but not +# during integration tests for some reason. +hibernate.check_nullability=false + javax.persistence.sharedCache.mode = ENABLE_SELECTIVE c3p0.min_size=3 From 35c3c648898dfa91b69b5b529b9e5bfee1169207 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 6 Mar 2020 16:52:20 -0500 Subject: [PATCH 47/83] Use enums instead of strings for Tamr message types and Tamr history cluster action types --- .../gtas/job/scheduler/LoaderScheduler.java | 4 +- .../tamr/TamrDerogReplaceScheduler.java | 6 ++- .../tamr/TamrMessageHandlerServiceImpl.java | 5 ++- .../parsers/tamr/jms/TamrMessageReceiver.java | 32 ++++++++++------ .../parsers/tamr/jms/TamrMessageSender.java | 8 ++-- .../tamr/model/TamrHistoryCluster.java | 6 +-- .../tamr/model/TamrHistoryClusterAction.java | 5 +++ .../gtas/parsers/tamr/model/TamrMessage.java | 6 +-- .../parsers/tamr/model/TamrMessageType.java | 37 +++++++++++++++++++ .../parsers/tamr/ReceiveTamrMessagesTest.java | 4 +- .../tamr/TamrDerogReplaceSchedulerTest.java | 7 ++-- .../tamr/TamrStatusErrorMessagesTest.java | 26 +++++++------ .../gtas/parsers/tamr/UpdateTamrIdTest.java | 5 ++- 13 files changed, 107 insertions(+), 44 deletions(-) create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryClusterAction.java create mode 100644 gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessageType.java diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index 1b05ba5631..53ecda3f11 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -17,6 +17,7 @@ import gov.gtas.json.AuditActionTarget; import gov.gtas.model.MessageStatus; import gov.gtas.parsers.tamr.jms.TamrMessageSender; +import gov.gtas.parsers.tamr.model.TamrMessageType; import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.tamr.model.TamrQuery; import gov.gtas.repository.MessageStatusRepository; @@ -111,7 +112,8 @@ void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) if (tamrEnabled) { List passToSend = processedMessages.getTamrPassengers(); TamrQuery tamrQuery = new TamrQuery(passToSend); - tamrMessageSender.sendMessageToTamr("QUERY", tamrQuery); + tamrMessageSender.sendMessageToTamr( + TamrMessageType.QUERY, tamrQuery); } if (result != null) { diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java index e6f5a06451..76b0c31828 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java @@ -24,6 +24,7 @@ import gov.gtas.parsers.tamr.jms.TamrMessageSender; import gov.gtas.parsers.tamr.model.TamrDerogListEntry; import gov.gtas.parsers.tamr.model.TamrDerogListUpdate; +import gov.gtas.parsers.tamr.model.TamrMessageType; import gov.gtas.repository.watchlist.WatchlistItemRepository; import gov.gtas.repository.watchlist.WatchlistRepository; @@ -55,7 +56,7 @@ public class TamrDerogReplaceScheduler { private Date lastRun = null; /** - * Replace the watchlist in Tamr if the GTAS ons has changed. + * Replace the watchlist in Tamr if the GTAS one has changed. **/ @Scheduled(fixedDelayString = "${tamr.derogReplace.fixedDelay.in.milliseconds}", initialDelayString = "${tamr.derogReplace.initialDelay.in.milliseconds}") @@ -82,7 +83,8 @@ public void jobScheduling() throws InterruptedException { tamrAdapter.convertWatchlist(watchlistItems); TamrDerogListUpdate derogReplace = new TamrDerogListUpdate(derogListEntries); - tamrMessageSender.sendMessageToTamr("DC.REPLACE", derogReplace); + tamrMessageSender.sendMessageToTamr( + TamrMessageType.DC_REPLACE, derogReplace); lastRun = new Date(); } else { diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index d3ba0e9b0c..c9277241d1 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -19,6 +19,7 @@ import gov.gtas.model.watchlist.WatchlistItem; import gov.gtas.parsers.tamr.model.TamrDerogHit; import gov.gtas.parsers.tamr.model.TamrHistoryCluster; +import gov.gtas.parsers.tamr.model.TamrHistoryClusterAction; import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.parsers.tamr.model.TamrTravelerResponse; import gov.gtas.repository.PassengerIDTagRepository; @@ -162,10 +163,10 @@ public void handleTamrIdUpdate(TamrMessage message) { for (TamrHistoryCluster cluster: message.getHistoryClusters()) { if (cluster.getAction() == null || - cluster.getAction().equals("UPDATE")) { + cluster.getAction() == TamrHistoryClusterAction.UPDATE) { this.updateTamrId(cluster.getGtasId(), cluster.getTamrId(), cluster.getVersion()); - } else if (cluster.getAction().equals("DELETE")) { + } else if (cluster.getAction() == TamrHistoryClusterAction.DELETE) { this.updateTamrId(cluster.getGtasId(), null, cluster.getVersion()); } else { diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java index 103e7c1086..e45306ed11 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java @@ -5,6 +5,7 @@ */ package gov.gtas.parsers.tamr.jms; +import java.awt.TrayIcon.MessageType; import java.io.IOException; import javax.jms.JMSException; @@ -23,6 +24,7 @@ import gov.gtas.parsers.tamr.TamrMessageHandlerService; import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrMessageType; import gov.gtas.repository.PassengerIDTagRepository; @Component @@ -39,7 +41,8 @@ public class TamrMessageReceiver { public void receive(javax.jms.Message msg) { logger.debug("############### Tamr data received .... ################"); TextMessage textMessage = null; - String messageType, messageText; + String jmsMessageType, messageText; + TamrMessageType messageType; if (msg == null) { logger.warn("Received null JMS message from Tamr"); @@ -48,14 +51,14 @@ public void receive(javax.jms.Message msg) { textMessage = (TextMessage) msg; try { - messageType = textMessage.getJMSType(); + jmsMessageType = textMessage.getJMSType(); messageText = textMessage.getText(); } catch (JMSException e) { logger.error("Error handling Tamr JMS message: {}", e); return; } - logger.debug("Message type: {}", messageType); + logger.debug("Message type: {}", jmsMessageType); if (messageText.length() > 1000) logger.debug("Raw JSON data: {}...", messageText.substring(0, 1000)); else @@ -65,21 +68,26 @@ public void receive(javax.jms.Message msg) { if (response == null) { return; } - response.setMessageType(messageType); + try { + messageType = TamrMessageType.fromString(jmsMessageType); + response.setMessageType(messageType); + } catch (IllegalArgumentException e) { + // If the message type is invalid. + logger.warn("Ignoring unknown Tamr JMS message type.", e); + return; + } - if (messageType.equals("QUERY")) { + if (messageType == TamrMessageType.QUERY) { tamrMessageHandler.handleQueryResponse(response); - } else if (messageType.equals("DC.REPLACE") || messageType.equals("TH.UPDATE")) { + } else if (messageType == TamrMessageType.DC_REPLACE + || messageType == TamrMessageType.TH_UPDATE) { // These responses should be an acknowledgement. tamrMessageHandler.handleAcknowledgeResponse(response); - } else if (messageType.equals("TH.CLUSTERS") || messageType.equals("TH.DELTAS")) { + } else if (messageType == TamrMessageType.TH_CLUSTERS + || messageType == TamrMessageType.TH_DELTAS) { tamrMessageHandler.handleTamrIdUpdate(response); - } else if (messageType.equals("ERROR")) { + } else if (messageType == TamrMessageType.ERROR) { tamrMessageHandler.handleErrorResponse(response); - } else { - logger.warn("Unknown Tamr JMS message type \"{}\". Ignoring...", - messageType); - return; } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java index 5c36422475..9f6035f53e 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java @@ -17,6 +17,7 @@ import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Component; import gov.gtas.model.Flight; +import gov.gtas.parsers.tamr.model.TamrMessageType; import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.tamr.jms.TamrQueueConfig; import gov.gtas.parsers.tamr.TamrAdapterImpl; @@ -33,7 +34,7 @@ public class TamrMessageSender { @Autowired TamrQueueConfig queueConfig; - public void sendMessageToTamr(String messageType, Object messageObject) { + public void sendMessageToTamr(TamrMessageType messageType, Object messageObject) { String messageJson; try { ObjectMapper mapper = new ObjectMapper(); @@ -46,7 +47,8 @@ public void sendMessageToTamr(String messageType, Object messageObject) { this.sendTextMessageToTamr(messageType, messageJson); } - public void sendTextMessageToTamr(String messageType, String messageText) { + public void sendTextMessageToTamr( + TamrMessageType messageType, String messageText) { if (jmsTemplate == null) { this.jmsTemplate = new JmsTemplate( queueConfig.senderConnectionFactory()); @@ -57,7 +59,7 @@ public void sendTextMessageToTamr(String messageType, String messageText) { jmsTemplate.send("InboundQueue", new MessageCreator() { public Message createMessage(Session session) throws JMSException { Message message = session.createTextMessage(messageText); - message.setJMSType(messageType); + message.setJMSType(messageType.toString()); return message; } }); diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java index ffc7559a89..d6ef8ae4e5 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryCluster.java @@ -11,7 +11,7 @@ public class TamrHistoryCluster { private String gtasId; private String tamrId; private int version; - private String action; + private TamrHistoryClusterAction action; public TamrHistoryCluster() { } @@ -40,11 +40,11 @@ public void setGtasId(String gtasId) { this.gtasId = gtasId; } - public String getAction() { + public TamrHistoryClusterAction getAction() { return action; } - public void setAction(String action) { + public void setAction(TamrHistoryClusterAction action) { this.action = action; } } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryClusterAction.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryClusterAction.java new file mode 100644 index 0000000000..0b2827876f --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrHistoryClusterAction.java @@ -0,0 +1,5 @@ +package gov.gtas.parsers.tamr.model; + +public enum TamrHistoryClusterAction { + UPDATE, DELETE; +} diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java index 4e5b36782e..923d835bcd 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessage.java @@ -20,7 +20,7 @@ public class TamrMessage { * The JMS message type, which is set by TamrMessageReceiver. */ @JsonIgnore - private String messageType; + private TamrMessageType messageType; private List travelerQuery; @@ -34,11 +34,11 @@ public class TamrMessage { public TamrMessage() { } - public String getMessageType() { + public TamrMessageType getMessageType() { return messageType; } - public void setMessageType(String messageType) { + public void setMessageType(TamrMessageType messageType) { this.messageType = messageType; } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessageType.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessageType.java new file mode 100644 index 0000000000..a4fbc26486 --- /dev/null +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/model/TamrMessageType.java @@ -0,0 +1,37 @@ +package gov.gtas.parsers.tamr.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum TamrMessageType { + QUERY("QUERY"), + DC_REPLACE("DC.REPLACE"), + TH_UPDATE("TH.UPDATE"), + TH_CLUSTERS("TH.CLUSTERS"), + TH_DELTAS("TH.DELTAS"), + ERROR("ERROR"); + + private String stringValue; + + private TamrMessageType(String stringValue) { + this.stringValue = stringValue; + } + + @JsonValue + public String getStringValue() { + return stringValue; + } + + public String toString() { + return this.getStringValue(); + } + + public static TamrMessageType fromString(String stringValue) { + for (TamrMessageType messageType: values()) { + if (messageType.getStringValue().equals(stringValue)) { + return messageType; + } + } + throw new IllegalArgumentException( + "Unknown Tamr message type \"" + stringValue + "\"."); + } +} diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index 6729e8f3eb..e591bdcef1 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -17,6 +17,7 @@ import gov.gtas.parsers.ParserTestHelper; import gov.gtas.parsers.tamr.jms.TamrMessageReceiver; import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrMessageType; public class ReceiveTamrMessagesTest implements ParserTestHelper { private static final String HISTORY_QUERY_RESPONSE = "/tamr-messages/history_query_response.json"; @@ -193,6 +194,7 @@ public void testMessageTypeStored() throws JMSException { final ArgumentCaptor messageCaptor = ArgumentCaptor.forClass(TamrMessage.class); verify(handler).handleAcknowledgeResponse(messageCaptor.capture()); - assertEquals("DC.REPLACE", messageCaptor.getValue().getMessageType()); + assertEquals(TamrMessageType.DC_REPLACE, + messageCaptor.getValue().getMessageType()); } } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java index 8767a34eba..702c89e057 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java @@ -24,6 +24,7 @@ import gov.gtas.model.watchlist.WatchlistItem; import gov.gtas.parsers.tamr.TamrDerogReplaceScheduler; import gov.gtas.parsers.tamr.jms.TamrMessageSender; +import gov.gtas.parsers.tamr.model.TamrMessageType; import gov.gtas.repository.watchlist.WatchlistItemRepository; import gov.gtas.repository.watchlist.WatchlistRepository; @@ -68,13 +69,13 @@ public void setUp() { public void testSendWatchlist() throws InterruptedException { scheduler.jobScheduling(); - ArgumentCaptor messageTypeCaptor = - ArgumentCaptor.forClass(String.class); + ArgumentCaptor messageTypeCaptor = + ArgumentCaptor.forClass(TamrMessageType.class); ArgumentCaptor messageTextCaptor = ArgumentCaptor.forClass(String.class); verify(messageSender).sendTextMessageToTamr( messageTypeCaptor.capture(), messageTextCaptor.capture()); - assertEquals("DC.REPLACE", messageTypeCaptor.getValue()); + assertEquals(TamrMessageType.DC_REPLACE, messageTypeCaptor.getValue()); assertEquals(TamrAdapterImplTest.expectedDerogListJson, messageTextCaptor.getValue()); } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java index 16c0f26fe9..3123ac75d2 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java @@ -17,6 +17,7 @@ import gov.gtas.parsers.ParserTestHelper; import gov.gtas.parsers.tamr.model.TamrMessage; +import gov.gtas.parsers.tamr.model.TamrMessageType; import gov.gtas.parsers.tamr.model.TamrRecordError; /** @@ -49,22 +50,23 @@ public void testAcknowledgmentSuccess() { @Test public void testAcknowledgmentError() { TamrMessage acknowledgmentMessage = new TamrMessage(); - acknowledgmentMessage.setMessageType("TH.UPDATE"); + acknowledgmentMessage.setMessageType(TamrMessageType.TH_UPDATE); acknowledgmentMessage.setAcknowledgment(false); acknowledgmentMessage.setError("Here is an error."); this.handler.handleAcknowledgeResponse(acknowledgmentMessage); // Make sure message type and error is logged as ERROR. - this.assertTextLogged("ERROR", - acknowledgmentMessage.getMessageType()); + this.assertTextLogged("ERROR", "TH.UPDATE"); this.assertTextLogged("ERROR", acknowledgmentMessage.getError()); } @Test public void testRecordErrors() { - String[] messageTypes = {"QUERY", "DC.REPLACE", "TH.UPDATE"}; - for (String messageType: messageTypes) { + String[] messageTypeStrs = {"QUERY", "DC.REPLACE", "TH.UPDATE"}; + for (String messageTypeStr: messageTypeStrs) { + TamrMessageType messageType = TamrMessageType + .fromString(messageTypeStr); TamrMessage errorMessage = new TamrMessage(); errorMessage.setMessageType(messageType); List recordErrors = new ArrayList(); @@ -74,14 +76,14 @@ public void testRecordErrors() { recordErrors.add(recordError); errorMessage.setRecordErrors(recordErrors); - if (messageType.equals("QUERY")) { + if (messageType == TamrMessageType.QUERY) { handler.handleQueryResponse(errorMessage); } else { handler.handleAcknowledgeResponse(errorMessage); } // Make sure message type and all errors are logged as WARN. - this.assertTextLogged("WARN", messageType); + this.assertTextLogged("WARN", messageTypeStr); for (String error: recordError.getErrors()) { this.assertTextLogged("WARN", error); } @@ -94,7 +96,7 @@ public void testRecordErrors() { @Test public void testErrorMessages() { TamrMessage errorMessage = new TamrMessage(); - errorMessage.setMessageType("ERROR"); + errorMessage.setMessageType(TamrMessageType.ERROR); errorMessage.setAcknowledgment(false); errorMessage.setError("Error error"); @@ -104,10 +106,10 @@ public void testErrorMessages() { this.assertTextLogged("ERROR", errorMessage.getError()); } - private TamrMessage buildAcknowledgmentResponse(String messageType) { + private TamrMessage buildAcknowledgmentResponse(String messageTypeStr) { TamrMessage message = new TamrMessage(); message.setAcknowledgment(true); - message.setMessageType(messageType); + message.setMessageType(TamrMessageType.fromString(messageTypeStr)); return message; } @@ -125,8 +127,8 @@ private void assertTextLogged(String logLevel, String messagePart) { if (logLevel.toLowerCase().equals( invocation.getMethod().getName())) { for (Object argument: invocation.getArguments()) { - if (argument instanceof String) { - if (((String) argument).contains(messagePart)) { + if (argument != null) { + if (argument.toString().contains(messagePart)) { messagePartPresent = true; } } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java index 03c615f86c..43d1515e88 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java @@ -19,6 +19,7 @@ import gov.gtas.model.PassengerIDTag; import gov.gtas.parsers.ParserTestHelper; import gov.gtas.parsers.tamr.model.TamrHistoryCluster; +import gov.gtas.parsers.tamr.model.TamrHistoryClusterAction; import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.parsers.tamr.model.TamrTravelerResponse; import gov.gtas.repository.PassengerIDTagRepository; @@ -77,7 +78,7 @@ public void testDeltaMessageUpdate() { historyCluster.setGtasId(Long.toString(gtasId)); historyCluster.setTamrId(newTamrId); historyCluster.setVersion(1); - historyCluster.setAction("UPDATE"); + historyCluster.setAction(TamrHistoryClusterAction.UPDATE); TamrMessage message = new TamrMessage(); message.setHistoryClusters(Collections.singletonList(historyCluster)); @@ -94,7 +95,7 @@ public void testDeltaMessageDelete() { historyCluster.setGtasId(Long.toString(gtasId)); historyCluster.setTamrId(null); historyCluster.setVersion(1); - historyCluster.setAction("DELETE"); + historyCluster.setAction(TamrHistoryClusterAction.DELETE); TamrMessage message = new TamrMessage(); message.setHistoryClusters(Collections.singletonList(historyCluster)); From fb80b371fd4878a8f475e15431149cedaf91bb72 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 6 Mar 2020 17:09:55 -0500 Subject: [PATCH 48/83] Move Tamr derog list hit title/description to application.properties instead of hardcoding them --- .../main/resources/default.application.properties | 3 +++ .../parsers/tamr/TamrMessageHandlerServiceImpl.java | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index b926fbcd11..57e8817089 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -188,3 +188,6 @@ tamr.resolve_passenger_history=true # hour if they've changed. tamr.derogReplace.fixedDelay.in.milliseconds=3600000 tamr.derogReplace.initialDelay.in.milliseconds=1000 +# Title and description to be used on derog hits received from Tamr. +tamr.derog_hit.title=Tamr Fuzzy Watchlist Hit +tamr.derog_hit.description=This passenger closely matches a watchlist entry, according to Tamr's proprietary fuzzy matching technology. diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index c9277241d1..6c85544938 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -7,6 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; @@ -44,6 +45,12 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService @Autowired private PassengerRepository passengerRepository; + @Value("${tamr.derog_hit.title}") + String derogHitTitle; + + @Value("${tamr.derog_hit.description}") + String derogHitDescription; + /** * Handle responses to Tamr QUERY requests. This handles both the "derog * matches" and "traveler history" responses. @@ -79,10 +86,8 @@ private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { } PendingHitDetails pendingHit = new PendingHitDetails(); - pendingHit.setTitle("Tamr Fuzzy Watchlist Hit"); - pendingHit.setDescription("This passenger closely matches a watchlist " + - "entry, according to Tamr's proprietary fuzzy matching " + - "technology."); + pendingHit.setTitle(derogHitTitle); + pendingHit.setDescription(derogHitDescription); pendingHit.setHitEnum(HitTypeEnum.PARTIAL_WATCHLIST); pendingHit.setHitType(pendingHit.getHitEnum().toString()); From 0fb987c2fa3115bd60af64a6e583acd953e7076d Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 6 Mar 2020 17:17:29 -0500 Subject: [PATCH 49/83] Clarify log message to distinguish passenger and passenger ID tag --- .../gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 6c85544938..342f31ee98 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -200,7 +200,7 @@ private void updateTamrId(String gtasIdStr, String tamrId, int version) { passengerIDTagRepository.findByPaxId(gtasId); if (currentPassengerIdTag == null) { logger.warn("Unable to update tamrId of nonexistent passenger " + - "with ID {}.", gtasId); + "ID tag {}.", gtasId); } else { passengerIDTagRepository.updateTamrId(gtasId, tamrId); } From 58b8be7070b4ba0e9c5f13767b351577f378fd0b Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 9 Mar 2020 11:10:46 -0400 Subject: [PATCH 50/83] Fix issue in HandleTamrDerogHitsTest caused by pulling derog hit title/description from application.properties --- .../parsers/tamr/HandleTamrDerogHitsTest.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java index 98c74358eb..e92c5f9615 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -2,7 +2,6 @@ import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; -import static org.mockito.Mockito.*; import static org.mockito.AdditionalMatchers.*; import java.util.Collections; @@ -13,13 +12,11 @@ import org.mockito.ArgumentCaptor; import org.springframework.test.util.ReflectionTestUtils; - import gov.gtas.enumtype.HitTypeEnum; import gov.gtas.model.Flight; import gov.gtas.model.Passenger; import gov.gtas.model.PendingHitDetails; import gov.gtas.model.watchlist.WatchlistItem; -import gov.gtas.parsers.ParserTestHelper; import gov.gtas.parsers.tamr.model.TamrDerogHit; import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.parsers.tamr.model.TamrTravelerResponse; @@ -27,17 +24,24 @@ import gov.gtas.repository.PendingHitDetailRepository; import gov.gtas.repository.watchlist.WatchlistItemRepository; -public class HandleTamrDerogHitsTest implements ParserTestHelper { +public class HandleTamrDerogHitsTest { private TamrMessageHandlerService handler; private WatchlistItem watchlistItem; private WatchlistItemRepository watchlistItemRepository; private PendingHitDetailRepository pendingHitDetailRepository; private Passenger passenger; private PassengerRepository passengerRepository; + + private String derogHitTitle = "Derog Title"; + private String derogHitDescription = "Derog description."; @Before public void setUp() { this.handler = new TamrMessageHandlerServiceImpl(); + ReflectionTestUtils.setField(handler, "derogHitTitle", + derogHitTitle); + ReflectionTestUtils.setField(handler, "derogHitDescription", + derogHitDescription); this.watchlistItem = new WatchlistItem(); watchlistItem.setId(94L); @@ -87,10 +91,8 @@ public void testHandleDerogHit() { verify(pendingHitDetailRepository).save(pendingHitCaptor.capture()); PendingHitDetails pendingHit = pendingHitCaptor.getValue(); - // We should mention Tamr somewhere in the title and description for - // the derog hit so it's clear where it came from. - assertTrue(pendingHit.getTitle().contains("Tamr")); - assertTrue(pendingHit.getDescription().contains("Tamr")); + assertTrue(pendingHit.getTitle().equals(derogHitTitle)); + assertTrue(pendingHit.getDescription().equals(derogHitDescription)); assertEquals(pendingHit.getHitEnum().toString(), pendingHit.getHitType()); From 12727a1ad2b99a5c9c8050f682745d0fb2231fea Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 9 Mar 2020 11:11:42 -0400 Subject: [PATCH 51/83] Change GtasAdapterImpl.convertWatchlistItemToTamrDerogListEntry to return an Optional --- .../gtas/parsers/tamr/TamrAdapterImpl.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java index bafc158f36..2a046fa30a 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java @@ -15,6 +15,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -91,19 +92,19 @@ private TamrDocument convertDocumentToTamrDocument(Document document) { @Override public List convertWatchlist(Collection watchlistItems) { return watchlistItems.stream() - .map(watchlistItem -> - convertWatchlistItemToTamrDerogListEntry(watchlistItem)) - .filter(derogListEntry -> derogListEntry != null) + .map(this::convertWatchlistItemToTamrDerogListEntry) + .filter(Optional::isPresent) + .map(Optional::get) .collect(Collectors.toList()); } /** * Convert a GTAS watchlist item to a derog entry that can be sent to - * Tamr. This may return null for some watchlist items that should not - * be sent to Tamr. + * Tamr. This may return an empty optional for some watchlist items that + * should not be sent to Tamr. */ - private TamrDerogListEntry convertWatchlistItemToTamrDerogListEntry( - WatchlistItem watchlistItem) { + private Optional convertWatchlistItemToTamrDerogListEntry( + WatchlistItem watchlistItem) { TamrDerogListEntry derogListEntry = new TamrDerogListEntry(); WatchlistItemSpec itemSpec; @@ -113,7 +114,7 @@ private TamrDerogListEntry convertWatchlistItemToTamrDerogListEntry( } catch (IOException e) { logger.warn("Error parsing watchlist item data {}. Ignoring...", watchlistItem.getItemData()); - return null; + return Optional.empty(); } for (WatchlistTerm term: itemSpec.getTerms()) { @@ -154,7 +155,7 @@ private TamrDerogListEntry convertWatchlistItemToTamrDerogListEntry( if (derogListEntry.getLastName() == null) { // We only add to the derog list entries where the last name // at least is populated. - return null; + return Optional.empty(); } // We set both gtasId and derogId to the watchlist item ID from @@ -164,7 +165,6 @@ private TamrDerogListEntry convertWatchlistItemToTamrDerogListEntry( derogListEntry.setGtasId(itemIdStr); derogListEntry.setDerogId(itemIdStr); - return derogListEntry; - + return Optional.of(derogListEntry); } } From 43b146d4d0c3a568ace9322dfe8a527c6c9ea7c8 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 9 Mar 2020 11:17:55 -0400 Subject: [PATCH 52/83] Change try...catch statements in TamrMessageHandlerServiceImpl to if statements --- .../tamr/TamrMessageHandlerServiceImpl.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 342f31ee98..0205dadc74 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -103,30 +103,32 @@ private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { } Optional watchlistItem = watchlistItemRepository.findById(watchlistItemId); - try { + if (watchlistItem.isPresent()) { pendingHit.setHitMakerId(watchlistItem.get().getId()); - pendingHit.setPercentage(derogHit.getScore()); - - // Tamr doesn't return any details about the matching algorithm, - // so leave this empty. - pendingHit.setRuleConditions(""); - } catch (NoSuchElementException e) { + } else { logger.warn("Tamr returned derog hit for nonexistent watchlist " + "entry with ID {}.", watchlistItemId); return; } + pendingHit.setPercentage(derogHit.getScore()); + + // Tamr doesn't return any details about the matching algorithm, + // so leave this empty. + pendingHit.setRuleConditions(""); + // Try to find passenger in GTAS so we can get the associated flight. Optional passenger = passengerRepository.findById(gtasId); - try { + if (passenger.isPresent()) { pendingHit.setFlightId(passenger.get().getFlight().getId()); - pendingHit.setPassengerId(gtasId); - } catch (NoSuchElementException e) { + } else { logger.warn("Tamr returned derog hit for nonexistent passenger " + "with ID {}.", gtasId); return; } + pendingHit.setPassengerId(gtasId); + pendingHit.setCreatedDate(new Date()); // Persist to database. From de361b3cab9b84f6cfdc659c76d29f77162cdee0 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 16 Mar 2020 11:03:45 -0400 Subject: [PATCH 53/83] Changed @Autowired dependencies to instead be injected through constructors --- .../scheduler/TamrIntegrationTestUtils.java | 22 ++++++++++++----- .../java/gov/gtas/job/scheduler/TamrMock.java | 5 +++- .../gov/gtas/services/ApisMessageService.java | 4 +++- .../gov/gtas/services/PnrMessageService.java | 6 +++-- .../gtas/parsers/tamr/TamrAdapterImpl.java | 9 ++++--- .../tamr/TamrDerogReplaceScheduler.java | 17 +++++++++---- .../tamr/TamrMessageHandlerServiceImpl.java | 15 ++++++++---- .../parsers/tamr/jms/TamrMessageReceiver.java | 8 +++---- .../parsers/tamr/jms/TamrMessageSender.java | 14 ++++------- .../parsers/tamr/HandleTamrDerogHitsTest.java | 24 +++++++++---------- .../parsers/tamr/ReceiveTamrMessagesTest.java | 3 +-- .../parsers/tamr/TamrAdapterImplTest.java | 2 +- .../tamr/TamrDerogReplaceSchedulerTest.java | 14 +++++------ .../tamr/TamrStatusErrorMessagesTest.java | 4 ++-- .../gtas/parsers/tamr/UpdateTamrIdTest.java | 9 ++++--- 15 files changed, 90 insertions(+), 66 deletions(-) diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java index 5f337c72f8..5fa24a2b06 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java @@ -6,6 +6,7 @@ package gov.gtas.job.scheduler; import java.io.File; +import java.util.Optional; import javax.jms.JMSException; import javax.jms.Message; @@ -48,24 +49,33 @@ public class TamrIntegrationTestUtils { private ClassLoader classLoader = getClass().getClassLoader(); - @Autowired private JmsListenerEndpointRegistry jmsListenerRegistry; - @Autowired(required=false) - private TamrMessageReceiver tamrMessageReceiver; + private Optional tamrMessageReceiver; @PersistenceContext private EntityManager entityManager; - @Autowired private LoaderScheduler loaderScheduler; - @Autowired private WatchlistService watchlistService; @Value("${tamr.activemq.broker.url}") private String activeMQBrokerUrl; + public TamrIntegrationTestUtils( + JmsListenerEndpointRegistry jmsListenerRegistry, + Optional tamrMessageReceiver, + EntityManager entityManager, + LoaderScheduler loaderScheduler, + WatchlistService watchlistService) { + this.jmsListenerRegistry = jmsListenerRegistry; + this.tamrMessageReceiver = tamrMessageReceiver; + this.entityManager = entityManager; + this.loaderScheduler = loaderScheduler; + this.watchlistService = watchlistService; + } + private void configureJmsTemplate() { if (jmsTemplate == null) { ActiveMQConnectionFactory aMQConnection = @@ -124,7 +134,7 @@ public int synchronouslyProcessMessagesFromTamr() { int messagesProcessed = 0; Message message; while ((message = jmsTemplate.receive("OutboundQueue")) != null) { - tamrMessageReceiver.receive(message); + tamrMessageReceiver.get().receive(message); messagesProcessed += 1; } return messagesProcessed; diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java index 62a2adbe68..4edee5a8d7 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrMock.java @@ -56,9 +56,12 @@ public class TamrMock { private Map tamrIdToDerogId = new HashMap<>(); - @Autowired private TamrIntegrationTestUtils tamrUtils; + public TamrMock(TamrIntegrationTestUtils tamrUtils) { + this.tamrUtils = tamrUtils; + } + private String getTamrIdFromName(String name) { String tamrId = nameToTamrId.get(name); if (tamrId == null) { diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java index 2d8795fe42..ddcd4be527 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ApisMessageService.java @@ -49,6 +49,9 @@ public class ApisMessageService extends MessageLoaderService { @Autowired private BookingBagRepository bookingBagRepository; + + @Autowired + private TamrAdapter tamrAdapter; @Value("${tamr.enabled}") private Boolean tamrEnabled; @@ -133,7 +136,6 @@ public MessageInformation load(MessageDto msgDto) { msgDto.getMessageStatus().setFlight(primeFlight); apis.setPassengerCount(apis.getPassengers().size()); if (tamrEnabled) { - TamrAdapter tamrAdapter = new TamrAdapterImpl(); List tamrPassengers = tamrAdapter .convertPassengers(apis.getFlights().iterator().next(), apis.getPassengers()); messageInformation.setTamrPassengers(tamrPassengers); diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java index 5eda3ba65d..dcbdd4d832 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/PnrMessageService.java @@ -50,6 +50,8 @@ public class PnrMessageService extends MessageLoaderService { private final FlightPaxRepository flightPaxRepository; private final BookingBagRepository bookingBagRepository; + + private final TamrAdapter tamrAdapter; @Value("${tamr.enabled}") private Boolean tamrEnabled; @@ -57,13 +59,14 @@ public class PnrMessageService extends MessageLoaderService { @Autowired public PnrMessageService(PnrRepository msgDao, LoaderUtils utils, LookUpRepository lookupRepo, FlightPaxRepository flightPaxRepository, BagRepository bagRepository, - BookingBagRepository bookingBagRepository) { + BookingBagRepository bookingBagRepository, TamrAdapter tamrAdapter) { this.msgDao = msgDao; this.utils = utils; this.lookupRepo = lookupRepo; this.flightPaxRepository = flightPaxRepository; this.bagDao = bagRepository; this.bookingBagRepository = bookingBagRepository; + this.tamrAdapter = tamrAdapter; } @Override @@ -152,7 +155,6 @@ public MessageInformation load(MessageDto msgDto) { TripTypeEnum tripType = calculateTripType(pnr.getFlightLegs(), pnr.getDwellTimes()); pnr.setTripType(tripType.toString()); if (tamrEnabled) { - TamrAdapter tamrAdapter = new TamrAdapterImpl(); List tamrPassengers = tamrAdapter .convertPassengers(pnr.getFlights().iterator().next(), pnr.getPassengers()); messageInformation.setTamrPassengers(tamrPassengers); diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java index 2a046fa30a..8c815f4972 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrAdapterImpl.java @@ -13,7 +13,6 @@ import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Optional; import java.util.Set; @@ -21,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; @@ -37,15 +36,19 @@ import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.services.FlightService; +@Component public class TamrAdapterImpl implements TamrAdapter { - @Autowired FlightService flightService; private ObjectMapper mapper = new ObjectMapper(); private Logger logger = LoggerFactory.getLogger(TamrAdapterImpl.class); + public TamrAdapterImpl(FlightService flightService) { + this.flightService = flightService; + } + @Override public List convertPassengers( Flight flight, Set passengers) { diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java index 76b0c31828..e8dd9195ea 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java @@ -27,6 +27,7 @@ import gov.gtas.parsers.tamr.model.TamrMessageType; import gov.gtas.repository.watchlist.WatchlistItemRepository; import gov.gtas.repository.watchlist.WatchlistRepository; +import gov.gtas.services.FlightService; /** * Scheduler class for sending the derog list (watchlist) to Tamr when changed. @@ -42,19 +43,27 @@ public class TamrDerogReplaceScheduler { private static final Logger logger = LoggerFactory.getLogger(TamrDerogReplaceScheduler.class); - @Autowired WatchlistRepository watchlistRepository; - @Autowired WatchlistItemRepository watchlistItemRepository; - TamrAdapter tamrAdapter = new TamrAdapterImpl(); + TamrAdapter tamrAdapter; - @Autowired TamrMessageSender tamrMessageSender; private Date lastRun = null; + public TamrDerogReplaceScheduler( + WatchlistRepository watchlistRepository, + WatchlistItemRepository watchlistItemRepository, + TamrMessageSender tamrMessageSender, + TamrAdapter tamrAdapter) { + this.watchlistRepository = watchlistRepository; + this.watchlistItemRepository = watchlistItemRepository; + this.tamrMessageSender = tamrMessageSender; + this.tamrAdapter = tamrAdapter; + } + /** * Replace the watchlist in Tamr if the GTAS one has changed. **/ diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 0205dadc74..52e7359808 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -33,16 +33,12 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService private final Logger logger = LoggerFactory.getLogger(TamrMessageHandlerServiceImpl.class); - @Autowired private PassengerIDTagRepository passengerIDTagRepository; - @Autowired private WatchlistItemRepository watchlistItemRepository; - @Autowired private PendingHitDetailRepository pendingHitDetailRepository; - @Autowired private PassengerRepository passengerRepository; @Value("${tamr.derog_hit.title}") @@ -51,6 +47,17 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService @Value("${tamr.derog_hit.description}") String derogHitDescription; + public TamrMessageHandlerServiceImpl( + PassengerIDTagRepository passengerIDTagRepository, + WatchlistItemRepository watchlistItemRepository, + PendingHitDetailRepository pendingHitDetailRepository, + PassengerRepository passengerRepository) { + this.passengerIDTagRepository = passengerIDTagRepository; + this.watchlistItemRepository = watchlistItemRepository; + this.pendingHitDetailRepository = pendingHitDetailRepository; + this.passengerRepository = passengerRepository; + } + /** * Handle responses to Tamr QUERY requests. This handles both the "derog * matches" and "traveler history" responses. diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java index e45306ed11..963c31be6c 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageReceiver.java @@ -5,7 +5,6 @@ */ package gov.gtas.parsers.tamr.jms; -import java.awt.TrayIcon.MessageType; import java.io.IOException; import javax.jms.JMSException; @@ -13,7 +12,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @@ -25,7 +23,6 @@ import gov.gtas.parsers.tamr.TamrMessageHandlerService; import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.parsers.tamr.model.TamrMessageType; -import gov.gtas.repository.PassengerIDTagRepository; @Component @ConditionalOnProperty(prefix = "tamr", name = "enabled") @@ -33,9 +30,12 @@ public class TamrMessageReceiver { private final Logger logger = LoggerFactory.getLogger(TamrMessageReceiver.class); - @Autowired private TamrMessageHandlerService tamrMessageHandler; + public TamrMessageReceiver(TamrMessageHandlerService tamrMessageHandler) { + this.tamrMessageHandler = tamrMessageHandler; + } + @JmsListener(containerFactory = "tamrJmsListenerContainerFactory", destination = "OutboundQueue") public void receive(javax.jms.Message msg) { diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java index 9f6035f53e..fa866fceec 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/jms/TamrMessageSender.java @@ -2,26 +2,17 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; -import java.util.List; -import org.springframework.stereotype.Service; -import org.apache.activemq.ActiveMQConnectionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Component; -import gov.gtas.model.Flight; import gov.gtas.parsers.tamr.model.TamrMessageType; -import gov.gtas.parsers.tamr.model.TamrPassenger; import gov.gtas.parsers.tamr.jms.TamrQueueConfig; -import gov.gtas.parsers.tamr.TamrAdapterImpl; -import gov.gtas.parsers.tamr.model.TamrQuery; @Component @ConditionalOnProperty(prefix = "tamr", name = "enabled") @@ -31,9 +22,12 @@ public class TamrMessageSender { JmsTemplate jmsTemplate; - @Autowired TamrQueueConfig queueConfig; + public TamrMessageSender(TamrQueueConfig queueConfig) { + this.queueConfig = queueConfig; + } + public void sendMessageToTamr(TamrMessageType messageType, Object messageObject) { String messageJson; try { diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java index e92c5f9615..4444fa290f 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -37,18 +37,10 @@ public class HandleTamrDerogHitsTest { @Before public void setUp() { - this.handler = new TamrMessageHandlerServiceImpl(); - ReflectionTestUtils.setField(handler, "derogHitTitle", - derogHitTitle); - ReflectionTestUtils.setField(handler, "derogHitDescription", - derogHitDescription); - this.watchlistItem = new WatchlistItem(); watchlistItem.setId(94L); watchlistItemRepository = mock(WatchlistItemRepository.class); - ReflectionTestUtils.setField(handler, "watchlistItemRepository", - watchlistItemRepository); // Set up WatchlistItemRepository to return a fake watchlist item. given(watchlistItemRepository.findById(watchlistItem.getId())) .willReturn(Optional.of(watchlistItem)); @@ -57,13 +49,8 @@ public void setUp() { .willReturn(Optional.empty()); pendingHitDetailRepository = mock(PendingHitDetailRepository.class); - ReflectionTestUtils.setField(handler, "pendingHitDetailRepository", - pendingHitDetailRepository); - passengerRepository = mock(PassengerRepository.class); - ReflectionTestUtils.setField(handler, "passengerRepository", - passengerRepository); // Set up the PassengerRepository to return a dummy instance when // queried. @@ -77,6 +64,17 @@ public void setUp() { // Otherwise return null. given(passengerRepository.findById(not(eq(passenger.getId())))) .willReturn(Optional.empty()); + + this.handler = new TamrMessageHandlerServiceImpl( + null, + watchlistItemRepository, + pendingHitDetailRepository, + passengerRepository); + ReflectionTestUtils.setField(handler, "derogHitTitle", + derogHitTitle); + ReflectionTestUtils.setField(handler, "derogHitDescription", + derogHitDescription); + } @Test diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java index e591bdcef1..e2cfb417be 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/ReceiveTamrMessagesTest.java @@ -34,9 +34,8 @@ public class ReceiveTamrMessagesTest implements ParserTestHelper { @Before public void setUp() { - this.receiver = new TamrMessageReceiver(); this.handler = mock(TamrMessageHandlerService.class); - ReflectionTestUtils.setField(receiver, "tamrMessageHandler", handler); + this.receiver = new TamrMessageReceiver(handler); } @Test diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java index 257f4e213e..480d8c20cf 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrAdapterImplTest.java @@ -37,7 +37,7 @@ import gov.gtas.parsers.tamr.model.TamrQuery; public class TamrAdapterImplTest { - private TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(); + private TamrAdapterImpl tamrAdapter = new TamrAdapterImpl(null); @Test public void testPassengerConversion() throws JsonProcessingException { diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java index 702c89e057..f2727da8a6 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java @@ -37,28 +37,26 @@ public class TamrDerogReplaceSchedulerTest { @Before public void setUp() { - scheduler = new TamrDerogReplaceScheduler(); - watchlist = new Watchlist(); watchlist.setId(1L); watchlist.setEditTimestamp(new Date()); watchlistRepository = mock(WatchlistRepository.class); - ReflectionTestUtils.setField(scheduler, "watchlistRepository", - watchlistRepository); given(watchlistRepository.findAll()) .willReturn(Collections.singletonList(watchlist)); List watchlistItems = TamrAdapterImplTest.getWatchlistItems(); watchlistItemRepository = mock(WatchlistItemRepository.class); - ReflectionTestUtils.setField(scheduler, "watchlistItemRepository", - watchlistItemRepository); given(watchlistItemRepository.findAll()).willReturn(watchlistItems); messageSender = mock(TamrMessageSender.class); - ReflectionTestUtils.setField(scheduler, "tamrMessageSender", - messageSender); doCallRealMethod().when(messageSender).sendMessageToTamr(any(), any()); + + scheduler = new TamrDerogReplaceScheduler( + watchlistRepository, + watchlistItemRepository, + messageSender, + new TamrAdapterImpl(null)); } /** diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java index 3123ac75d2..6c0b03c5ee 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java @@ -10,7 +10,6 @@ import org.junit.Before; import org.junit.Test; -import org.mockito.ArgumentCaptor; import org.mockito.invocation.Invocation; import org.slf4j.Logger; import org.springframework.test.util.ReflectionTestUtils; @@ -30,7 +29,8 @@ public class TamrStatusErrorMessagesTest implements ParserTestHelper { @Before public void setUp() { - this.handler = new TamrMessageHandlerServiceImpl(); + this.handler = new TamrMessageHandlerServiceImpl( + null, null, null, null); this.logger = mock(Logger.class); ReflectionTestUtils.setField(handler, "logger", logger); } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java index 43d1515e88..7e4f4dde44 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java @@ -10,11 +10,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; import org.junit.Before; import org.junit.Test; -import org.springframework.test.util.ReflectionTestUtils; import gov.gtas.model.PassengerIDTag; import gov.gtas.parsers.ParserTestHelper; @@ -39,10 +37,7 @@ public class UpdateTamrIdTest implements ParserTestHelper { @Before public void setUp() { - this.handler = new TamrMessageHandlerServiceImpl(); this.passengerIDTagRepository = mock(PassengerIDTagRepository.class); - ReflectionTestUtils.setField(handler, - "passengerIDTagRepository", passengerIDTagRepository); // Set up the PassengerIDTagRepository to return a dummy instance when // queried. @@ -52,6 +47,10 @@ public void setUp() { passengerIdTag); given(passengerIDTagRepository.findByPaxId(not(eq(gtasId)))) .willReturn(null); + + this.handler = new TamrMessageHandlerServiceImpl( + passengerIDTagRepository, + null, null, null); } @Test From 6fdf27ff7a9802ac5490e9b1bd0fdd5303f688be Mon Sep 17 00:00:00 2001 From: aaroncsolomon Date: Wed, 18 Mar 2020 14:54:15 -0400 Subject: [PATCH 54/83] Removed try/catch in LoaderScheduler --- .../java/gov/gtas/job/scheduler/LoaderScheduler.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index 53ecda3f11..28861cef57 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -148,13 +148,8 @@ public boolean saveProcessedFile(File file) { return saved; String destinationDir = messageProcessedDir; - - try { - Utils.moveToDirectory(destinationDir, file); - } catch (Exception ex) { - logger.error("Unable to move file '" + file.getName() + "' to directory: " + destinationDir, ex); - } - + Utils.moveToDirectory(destinationDir, file); + return saved; } From 714d545eb47913abc3ec49a329b6c4aeb1cdd3f3 Mon Sep 17 00:00:00 2001 From: aaroncsolomon Date: Thu, 19 Mar 2020 12:30:55 -0400 Subject: [PATCH 55/83] reverting try/catch edit and removing the save-file try/catch --- .../gov/gtas/job/scheduler/LoaderScheduler.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index 28861cef57..8a3154f240 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -131,12 +131,9 @@ public void receiveMessage(String text, String fileName, String[] primeFlightKey logger.debug("MESSAGE RECEIVED FROM QUEUE: " + messageWorkingDir + File.separator + fileName); File f = new File(messageWorkingDir + File.separator + fileName); - try { - processSingleFile(f, stats, primeFlightKey); - saveProcessedFile(f); - } catch (Exception ex) { - logger.error("Unable to process file!"); - } + processSingleFile(f, stats, primeFlightKey); + saveProcessedFile(f); + } // Moves the file from the working dir to the processed, returns true on @@ -148,7 +145,11 @@ public boolean saveProcessedFile(File file) { return saved; String destinationDir = messageProcessedDir; - Utils.moveToDirectory(destinationDir, file); + try { + Utils.moveToDirectory(destinationDir, file); + } catch (Exception ex) { + logger.error("Unable to move file '" + file.getName() + "' to directory: " + destinationDir, ex); + } return saved; } From 8c3d498ecc434ea7378bfee98ed48e024bd3b51a Mon Sep 17 00:00:00 2001 From: Robert Stine Date: Fri, 20 Mar 2020 13:43:28 -0400 Subject: [PATCH 56/83] Fix for deleting watchlist items. --- .../gtas/repository/watchlist/WatchlistItemRepository.java | 7 +------ .../watchlist/WatchlistPersistenceServiceImpl.java | 3 ++- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java index 0a37b34cd6..8ae7c8a9d4 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java @@ -27,12 +27,7 @@ public interface WatchlistItemRepository @Query("DELETE FROM WatchlistItem wli WHERE wli.watchlist.watchlistName = :watchlistName") public void deleteItemsByWatchlistName(@Param("watchlistName") String watchlistName); - - @Transactional - @Modifying - @Query("DELETE FROM WatchlistItem wli WHERE wli.id IN :watchlistItemIds") - public void deleteItemsByWatchlistItemId(@Param("watchlistItemIds")List watchlistItemIds); - + default WatchlistItem findOne(Long id) { return findById(id).orElse(null); } diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/watchlist/WatchlistPersistenceServiceImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/watchlist/WatchlistPersistenceServiceImpl.java index 9b54c8edcb..a58f18cbe5 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/watchlist/WatchlistPersistenceServiceImpl.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/watchlist/WatchlistPersistenceServiceImpl.java @@ -284,7 +284,8 @@ public List findItemsByWatchlistName(String watchlistName) { @Override public void deleteWatchlistItems(List watchlistItemIds) { - this.watchlistItemRepository.deleteItemsByWatchlistItemId(watchlistItemIds); + Iterable watchlistItemList = watchlistItemRepository.findAllById(watchlistItemIds); + this.watchlistItemRepository.deleteAll(watchlistItemList); } } From c6425c30f41bcf8bff6cb9fd9dd8348060cce9aa Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 20 Mar 2020 15:23:39 -0400 Subject: [PATCH 57/83] Fix NullPointerException when receiving Tamr message without an "acknowledgment" key --- .../parsers/tamr/TamrMessageHandlerServiceImpl.java | 10 +++++----- .../parsers/tamr/TamrStatusErrorMessagesTest.java | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 52e7359808..863c837c23 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -150,15 +150,15 @@ private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { public void handleAcknowledgeResponse(TamrMessage response) { if (this.checkRecordErrors(response)) { // Record errors are already logged. - } else if (response.getAcknowledgment() == true) { + } else if (response.getAcknowledgment() == null) { + logger.warn("{} message received from Tamr with no " + + "\"acknowledgment\" key. Ignoring..."); + } else if (response.getAcknowledgment()) { logger.info("{} request to Tamr acknowledged", response.getMessageType()); - } else if (response.getAcknowledgment() == false) { + } else { logger.error("Error with {} request to Tamr: {}", response.getMessageType(), response.getError()); - } else { - logger.warn("{} message received from Tamr with no " + - "\"acknowledgment\" key. Ignoring..."); } } diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java index 6c0b03c5ee..c403eb6a19 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrStatusErrorMessagesTest.java @@ -61,6 +61,17 @@ public void testAcknowledgmentError() { acknowledgmentMessage.getError()); } + @Test + public void testEmptyAcknowledgement() { + TamrMessage acknowledgmentMessage = new TamrMessage(); + acknowledgmentMessage.setMessageType(TamrMessageType.TH_UPDATE); + this.handler.handleAcknowledgeResponse(acknowledgmentMessage); + + // Make sure warning is printed about missing acknowledgment key. + this.assertTextLogged("WARN", "acknowledgment"); + this.assertTextLogged("WARN", "key"); + } + @Test public void testRecordErrors() { String[] messageTypeStrs = {"QUERY", "DC.REPLACE", "TH.UPDATE"}; From d4776185122f4b7cc94ff50efbb0c424c7b22590 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 20 Mar 2020 16:31:35 -0400 Subject: [PATCH 58/83] Change TamrDerogReplaceScheduler to only send passenger watchlist to Tamr --- .../java/gov/gtas/job/scheduler/TamrIT.java | 1 - .../scheduler/TamrIntegrationTestUtils.java | 2 +- .../tamr/TamrDerogReplaceScheduler.java | 22 ++++++++++--------- .../tamr/TamrDerogReplaceSchedulerTest.java | 18 +++++++++------ 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java index ec37fc1b9c..7613ecbd7f 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIT.java @@ -41,7 +41,6 @@ import gov.gtas.repository.PendingHitDetailRepository; import gov.gtas.repository.watchlist.WatchlistItemRepository; import gov.gtas.services.PassengerService; -import gov.gtas.svc.WatchlistService; /** * End-to-end integration tests with Tamr. diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java index 5fa24a2b06..fc1c495795 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java +++ b/gtas-parent/gtas-job-scheduler-war/src/test/java/gov/gtas/job/scheduler/TamrIntegrationTestUtils.java @@ -153,7 +153,7 @@ private WatchlistItemSpec createWatchlistItemSpec( * Create some sample watchlist items. */ public void createWatchlistItems() { - WatchlistSpec spec = new WatchlistSpec("Watchlist", + WatchlistSpec spec = new WatchlistSpec("Passenger", EntityEnum.PASSENGER.getEntityName()); spec.addWatchlistItem(createWatchlistItemSpec( "RUBEN", "THEBAULT", "1945-01-11")); diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java index e8dd9195ea..a63cab7dd7 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java @@ -20,6 +20,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import gov.gtas.model.watchlist.Watchlist; import gov.gtas.model.watchlist.WatchlistItem; import gov.gtas.parsers.tamr.jms.TamrMessageSender; import gov.gtas.parsers.tamr.model.TamrDerogListEntry; @@ -42,6 +43,8 @@ public class TamrDerogReplaceScheduler { private static final Logger logger = LoggerFactory.getLogger(TamrDerogReplaceScheduler.class); + + private final String PASSENGER_WATCHLIST_NAME = "Passenger"; WatchlistRepository watchlistRepository; @@ -72,22 +75,21 @@ public TamrDerogReplaceScheduler( public void jobScheduling() throws InterruptedException { logger.info("Checking for watchlist edits to send to Tamr..."); - // Get the latest time that a watchlist was edited. - Optional latestWatchlistEdit = StreamSupport.stream( - watchlistRepository.findAll().spliterator(), false) - .map((watchlist) -> watchlist.getEditTimestamp()) - .collect(Collectors.maxBy(Comparator.naturalOrder())); + Watchlist passengerWatchlist = + watchlistRepository.getWatchlistByName(PASSENGER_WATCHLIST_NAME); + if (passengerWatchlist == null) return; - // Return if there are no watchlists to send. - if (!latestWatchlistEdit.isPresent()) return; + // Check the latest time the watchlist was edited. + Date latestWatchlistEdit = passengerWatchlist.getEditTimestamp(); // If there has been an edit to a watchlist since the last time this // job was run... - if (lastRun == null || lastRun.before(latestWatchlistEdit.get())) { + if (lastRun == null || lastRun.before(latestWatchlistEdit)) { logger.info("Sending latest watchlist to Tamr."); - List watchlistItems = new ArrayList<>(); - watchlistItemRepository.findAll().forEach(watchlistItems::add); + List watchlistItems = + watchlistItemRepository.getItemsByWatchlistName( + PASSENGER_WATCHLIST_NAME); List derogListEntries = tamrAdapter.convertWatchlist(watchlistItems); TamrDerogListUpdate derogReplace = diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java index f2727da8a6..ac2f8d32e4 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java @@ -18,8 +18,8 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.springframework.test.util.ReflectionTestUtils; +import gov.gtas.enumtype.EntityEnum; import gov.gtas.model.watchlist.Watchlist; import gov.gtas.model.watchlist.WatchlistItem; import gov.gtas.parsers.tamr.TamrDerogReplaceScheduler; @@ -32,22 +32,26 @@ public class TamrDerogReplaceSchedulerTest { private TamrDerogReplaceScheduler scheduler; private TamrMessageSender messageSender; private WatchlistItemRepository watchlistItemRepository; - private Watchlist watchlist; + private Watchlist passengerWatchlist; private WatchlistRepository watchlistRepository; @Before public void setUp() { - watchlist = new Watchlist(); - watchlist.setId(1L); - watchlist.setEditTimestamp(new Date()); + passengerWatchlist = new Watchlist("Passenger", EntityEnum.PASSENGER); + passengerWatchlist.setId(1L); + passengerWatchlist.setEditTimestamp(new Date()); watchlistRepository = mock(WatchlistRepository.class); given(watchlistRepository.findAll()) - .willReturn(Collections.singletonList(watchlist)); + .willReturn(Collections.singletonList(passengerWatchlist)); + given(watchlistRepository.getWatchlistByName("Passenger")) + .willReturn(passengerWatchlist); List watchlistItems = TamrAdapterImplTest.getWatchlistItems(); watchlistItemRepository = mock(WatchlistItemRepository.class); given(watchlistItemRepository.findAll()).willReturn(watchlistItems); + given(watchlistItemRepository.getItemsByWatchlistName("Passenger")) + .willReturn(watchlistItems); messageSender = mock(TamrMessageSender.class); doCallRealMethod().when(messageSender).sendMessageToTamr(any(), any()); @@ -94,7 +98,7 @@ public void testNoSendIfNotEdited() throws InterruptedException { any(), any()); // Now update edited time... - watchlist.setEditTimestamp(new Date()); + passengerWatchlist.setEditTimestamp(new Date()); // ...and another message should be sent. scheduler.jobScheduling(); scheduler.jobScheduling(); From 9cbcf5f34133908fad19ec2ef226d3af3f6f95c2 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 20 Mar 2020 18:20:58 -0400 Subject: [PATCH 59/83] Fix compilation errors from Exceptions that propagate up in LoaderScheduler (see 714d545eb47913abc3ec49a329b6c4aeb1cdd3f3) --- .../src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java | 2 +- .../main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java index 8a3154f240..2633a0aeb5 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderScheduler.java @@ -126,7 +126,7 @@ void processSingleFile(File f, LoaderStatistics stats, String[] primeFlightKey) } // Method to be processed in thread generated by JMS listener - public void receiveMessage(String text, String fileName, String[] primeFlightKey) { + public void receiveMessage(String text, String fileName, String[] primeFlightKey) throws Exception { LoaderStatistics stats = new LoaderStatistics(); logger.debug("MESSAGE RECEIVED FROM QUEUE: " + messageWorkingDir + File.separator + fileName); diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java index 63c9356ff5..c51b279011 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java @@ -86,7 +86,7 @@ public void run() { } } - private void processCommand() { + private void processCommand() throws Exception { loader.receiveMessage(text, fileName, primeFlightKeyArray); } From ec2e16c95a604f01304e2fd8fb73f99638623cf9 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 20 Mar 2020 18:24:22 -0400 Subject: [PATCH 60/83] Change Tamr ID update and derog hit handling in TamrMessageHandlerServiceImpl to use fewer database queries --- .../tamr/TamrMessageHandlerServiceImpl.java | 97 +++++++++++++------ .../parsers/tamr/HandleTamrDerogHitsTest.java | 9 +- .../gtas/parsers/tamr/UpdateTamrIdTest.java | 64 +++++++++--- 3 files changed, 118 insertions(+), 52 deletions(-) diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 863c837c23..0c83dc56cb 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -1,12 +1,14 @@ package gov.gtas.parsers.tamr; +import java.util.ArrayList; import java.util.Date; -import java.util.NoSuchElementException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -66,30 +68,41 @@ public TamrMessageHandlerServiceImpl( public void handleQueryResponse(TamrMessage response) { if (this.checkRecordErrors(response)) return; + Map gtasIdToTamrId = new HashMap(); for (TamrTravelerResponse travelerResponse: response.getTravelerQuery()) { if (travelerResponse.getTamrId() != null) { - this.updateTamrId(travelerResponse.getGtasId(), - travelerResponse.getTamrId(), - travelerResponse.getVersion()); + this.addTamrIdUpdate(gtasIdToTamrId, travelerResponse.getGtasId(), + travelerResponse.getTamrId()); } + } + this.updateTamrIds(gtasIdToTamrId); + + List pendingHits = new ArrayList<>(); + for (TamrTravelerResponse travelerResponse: response.getTravelerQuery()) { for (TamrDerogHit derogHit: travelerResponse.getDerogIds()) { - this.createPendingHit(travelerResponse.getGtasId(), derogHit); + PendingHitDetails pendingHit = this.createPendingHit( + travelerResponse.getGtasId(), derogHit); + if (pendingHit != null) pendingHits.add(pendingHit); } } + if (!pendingHits.isEmpty()) { + pendingHitDetailRepository.saveAll(pendingHits); + } } /** * Creates an instance of the PendingHitDetails model in GTAS based on a - * derog hit from Tamr. + * derog hit from Tamr. Returns the instance (does not save it) or null + * if the derog hit is invalid. */ - private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { + private PendingHitDetails createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { long gtasId; try { gtasId = Long.parseLong(gtasIdStr); } catch (NumberFormatException e) { logger.warn("Tamr returned derog hit for passenger with invalid " + "ID \"{}\".", gtasIdStr); - return; + return null; } PendingHitDetails pendingHit = new PendingHitDetails(); @@ -106,7 +119,7 @@ private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { } catch (NumberFormatException e) { logger.warn("Tamr returned derog hit for watchlist entry with " + "invalid ID \"{}\".", derogHit.getDerogId()); - return; + return null; } Optional watchlistItem = watchlistItemRepository.findById(watchlistItemId); @@ -115,7 +128,7 @@ private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { } else { logger.warn("Tamr returned derog hit for nonexistent watchlist " + "entry with ID {}.", watchlistItemId); - return; + return null; } pendingHit.setPercentage(derogHit.getScore()); @@ -131,15 +144,14 @@ private void createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { } else { logger.warn("Tamr returned derog hit for nonexistent passenger " + "with ID {}.", gtasId); - return; + return null; } pendingHit.setPassengerId(gtasId); pendingHit.setCreatedDate(new Date()); - // Persist to database. - pendingHitDetailRepository.save(pendingHit); + return pendingHit; } /** @@ -163,8 +175,8 @@ public void handleAcknowledgeResponse(TamrMessage response) { } /** - * Handles TH.CLUSTERS and TH.DELTAS messages from Tamr. These both require - * similar functionality: updating the Tamr cluster IDs. + * Handles QUERY, TH.CLUSTERS, and TH.DELTAS messages from Tamr. These all + * require similar functionality: updating the Tamr cluster IDs. */ @Override public void handleTamrIdUpdate(TamrMessage message) { @@ -175,28 +187,30 @@ public void handleTamrIdUpdate(TamrMessage message) { return; } + Map gtasIdToTamrId = new HashMap(); for (TamrHistoryCluster cluster: message.getHistoryClusters()) { if (cluster.getAction() == null || cluster.getAction() == TamrHistoryClusterAction.UPDATE) { - this.updateTamrId(cluster.getGtasId(), - cluster.getTamrId(), cluster.getVersion()); + addTamrIdUpdate(gtasIdToTamrId, cluster.getGtasId(), + cluster.getTamrId()); } else if (cluster.getAction() == TamrHistoryClusterAction.DELETE) { - this.updateTamrId(cluster.getGtasId(), - null, cluster.getVersion()); + addTamrIdUpdate(gtasIdToTamrId, cluster.getGtasId(), null); } else { logger.warn("Unknown history cluster action \"{}\" received " + "from Tamr for passenger {}. Ignoring...", cluster.getAction(), cluster.getGtasId()); } } + + updateTamrIds(gtasIdToTamrId); } /** - * Updates the tamrId for the traveler in GTAS with the given gtasId. This - * also checks to see if the traveler exists in GTAS; if they do not, it - * issues a warning. + * Add a (GTAS ID, Tamr ID) pair to a map that can then be passed to + * updateTamrIds. */ - private void updateTamrId(String gtasIdStr, String tamrId, int version) { + private void addTamrIdUpdate(Map gtasIdToTamrId, + String gtasIdStr, String tamrId) { long gtasId; try { gtasId = Long.parseLong(gtasIdStr); @@ -205,14 +219,33 @@ private void updateTamrId(String gtasIdStr, String tamrId, int version) { "ID \"{}\".", gtasIdStr); return; } - PassengerIDTag currentPassengerIdTag = - passengerIDTagRepository.findByPaxId(gtasId); - if (currentPassengerIdTag == null) { - logger.warn("Unable to update tamrId of nonexistent passenger " + - "ID tag {}.", gtasId); - } else { - passengerIDTagRepository.updateTamrId(gtasId, tamrId); - } + gtasIdToTamrId.put(gtasId, tamrId); + } + + /** + * Given a map from GTAS IDs to Tamr IDs (or null, if a Tamr ID should be + * deleted), this will update the Passenger ID Tags for the given IDs + * to have the given Tamr IDs. + */ + private void updateTamrIds(Map gtasIdToTamrId) { + if (gtasIdToTamrId.isEmpty()) return; + + // Get existing PassengerIDTags. + Map passengerIDTags = new HashMap<>(); + passengerIDTagRepository.findAllById(gtasIdToTamrId.keySet()) + .forEach((passengerIDTag) -> passengerIDTags.put( + passengerIDTag.getPax_id(), passengerIDTag)); + + // Update PassengerIDTags and save to database in one batch. + gtasIdToTamrId.forEach((gtasId, tamrId) -> { + if (passengerIDTags.containsKey(gtasId)) { + passengerIDTags.get(gtasId).setTamrId(tamrId); + } else { + logger.warn("Unable to update tamrId of nonexistent passenger " + + "ID tag {}.", gtasId); + } + }); + passengerIDTagRepository.saveAll(passengerIDTags.values()); } /** diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java index 4444fa290f..b8c2fdb118 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -84,10 +84,11 @@ public void testHandleDerogHit() { passenger.getId(), watchlistItem.getId(), score); handler.handleQueryResponse(derogMessage); - final ArgumentCaptor pendingHitCaptor = - ArgumentCaptor.forClass(PendingHitDetails.class); - verify(pendingHitDetailRepository).save(pendingHitCaptor.capture()); - PendingHitDetails pendingHit = pendingHitCaptor.getValue(); + final ArgumentCaptor> pendingHitCaptor = + ArgumentCaptor.forClass(Iterable.class); + verify(pendingHitDetailRepository).saveAll(pendingHitCaptor.capture()); + PendingHitDetails pendingHit = pendingHitCaptor.getValue() + .iterator().next(); assertTrue(pendingHit.getTitle().equals(derogHitTitle)); assertTrue(pendingHit.getDescription().equals(derogHitDescription)); diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java index 7e4f4dde44..17d3250897 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/UpdateTamrIdTest.java @@ -2,8 +2,7 @@ import static org.junit.Assert.*; import static org.mockito.AdditionalMatchers.not; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.*; @@ -13,6 +12,8 @@ import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatcher; import gov.gtas.model.PassengerIDTag; import gov.gtas.parsers.ParserTestHelper; @@ -43,16 +44,44 @@ public void setUp() { // queried. PassengerIDTag passengerIdTag = new PassengerIDTag(); passengerIdTag.setPax_id(gtasId); - given(passengerIDTagRepository.findByPaxId(gtasId)).willReturn( - passengerIdTag); - given(passengerIDTagRepository.findByPaxId(not(eq(gtasId)))) - .willReturn(null); + + ArgumentMatcher> containsGtasId = + new ArgumentMatcher>() { + @Override + public boolean matches(Iterable ids) { + if (ids == null) return false; + for (Long id: ids) { + if (id == gtasId) return true; + } + return false; + } + }; + + given(passengerIDTagRepository.findAllById(argThat(containsGtasId))) + .willReturn(Collections.singleton(passengerIdTag)); + given(passengerIDTagRepository.findAllById(not(argThat(containsGtasId)))) + .willReturn(Collections.EMPTY_LIST); this.handler = new TamrMessageHandlerServiceImpl( passengerIDTagRepository, null, null, null); } + private void verifyTamrIdUpated(long gtasId, String newTamrId) { + final ArgumentCaptor> passengerIDTagsCaptor = + ArgumentCaptor.forClass(Iterable.class); + verify(passengerIDTagRepository).saveAll( + passengerIDTagsCaptor.capture()); + boolean tamrIdUpdated = false; + for(PassengerIDTag passengerIDTag: passengerIDTagsCaptor.getValue()) { + if (passengerIDTag.getPax_id() == gtasId) { + assertEquals(passengerIDTag.getTamrId(), newTamrId); + tamrIdUpdated = true; + } + } + assertTrue(tamrIdUpdated); + } + @Test public void testQueryResponse() { TamrTravelerResponse travelerResponse = new TamrTravelerResponse(); @@ -67,8 +96,7 @@ public void testQueryResponse() { handler.handleQueryResponse(message); - verify(passengerIDTagRepository).updateTamrId( - gtasId, newTamrId); + verifyTamrIdUpated(gtasId, newTamrId); } @Test @@ -84,8 +112,7 @@ public void testDeltaMessageUpdate() { handler.handleTamrIdUpdate(message); - verify(passengerIDTagRepository).updateTamrId( - gtasId, newTamrId); + verifyTamrIdUpated(gtasId, newTamrId); } @Test @@ -101,8 +128,7 @@ public void testDeltaMessageDelete() { handler.handleTamrIdUpdate(message); - verify(passengerIDTagRepository).updateTamrId( - gtasId, null); + verifyTamrIdUpated(gtasId, null); } @Test @@ -118,8 +144,7 @@ public void testClusterMessage() { handler.handleTamrIdUpdate(message); - verify(passengerIDTagRepository).updateTamrId( - gtasId, newTamrId); + verifyTamrIdUpated(gtasId, newTamrId); } /** @@ -149,7 +174,14 @@ public void testInvalidGtasId() { message.setTravelerQuery(travelerResponses); handler.handleQueryResponse(message); - - verify(passengerIDTagRepository, never()).updateTamrId(any(), any()); + + final ArgumentCaptor> passengerIDTagsCaptor = + ArgumentCaptor.forClass(Iterable.class); + verify(passengerIDTagRepository).saveAll( + passengerIDTagsCaptor.capture()); + List updatedPassengerIDTags = + new ArrayList(); + passengerIDTagsCaptor.getValue().forEach(updatedPassengerIDTags::add); + assertTrue(updatedPassengerIDTags.isEmpty()); } } From 258c7351098d852e83082c0fa6106f62d4bfd7db Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Fri, 20 Mar 2020 18:31:48 -0400 Subject: [PATCH 61/83] Add index for tamr_id column on PassengerIDTag (and remove index on doc_hash_id) --- .../src/main/java/gov/gtas/model/PassengerIDTag.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PassengerIDTag.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PassengerIDTag.java index 6aa11350f7..635624364c 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PassengerIDTag.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/PassengerIDTag.java @@ -11,7 +11,7 @@ @Entity @Table(name = "passenger_id_tag", indexes = { @Index(columnList = "idTag", name = "id_index"), - @Index(columnList = "doc_hash_id", name = "doc_hash_id_index") }) + @Index(columnList = "tamr_id", name = "tamr_id_index") }) public class PassengerIDTag extends BaseEntityAudit { private static final long serialVersionUID = 1L; From 33805243d4c3c01dcaf483c4a5640a77994cf0d0 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 23 Mar 2020 17:46:40 -0400 Subject: [PATCH 62/83] Load watchlist items in batches from database in TamrDerogReplaceScheduler --- .../watchlist/WatchlistItemRepository.java | 5 ++- .../resources/default.application.properties | 2 ++ .../resources/tamr.application.properties | 3 ++ .../tamr/TamrDerogReplaceScheduler.java | 31 ++++++++++++++++--- .../tamr/TamrDerogReplaceSchedulerTest.java | 18 +++++++++++ 5 files changed, 53 insertions(+), 6 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java index 0a37b34cd6..187e1a1eae 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/watchlist/WatchlistItemRepository.java @@ -5,11 +5,11 @@ */ package gov.gtas.repository.watchlist; -import gov.gtas.model.lookup.Airport; import gov.gtas.model.watchlist.WatchlistItem; import java.util.List; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -25,6 +25,9 @@ public interface WatchlistItemRepository @Query("SELECT wli FROM WatchlistItem wli WHERE wli.watchlist.watchlistName = :watchlistName") public List getItemsByWatchlistName(@Param("watchlistName") String watchlistName); + @Query("SELECT wli FROM WatchlistItem wli WHERE wli.watchlist.watchlistName = :watchlistName") + public List getItemsByWatchlistName(@Param("watchlistName") String watchlistName, Pageable pageable); + @Query("DELETE FROM WatchlistItem wli WHERE wli.watchlist.watchlistName = :watchlistName") public void deleteItemsByWatchlistName(@Param("watchlistName") String watchlistName); diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index 57e8817089..bde273263d 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -188,6 +188,8 @@ tamr.resolve_passenger_history=true # hour if they've changed. tamr.derogReplace.fixedDelay.in.milliseconds=3600000 tamr.derogReplace.initialDelay.in.milliseconds=1000 +# Batch size for querying the database for watchlist entries. +tamr.derogReplace.batchSize=10000 # Title and description to be used on derog hits received from Tamr. tamr.derog_hit.title=Tamr Fuzzy Watchlist Hit tamr.derog_hit.description=This passenger closely matches a watchlist entry, according to Tamr's proprietary fuzzy matching technology. diff --git a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties index 6df6b12346..c9b6fe85fa 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties +++ b/gtas-parent/gtas-job-scheduler-war/src/test/resources/tamr.application.properties @@ -3,3 +3,6 @@ tamr.enabled=true # call it manually. tamr.derogReplace.fixedDelay.in.milliseconds=1000000000 tamr.derogReplace.initialDelay.in.milliseconds=1000000000 + +# Make sure super small batches work with derog replace. +tamr.derogReplace.batchSize=2 diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java index a63cab7dd7..20ac0beb9f 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrDerogReplaceScheduler.java @@ -16,7 +16,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -46,6 +49,9 @@ public class TamrDerogReplaceScheduler { private final String PASSENGER_WATCHLIST_NAME = "Passenger"; + @Value("${tamr.derogReplace.batchSize}") + private Integer batchSize; + WatchlistRepository watchlistRepository; WatchlistItemRepository watchlistItemRepository; @@ -86,12 +92,27 @@ public void jobScheduling() throws InterruptedException { // job was run... if (lastRun == null || lastRun.before(latestWatchlistEdit)) { logger.info("Sending latest watchlist to Tamr."); - - List watchlistItems = - watchlistItemRepository.getItemsByWatchlistName( - PASSENGER_WATCHLIST_NAME); + List derogListEntries = - tamrAdapter.convertWatchlist(watchlistItems); + new ArrayList(); + + // Loop through the watchlist items in batches to avoid too much + // database load. + List watchlistItemsBatch; + int batchIndex = 0; + do { + Pageable batchPage = PageRequest.of( + batchIndex, batchSize); + watchlistItemsBatch = watchlistItemRepository + .getItemsByWatchlistName( + PASSENGER_WATCHLIST_NAME, batchPage); + logger.info("watchlistItemsBatch = {}", watchlistItemsBatch); + derogListEntries.addAll(tamrAdapter.convertWatchlist( + watchlistItemsBatch)); + + batchIndex++; + } while (watchlistItemsBatch.size() == batchSize); + TamrDerogListUpdate derogReplace = new TamrDerogListUpdate(derogListEntries); tamrMessageSender.sendMessageToTamr( diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java index ac2f8d32e4..ab3fa596d1 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/TamrDerogReplaceSchedulerTest.java @@ -18,6 +18,10 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.springframework.data.domain.Pageable; +import org.springframework.test.util.ReflectionTestUtils; import gov.gtas.enumtype.EntityEnum; import gov.gtas.model.watchlist.Watchlist; @@ -52,6 +56,18 @@ public void setUp() { given(watchlistItemRepository.findAll()).willReturn(watchlistItems); given(watchlistItemRepository.getItemsByWatchlistName("Passenger")) .willReturn(watchlistItems); + doAnswer(new Answer>() { + public List answer(InvocationOnMock invocation) { + Pageable pageable = invocation.getArgument(1); + int fromIndex = Math.min( + (int) pageable.getOffset(), watchlistItems.size()); + int toIndex = Math.min( + (int) pageable.getOffset() + pageable.getPageSize(), + watchlistItems.size()); + return watchlistItems.subList(fromIndex, toIndex); + } + }).when(watchlistItemRepository).getItemsByWatchlistName( + eq("Passenger"), any(Pageable.class)); messageSender = mock(TamrMessageSender.class); doCallRealMethod().when(messageSender).sendMessageToTamr(any(), any()); @@ -61,6 +77,8 @@ public void setUp() { watchlistItemRepository, messageSender, new TamrAdapterImpl(null)); + + ReflectionTestUtils.setField(scheduler, "batchSize", 3); } /** From 4f8c1a0ae2d8ded6c408afe11902f017fb13f463 Mon Sep 17 00:00:00 2001 From: Cassidy Laidlaw Date: Mon, 23 Mar 2020 19:07:27 -0400 Subject: [PATCH 63/83] Modify TamrMessageHandlerServiceImpl to use fewer database queries when handling derog hits --- .../repository/FlightPassengerRepository.java | 5 + .../tamr/TamrMessageHandlerServiceImpl.java | 174 +++++++++++------- .../parsers/tamr/HandleTamrDerogHitsTest.java | 74 ++++++-- 3 files changed, 162 insertions(+), 91 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPassengerRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPassengerRepository.java index c07db07630..ba51831a11 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPassengerRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPassengerRepository.java @@ -1,7 +1,12 @@ package gov.gtas.repository; import gov.gtas.model.FlightPassenger; + +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; public interface FlightPassengerRepository extends CrudRepository { + @Query("SELECT fp FROM FlightPassenger fp WHERE fp.passengerId IN :ids") + Iterable findAllByPassengerIds(@Param("ids") Iterable ids); } diff --git a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java index 0c83dc56cb..400c883323 100644 --- a/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java +++ b/gtas-parent/gtas-parsers/src/main/java/gov/gtas/parsers/tamr/TamrMessageHandlerServiceImpl.java @@ -1,11 +1,13 @@ package gov.gtas.parsers.tamr; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Optional; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,7 +18,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import gov.gtas.enumtype.HitTypeEnum; -import gov.gtas.model.Passenger; import gov.gtas.model.PassengerIDTag; import gov.gtas.model.PendingHitDetails; import gov.gtas.model.watchlist.WatchlistItem; @@ -25,8 +26,8 @@ import gov.gtas.parsers.tamr.model.TamrHistoryClusterAction; import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.parsers.tamr.model.TamrTravelerResponse; +import gov.gtas.repository.FlightPassengerRepository; import gov.gtas.repository.PassengerIDTagRepository; -import gov.gtas.repository.PassengerRepository; import gov.gtas.repository.PendingHitDetailRepository; import gov.gtas.repository.watchlist.WatchlistItemRepository; @@ -40,8 +41,8 @@ public class TamrMessageHandlerServiceImpl implements TamrMessageHandlerService private WatchlistItemRepository watchlistItemRepository; private PendingHitDetailRepository pendingHitDetailRepository; - - private PassengerRepository passengerRepository; + + private FlightPassengerRepository flightPassengerRepository; @Value("${tamr.derog_hit.title}") String derogHitTitle; @@ -53,11 +54,11 @@ public TamrMessageHandlerServiceImpl( PassengerIDTagRepository passengerIDTagRepository, WatchlistItemRepository watchlistItemRepository, PendingHitDetailRepository pendingHitDetailRepository, - PassengerRepository passengerRepository) { + FlightPassengerRepository flightPassengerRepository) { this.passengerIDTagRepository = passengerIDTagRepository; this.watchlistItemRepository = watchlistItemRepository; this.pendingHitDetailRepository = pendingHitDetailRepository; - this.passengerRepository = passengerRepository; + this.flightPassengerRepository = flightPassengerRepository; } /** @@ -77,81 +78,112 @@ public void handleQueryResponse(TamrMessage response) { } this.updateTamrIds(gtasIdToTamrId); - List pendingHits = new ArrayList<>(); - for (TamrTravelerResponse travelerResponse: response.getTravelerQuery()) { - for (TamrDerogHit derogHit: travelerResponse.getDerogIds()) { - PendingHitDetails pendingHit = this.createPendingHit( - travelerResponse.getGtasId(), derogHit); - if (pendingHit != null) pendingHits.add(pendingHit); - } - } - if (!pendingHits.isEmpty()) { - pendingHitDetailRepository.saveAll(pendingHits); - } + this.createPendingHits(response.getTravelerQuery()); } /** - * Creates an instance of the PendingHitDetails model in GTAS based on a - * derog hit from Tamr. Returns the instance (does not save it) or null - * if the derog hit is invalid. + * Creates and saves PendingHitDetails instances to the database for all + * the given traveler responses from Tamr which contain derog hits. */ - private PendingHitDetails createPendingHit(String gtasIdStr, TamrDerogHit derogHit) { - long gtasId; - try { - gtasId = Long.parseLong(gtasIdStr); - } catch (NumberFormatException e) { - logger.warn("Tamr returned derog hit for passenger with invalid " + - "ID \"{}\".", gtasIdStr); - return null; - } - PendingHitDetails pendingHit = new PendingHitDetails(); - - pendingHit.setTitle(derogHitTitle); - pendingHit.setDescription(derogHitDescription); + private void createPendingHits(List travelerResponses) { + // List of (GTAS passenger ID, derog hit) pairs. + List> derogHits = + new ArrayList<>(); - pendingHit.setHitEnum(HitTypeEnum.PARTIAL_WATCHLIST); - pendingHit.setHitType(pendingHit.getHitEnum().toString()); + Set passengerIds = new HashSet<>(); + Set watchlistItemIds = new HashSet<>(); - // Try to get watchlist item based on derogId from Tamr. - long watchlistItemId; - try { - watchlistItemId = Long.parseLong(derogHit.getDerogId()); - } catch (NumberFormatException e) { - logger.warn("Tamr returned derog hit for watchlist entry with " + - "invalid ID \"{}\".", derogHit.getDerogId()); - return null; - } - Optional watchlistItem = - watchlistItemRepository.findById(watchlistItemId); - if (watchlistItem.isPresent()) { - pendingHit.setHitMakerId(watchlistItem.get().getId()); - } else { - logger.warn("Tamr returned derog hit for nonexistent watchlist " + - "entry with ID {}.", watchlistItemId); - return null; + for (TamrTravelerResponse travelerResponse: travelerResponses) { + for (TamrDerogHit derogHit: travelerResponse.getDerogIds()) { + long gtasId, watchlistItemId; + try { + gtasId = Long.parseLong(travelerResponse.getGtasId()); + } catch (NumberFormatException e) { + logger.warn("Tamr returned derog hit for passenger with " + + "invalid ID \"{}\".", travelerResponse.getGtasId()); + continue; + } + try { + watchlistItemId = Long.parseLong(derogHit.getDerogId()); + } catch (NumberFormatException e) { + logger.warn("Tamr returned derog hit for watchlist " + + "entry with invalid ID \"{}\".", + derogHit.getDerogId()); + continue; + } + + passengerIds.add(gtasId); + watchlistItemIds.add(watchlistItemId); + derogHits.add(new AbstractMap.SimpleEntry<>(gtasId, derogHit)); + } } - pendingHit.setPercentage(derogHit.getScore()); + if (derogHits.isEmpty()) return; - // Tamr doesn't return any details about the matching algorithm, - // so leave this empty. - pendingHit.setRuleConditions(""); - - // Try to find passenger in GTAS so we can get the associated flight. - Optional passenger = passengerRepository.findById(gtasId); - if (passenger.isPresent()) { - pendingHit.setFlightId(passenger.get().getFlight().getId()); - } else { - logger.warn("Tamr returned derog hit for nonexistent passenger " + - "with ID {}.", gtasId); - return null; - } + // Construct a map from passenger IDs to flight IDs... + Map passengerFlightIds = new HashMap<>(); + flightPassengerRepository.findAllByPassengerIds(passengerIds) + .forEach((flightPassenger) -> passengerFlightIds.put( + flightPassenger.getPassengerId(), + flightPassenger.getFlightId())); + + // ...and from watchlist item IDs to watchlist items. + Map watchlistItems = new HashMap<>(); + watchlistItemRepository.findAllById(watchlistItemIds) + .forEach((watchlistItem) -> watchlistItems.put( + watchlistItem.getId(), watchlistItem)); - pendingHit.setPassengerId(gtasId); - pendingHit.setCreatedDate(new Date()); - - return pendingHit; + // Now, make a list of valid pending hits. + List pendingHits = new ArrayList<>(); + for(AbstractMap.SimpleEntry derogHitWithId: + derogHits) { + long gtasId = derogHitWithId.getKey(); + TamrDerogHit derogHit = derogHitWithId.getValue(); + + PendingHitDetails pendingHit = new PendingHitDetails(); + + pendingHit.setTitle(derogHitTitle); + pendingHit.setDescription(derogHitDescription); + + pendingHit.setHitEnum(HitTypeEnum.PARTIAL_WATCHLIST); + pendingHit.setHitType(pendingHit.getHitEnum().toString()); + + long watchlistItemId = Long.parseLong(derogHit.getDerogId()); + WatchlistItem watchlistItem = watchlistItems.get(watchlistItemId); + if (watchlistItem != null) { + pendingHit.setHitMakerId(watchlistItem.getId()); + } else { + logger.warn("Tamr returned derog hit for nonexistent watchlist " + + "entry with ID {}.", watchlistItemId); + continue; + } + + pendingHit.setPercentage(derogHit.getScore()); + + // Tamr doesn't return any details about the matching algorithm, + // so leave this empty. + pendingHit.setRuleConditions(""); + + // Find associated flight ID for passenger. + if (!passengerFlightIds.containsKey(gtasId)) { + logger.warn("Tamr returned derog hit for nonexistent passenger " + + "with ID {}.", gtasId); + continue; + } + pendingHit.setFlightId(passengerFlightIds.get(gtasId)); + + pendingHit.setPassengerId(gtasId); + + pendingHit.setCreatedDate(new Date()); + + pendingHits.add(pendingHit); + } + + // Finally, save them all to the database. + if (!pendingHits.isEmpty()) { + pendingHitDetailRepository.saveAll(pendingHits); + } } /** diff --git a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java index b8c2fdb118..d528d36d5e 100644 --- a/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java +++ b/gtas-parent/gtas-parsers/src/test/java/gov/gtas/parsers/tamr/HandleTamrDerogHitsTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; import static org.mockito.AdditionalMatchers.*; +import static org.mockito.ArgumentMatchers.argThat; import java.util.Collections; import java.util.Optional; @@ -10,16 +11,19 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatcher; import org.springframework.test.util.ReflectionTestUtils; import gov.gtas.enumtype.HitTypeEnum; import gov.gtas.model.Flight; +import gov.gtas.model.FlightPassenger; import gov.gtas.model.Passenger; import gov.gtas.model.PendingHitDetails; import gov.gtas.model.watchlist.WatchlistItem; import gov.gtas.parsers.tamr.model.TamrDerogHit; import gov.gtas.parsers.tamr.model.TamrMessage; import gov.gtas.parsers.tamr.model.TamrTravelerResponse; +import gov.gtas.repository.FlightPassengerRepository; import gov.gtas.repository.PassengerRepository; import gov.gtas.repository.PendingHitDetailRepository; import gov.gtas.repository.watchlist.WatchlistItemRepository; @@ -29,47 +33,58 @@ public class HandleTamrDerogHitsTest { private WatchlistItem watchlistItem; private WatchlistItemRepository watchlistItemRepository; private PendingHitDetailRepository pendingHitDetailRepository; + private FlightPassengerRepository flightPassengerRepository; private Passenger passenger; - private PassengerRepository passengerRepository; + private Flight flight; private String derogHitTitle = "Derog Title"; private String derogHitDescription = "Derog description."; - + @Before public void setUp() { this.watchlistItem = new WatchlistItem(); watchlistItem.setId(94L); + // Dummy passenger and flight instance. + passenger = new Passenger(); + passenger.setId(1099L); + flight = new Flight(); + flight.setId(22L); + watchlistItemRepository = mock(WatchlistItemRepository.class); // Set up WatchlistItemRepository to return a fake watchlist item. - given(watchlistItemRepository.findById(watchlistItem.getId())) - .willReturn(Optional.of(watchlistItem)); - // Otherwise return null. - given(watchlistItemRepository.findById(not(eq(watchlistItem.getId())))) - .willReturn(Optional.empty()); + given(watchlistItemRepository.findAllById( + argThat(new ContainsMatcher(watchlistItem.getId())))) + .willReturn(Collections.singletonList(watchlistItem)); + // Otherwise return empty list. + given(watchlistItemRepository.findAllById( + not(argThat(new ContainsMatcher(watchlistItem.getId()))))) + .willReturn(Collections.EMPTY_LIST); pendingHitDetailRepository = mock(PendingHitDetailRepository.class); - passengerRepository = mock(PassengerRepository.class); + flightPassengerRepository = mock(FlightPassengerRepository.class); + + // Set up the PassengerRepository to return a dummy instance when // queried. - passenger = new Passenger(); - passenger.setId(1099L); - Flight flight = new Flight(); - flight.setId(22L); - passenger.setFlight(flight); - given(passengerRepository.findById(passenger.getId())).willReturn( - Optional.of(passenger)); - // Otherwise return null. - given(passengerRepository.findById(not(eq(passenger.getId())))) - .willReturn(Optional.empty()); + FlightPassenger flightPassenger = new FlightPassenger(); + flightPassenger.setFlightId(flight.getId()); + flightPassenger.setPassengerId(passenger.getId()); + given(flightPassengerRepository.findAllByPassengerIds( + argThat(new ContainsMatcher(passenger.getId())))) + .willReturn(Collections.singletonList(flightPassenger)); + // Otherwise return empty list. + given(flightPassengerRepository.findAllByPassengerIds( + not(argThat(new ContainsMatcher(passenger.getId()))))) + .willReturn(Collections.EMPTY_LIST); this.handler = new TamrMessageHandlerServiceImpl( null, watchlistItemRepository, pendingHitDetailRepository, - passengerRepository); + flightPassengerRepository); ReflectionTestUtils.setField(handler, "derogHitTitle", derogHitTitle); ReflectionTestUtils.setField(handler, "derogHitDescription", @@ -101,7 +116,7 @@ public void testHandleDerogHit() { assertEquals(score, pendingHit.getPercentage(), 0.00001f); assertEquals(passenger.getId(), pendingHit.getPassengerId()); - assertEquals(passenger.getFlight().getId(), pendingHit.getFlightId()); + assertEquals(flight.getId(), pendingHit.getFlightId()); } /** @@ -175,4 +190,23 @@ private TamrMessage getDerogMessage(long gtasId, long derogId, float score) { message.setTravelerQuery(Collections.singletonList(travelerResponse)); return message; } + + /** + * Mockito argument matcher that matches any iterable argument which + * contains the given item. + */ + private class ContainsMatcher implements ArgumentMatcher> { + private T element; + public ContainsMatcher(T element) { + this.element = element; + } + @Override + public boolean matches(Iterable argument) { + if (argument == null) return false; + for (T otherElement: argument) { + if (otherElement.equals(element)) return true; + } + return false; + } + } } From 97a95f3c71f37e408e9ff40cc76bc888dc14c062 Mon Sep 17 00:00:00 2001 From: Jon Date: Tue, 24 Mar 2020 11:19:31 -0400 Subject: [PATCH 64/83] Fixed inability to query on flights due to the prefix erroneously attempting to access values without also selecting from Passenger. -Added passenger selection to queryPrefix -Added unit test for passenger addition --- .../gov/gtas/querybuilder/JPQLGenerator.java | 3 +- .../gtas/querybuilder/JPQLGeneratorTest.java | 42 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/querybuilder/JPQLGenerator.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/querybuilder/JPQLGenerator.java index 6673c7ff3f..4cd741c711 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/querybuilder/JPQLGenerator.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/querybuilder/JPQLGenerator.java @@ -48,7 +48,8 @@ public static String generateQuery(QueryEntity queryEntity, EntityEnum queryType if (queryType == EntityEnum.FLIGHT) { queryPrefix = Constants.SELECT_DISTINCT + " " + EntityEnum.FLIGHT.getAlias() + " " + Constants.FROM - + " " + EntityEnum.FLIGHT.getEntityName() + " " + EntityEnum.FLIGHT.getAlias(); + + " " + EntityEnum.FLIGHT.getEntityName() + " " + EntityEnum.FLIGHT.getAlias() + + Constants.LEFT_JOIN + EntityEnum.FLIGHT.getAlias() + ".passengers " + EntityEnum.PASSENGER.getAlias(); if (seatCondition.isTrue()) { joinEntities.add(EntityEnum.PASSENGER); diff --git a/gtas-parent/gtas-commons/src/test/java/gov/gtas/querybuilder/JPQLGeneratorTest.java b/gtas-parent/gtas-commons/src/test/java/gov/gtas/querybuilder/JPQLGeneratorTest.java index ae8b6727bd..90e04a0f72 100644 --- a/gtas-parent/gtas-commons/src/test/java/gov/gtas/querybuilder/JPQLGeneratorTest.java +++ b/gtas-parent/gtas-commons/src/test/java/gov/gtas/querybuilder/JPQLGeneratorTest.java @@ -300,4 +300,46 @@ public void testEqualsWhereClauseForDocument() throws InvalidQueryRepositoryExce Assert.assertEquals(expectedQuery, query); } + @Test + public void testGenericQueryPrefixForFlight() throws InvalidQueryRepositoryException { + //This does not test any specific clauses or entities. This is to test the leading query prefix to insure it properly uses the passenger as the junction + + String expectedQuery = "select distinct f from Flight f left join f.passengers p join p.documents d where (d.type in ?1)"; + String expectedQuery2 = "select distinct f from Flight f left join f.passengers p left join f.pnrs pnr left join pnr.emails e where (e.domain in ?1)"; + String expectedQuery3 = "select distinct f from Flight f left join f.passengers p left join f.pnrs pnr left join pnr.creditCards cc where (cc.type in ?1)"; + + QueryObject mockQueryObject = new QueryObject(); + QueryTerm mockQueryTerm = new QueryTerm(); + + mockQueryTerm.setUuid(null); + mockQueryTerm.setType("string"); + mockQueryTerm.setEntity("Document"); + mockQueryTerm.setOperator("IN"); + mockQueryTerm.setValue(new String[]{"V"}); + mockQueryTerm.setField("type"); + + List mockQTList = new ArrayList<>(); + mockQTList.add(mockQueryTerm); + + mockQueryObject.setCondition("AND"); + mockQueryObject.setRules(mockQTList); + + String query = JPQLGenerator.generateQuery(mockQueryObject, EntityEnum.FLIGHT); + Assert.assertEquals(expectedQuery, query); + + mockQueryTerm.setEntity("Email"); + mockQueryTerm.setValue(new String[]{"HOTMAIL.COM"}); + mockQueryTerm.setField("domain"); + + String query2 = JPQLGenerator.generateQuery(mockQueryObject, EntityEnum.FLIGHT); + Assert.assertEquals(expectedQuery2, query2); + + mockQueryTerm.setEntity("Creditcard"); + mockQueryTerm.setValue(new String[]{"VI"}); + mockQueryTerm.setField("type"); + + String query3 = JPQLGenerator.generateQuery(mockQueryObject, EntityEnum.FLIGHT); + Assert.assertEquals(expectedQuery3, query3); + } + } From b38e2728f371e5a2ff0ec99cd3c9a61196a1e0de Mon Sep 17 00:00:00 2001 From: Robert Stine Date: Tue, 24 Mar 2020 13:54:51 -0400 Subject: [PATCH 65/83] Add sql to remove doc id hash, add tamr id hash, add pending hit detail table. --- .../doc_hash_id_index_removal.sql | 9 +++++ .../pending_hit_detail_creation.sql | 34 +++++++++++++++++++ .../rollback/pending_hit_detail_rollback.sql | 10 ++++++ .../rollback/tamr_id_index_rollback.sql | 9 +++++ .../tamr_id_index_addition.sql | 10 ++++++ 5 files changed, 72 insertions(+) create mode 100644 gtas-parent/scripts/db/1.10.0_to_1.11.0/doc_hash_id_index_removal.sql create mode 100644 gtas-parent/scripts/db/1.10.0_to_1.11.0/pending_hit_detail_creation.sql create mode 100644 gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/pending_hit_detail_rollback.sql create mode 100644 gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/tamr_id_index_rollback.sql create mode 100644 gtas-parent/scripts/db/1.10.0_to_1.11.0/tamr_id_index_addition.sql diff --git a/gtas-parent/scripts/db/1.10.0_to_1.11.0/doc_hash_id_index_removal.sql b/gtas-parent/scripts/db/1.10.0_to_1.11.0/doc_hash_id_index_removal.sql new file mode 100644 index 0000000000..0cfa087686 --- /dev/null +++ b/gtas-parent/scripts/db/1.10.0_to_1.11.0/doc_hash_id_index_removal.sql @@ -0,0 +1,9 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +drop index doc_hash_id_index on passenger_id_tag; diff --git a/gtas-parent/scripts/db/1.10.0_to_1.11.0/pending_hit_detail_creation.sql b/gtas-parent/scripts/db/1.10.0_to_1.11.0/pending_hit_detail_creation.sql new file mode 100644 index 0000000000..f610d5e2d1 --- /dev/null +++ b/gtas-parent/scripts/db/1.10.0_to_1.11.0/pending_hit_detail_creation.sql @@ -0,0 +1,34 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +create or replace table pending_hit_detail +( + id bigint unsigned auto_increment + primary key, + created_at datetime null, + created_by varchar(20) null, + updated_at datetime null, + updated_by varchar(20) null, + description varchar(255) null, + title varchar(255) not null, + created_date datetime not null, + flight bigint unsigned not null, + hitEnum varchar(255) null, + hm_id bigint unsigned not null, + hit_type varchar(3) not null, + passenger bigint unsigned null, + percentage_match float null, + cond_text text null, + constraint FK4tmq550r3sjr8dy87555rt333 + foreign key (hm_id) references hit_maker (id), + constraint FKja4iov1d6lhniq3dgpmdiwk4r + foreign key (passenger) references passenger (id), + constraint FKtk5y8ih7nudpcds2500n65x1k + foreign key (flight) references flight (id) +); + diff --git a/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/pending_hit_detail_rollback.sql b/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/pending_hit_detail_rollback.sql new file mode 100644 index 0000000000..990900cbdd --- /dev/null +++ b/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/pending_hit_detail_rollback.sql @@ -0,0 +1,10 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +drop table if exists pending_hit_detail; + diff --git a/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/tamr_id_index_rollback.sql b/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/tamr_id_index_rollback.sql new file mode 100644 index 0000000000..ac21b49573 --- /dev/null +++ b/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/tamr_id_index_rollback.sql @@ -0,0 +1,9 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +drop index tamr_id_index on passenger_id_tag; \ No newline at end of file diff --git a/gtas-parent/scripts/db/1.10.0_to_1.11.0/tamr_id_index_addition.sql b/gtas-parent/scripts/db/1.10.0_to_1.11.0/tamr_id_index_addition.sql new file mode 100644 index 0000000000..494318838e --- /dev/null +++ b/gtas-parent/scripts/db/1.10.0_to_1.11.0/tamr_id_index_addition.sql @@ -0,0 +1,10 @@ +/* + * + * * All Application code is Copyright 2016, The Department of Homeland Security (DHS), U.S. Customs and Border Protection (CBP). + * * + * * Please see LICENSE.txt for details. + * + */ + +create or replace index tamr_id_index + on passenger_id_tag (tamr_id); \ No newline at end of file From 9824d582f33c38ed8c006d9ebdfa5275a59bf592 Mon Sep 17 00:00:00 2001 From: David Ertel Date: Thu, 2 Apr 2020 14:44:20 -0400 Subject: [PATCH 66/83] Delete watchlistGenerator_20190827.xlsm --- .../watchlistGenerator_20190827.xlsm | Bin 24640 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 watchlistGenerators/watchlistGenerator_20190827.xlsm diff --git a/watchlistGenerators/watchlistGenerator_20190827.xlsm b/watchlistGenerators/watchlistGenerator_20190827.xlsm deleted file mode 100644 index 31ac0a9852e6a82f7264945b60f821d007c8cc2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24640 zcmeFYQ=1^owk}$>ZQHhO+qP}nt}ffQZQJa!)n%Uk=3Hm5ea@QyVDG$$Co*E(WaNv; z5hE3(fk99JzyKfs000O9!p87e4*&rGlE47~kO3fow1w^MTukj;^i@0^Or3S*00h{#;dF}njn;nw=FJ)H@FIPz28hT z7uvt(zSOnA29yRtcN>`gnfb(vFKf$MMYWc&2(BBEWkm$_z>RsD()#rJ*7HLJO?nXP z*e^iS7I5VLcr|?Qjtu}6_pTNdM(LA`>UaYf`@)ODEC;uoAV`ez7%y_`>7LN5gIwGRvV6-Y+<)2Fx8-`219<7o?1j5 z1(`Ge7O1H*YLt!W*pQqFwadGlIm1t(^o@uUVwz@nCiDx1M~@ z0VS8S?n+R^#6+D@nQXXd_7AUR(?sjVFIm75sgq%jc7u3+> z4fJmje_-(aD8$jDd+|lU`fVk3!x$Rj^x_8Rxp%rVEHxmi79fK59R4X0uI!Gca5C1? z#T^}&T9w^v{Ys+OvGyqE9@3Xf?e@WLQ8`M^*|jZydttA^z6a+y1?;yzny~*hat+pc za`w=@vyJ=))VVHuX2$`10-$|@?fU$e{69ay01E#fX=qVpAb$LdcbUJ;hyE)K`c9@c z&h&KuwEtHU{twoH|LxJMlVs(G7+}I~B|gK)UsiS!5QL=N1tq!&Rr~@Zx8Yl2i%76{ z`p9t*RIq}9#r=EyJ}0+!cw#Tc37-#Gs-uxmxQSccYr@js9bLhx$ehx|9IJm1Bf70T ztvqLlOLYLc~ z{}IXRL;muimCGJiB4R;$WttNoBh7#E*J@_DpUUwZW``WA8o!$eipDSB{p*tdlO$jv z-xlP5XF7lZ0I&cc06lEz|IHJ3dnaondwc7D9Q6O?4B%fI{Tus#_EoJcC^y7_&`o>~ zKIMK;ED)-Yj3*$`LkI!ykRxk@BNeY2h|1=_V?5UE5wlVxN`&$l6yhnQEa2-*HYXKZyYGtL#^pf=8Ts_%Ij0a%K^C$j?a6fv6jKw z)N3F{ZMa}~P8^t-Q}`=tzx}ihjbAVZ21cV<{X_}nMLJIKPK!qpZ~5Kyte}JD22EFd zf)?d=H*Ak>carhbJS@kz{R;g*!A!iYS&{B9#GL*rHT+-v{Ds;74zOZXTl*|7ly5%E zAHX;6mKkjzsvIGt8=@yY)h_K1N2dWwJwRvMrQ*uxy<5hRX5F%iO9dli{EvI*SQ8clPn@Hp@g9=p|rvt$%XW}4sP){wrW~UTJ79I@7jg%rk7heccmRYY0pal zfhuJc%q3Ec%fbWLCGy5YT8&mE*6DtQ9fKXpSt(sdyG$(a5RrDnLQ!I&LcL(ZHf_bb zRGRm&HZu^#ZZoj6ODPvGA?v8MepZ>C=N#?vQs4+{MQCUK0HQL=q#0Ri)UMirYhKu# zo*;b?f2sWY(&YZfgK{wxDXR`va)4OzMf%S&5ao9okdJgm4_u`H)IMakaB(#%FXF1R z2vpu6#fLEqlwwv3(!l*5L|PuFKl2;sYRjKaDYZkLH~6dTGArX18EltI7<#1^V8R`T z@yPqB7hToptQwRV3kaM99(;EG5R|b++3$AE8i?+aO&wj&js3dwJbKmVF$n%&xWAi> z0d>mBxA@hC^l_<%=zvgZt%g*mVDu+f11#VLUzG#l)~BR|I63lO{d*K}DiMYu0t3@f zA-h)5r&Z+YE>M2cV-bZ)yOB@Y>tN~~!pbrq=fQ+PsEA6eDyy{P~cngBn%yHeutYi z!e-W^AC&BKe^J15yF9BG(jLPtW6Tazd{}b47&K$ss28%RM)BYSly$`GY^w-(@U?a2 z+tAdZ@E$f{y&c`Pw|b6(^Aob@bPL#=<+xF#<;;9?ntapmI*r7rIBab}dqJ?HNEyv3 zXC=X%XA?lFp{qU5!$KQNb+6a%dpp<8%m-hAD9j9cihZs-2WOwy2^b%kX`;0Mrg|B| z)TLcBv|~2qCz{wLvfJ}upT4ipVqOxaT&KbqjkNtUbmi#8Er&CBC$m0Lmg;(3|Dg{3 zXNr)DpBG%1Lf}zZ;O?=5=L7#gQLD#83NGodDnI_E7s|h>QIxAwZW~S{`%UwxC&OI5ukmQ&^V`U>@DBxrOXgD zrE@H)k@#7_u%iLn*Stz(S{y+Ucwnx9eSs`6jiwmLGUDTB2gI>l84fI79PzFJb9w=$ zgAeR9QBPMQj!eF;v6d!wwR9UW4-jx#+Rx!IVa6Y7+g%8QExL`7UH<}i2VBkYBNDzs zxPi##&wR8;k6w~RGuCKp$Y{Bj>s#VwnBz*hg{U>&yl5E5!x$?|yI!ts zdgu64am5&LaI8PMXw-!Hr+sWRP+v=89-@>U;{f=zF6iqZ?0Gqo+_44QS^c)9awOV{ zk@1fRdxm@Y8@&+}=7yXR$98FHeJwQ(SRe4p*NCYptj zr^hENtq10z7^l*^RTbZu8N{2FMit#V+ER4Lgu3?6e{^9${>)*Nzcapn-y!jT%cHY} zsi}+ee;M+>ZW#ZU9aksM$pI50jNX#<0{^CK(*7C#)!4&A)`M9CFR-zpO9TxvYPF}Q zq`hRj>9v78{W8GLPiDyVaYL(ZEHlbIA+6{TCik(~uJ-V9{AY&PJTj#!^$Cu2&)}fx z;@#>!N=>mhg$o&Jijq!p7crDPpqTqg6^So@O776Ojv~DwH2*Q&3Xx3o9^jrKSUp&# zwVX6Q`aP}bnCxiw$NZy|5$jaX|M~1p1X|<84R1x=Pe)F*K{QDRqTIj5Wj~!L@7N*J zl8J1o_RTUsM>C3N)S2b@7YiYlIL2NAg*+u}c^nT%rE~++4bIWmuY_VXG;j-T(gC*) zj_NK(P8QJ*BwvjDs}Yco9ee~BKG~ zVgcP;fqz73ev%dJT)mqO9*0-4C=&$~&JHN1!qRAZps+vJx26}C$R^SpA}t8*Q-IZ{ z`SU(?v0ZsAX^#Q~P>}9G<6uAC{^+~&=tA%=7N-KxmTW};7I(4V7L^U)weN=lQc))^ zDp}<%HDh+Lj~V|7-yFygxK>r5x$7vLN)V=|gh4e8!^QFg>Pm3&o5L#>N6ctF*U^k_ zb_cTSg4FtKWrpD!`=}p_wB>3VR^YYqQs5JdV?QMD7DqJitc_S%1^rhDqrp~8W^y&f zse9phNoFkQ35`%QE$6RS0*i!@;kR}a-SXeHs`2pbB1onM9 z_U-8r3qIa0su699UHv#Cl1Ts&ZTzT2;2=m*ZVPQoD(s{Qq(Yx1v+`NFMqpoAw3A|* z<&9``<@13@*WClbTn`moB}>gEO;3%V#x+A&^;YJ3F6?3v>-!T<|814q=-1PvJDJ|$ znyU)g7T2>?em4h&aozT4hq`#Q4ff8eYO@6Sr^|)_H^$kp`?a!f3BRuXy^j9sz^$R0 z=#!hamua?5k1U3LPd6MAJw%bL+SqShByj#a=(REgowQP+Cd}Na{otu?)K=2h2V9nJ zh|Rp+DYQlTII&KbJZ{hu>9l#^GaZ9pwCEq80O{n*GU+oaGGDc?$cJhLei!OTFyCCC4ec-p-9~4+vf7@OzlFoH z+qpW1ahnXo2?`^q>YbUxA@`u+F&xZDAXf*SB3%2VU z`9DcQ@h_-`mcQu$Gf)5k?Ejx6xY^o>{97Iv>HhX(R0jUB%pUl4ev6BObP&fRRzX#6 zfwh7yxFI)+R$)byD4H=V(}jeLk;DHwj8x>Z!9+tcI!ARqlmy zCG|#3bumwi{Qia@sVl0fy}rxDJ2a%IK?>S~JFn8Oc;-&k%?H#sNkNv9>Xy{GdeK(o z&XJhQZG$%4XIZ_8cZ=|2B-7C{pG8HPI1aUQI;8{Wnv4l%zdf?YjxkN9V;R8LZbo{p z!=`g0NwFP%^I^s0(}03{4cdlj57tJ$?pkYg2^}49p@0 zAjBdRXOEz<81w<;C@)0QGyYwqfWpsQD4NzisC&C_SQ~;hF`Q+-Dk8AEgFjt z6Gs|R8xPqhC2UzpBR+C}(i_%7?Ss45t8u8p`LBO^tDVukRf~Gi}&>j^G2FyQ; zB?i-X=+fM?MOWTyT2e{It`81%)%h;4)-0+C$ajv=ek;@qh|3E2H1$CW9$`ryLbb-K ztx{C3Wd(T)U>0Ncy8%^nT3ZMUW41MT7ZQo}FK%B^JkC><0dl3S+GHziDsE-hE&|~+ z3Qi_LV7~I1c%a{6-8aD z>1YbW@h`C&@vp+C{E=NV%;Va4No+k>tU&T{k7&?jGMZ{agdQr_o|)rYG#M_Hf!`OM|3N-4#k^X8ZqChUrgcF|U3|IJ7-DU0Lh2|1($7}1PTNpITGz1B?R z0g2q#K9yz&)i>S5b1&UKjjq)&E$pvmP(-pSqkC%=iCW~LQL=c(RSDThYAf4ui zDOxta++UbaaE4Ljv_sJ$`bGyKlAOg9rMX zudDXN%1;LTPdtmvFFQ;9Xpai$b=^YYv%u%c zxZRjQB4I?cHpKuUK>nuK4@pg4=944y1d)&JC7EJZrA@Y5(5B3fE>a*lq$nzggzKy4 zTf@V=j(@Vu;$A8DHuYyKP*1kuRvVHl2xX5#Fb?e;x~yiX$2xem*R)ycG6D1?`ds0O z$AKlR7GFg>+Drr4nVf6B3$vltxhYpO_xMTc8q+*F#&@|;Bq(jIlwuCy5zi~09ohV2 zIPR&|ZMY2!kYj%{)oA#A%$NJz^R**1XPcu~SJzn9KZR*9W}w%3r`H_Atqy9*tn4=psy~hF=Mfm2OGNH_7atL@t=KA{`t+7oN$xr~-MT zH^shkv!srt{$7{59_QDl3^X*6s#vBPPM>UFcu6r$NDhYm2vCt)}a2h!4%J zXB0W1mk1{mJFCOZbAiA(?P`11nf(!VFOU^kP6mL$ykqCwVb+^>>8~}H&hxD@xT>vc zm~bSPslNr1)Fg3MwC+BiB+jMQsD=VbYM5{&7Om<`;bBPgs0NZx0{=U3a`QkVbhFyz zUm^dBZB6r8#amCURSg4{)H3BrC|xnLfpnU8Ta~%8;-|IAf`MdBPatek{e>^zS=p{ps&FVSxz=`W1a$t^S>T0=sp)$A~< zHzd$HftV_7b)yOiooFFrM7CL@tK6Cwo3Sf3ed;@4ADEAMWQ6O5v3!e3jTZPBXhyy!SP;*NmJ3O!GmWU# zfj3m^f8IOg%(Bq8rVRU+7J0VJ^mEO#a1zco*lgEl)`#IICPBx*mV~D5et`wK4K;gY z?cm^e=pdeTcXy1*Hz;;_Mc@cxjOov(|8Ut4f~y3H1wUnLmWS0qXuOWFT7NkM7xR_E zv(+N81E~l{r4R%IXYk%~0yv=z2L5Gf!wCRff&;)!Uj4v(IB(F6xeh=I`B*24ZBQHWNRSH!(GAO1jg2Y&fNa(&Aby+E$!e?jDrPhqa=YNOUjx(`mg+F<?=`9bDNnWDqSl=IH2f6(ZA+dMw{7EK z#eH-6o0o$z6*z1eso16apIKTj9S$LmWok%(^oIrhKyjm0_t%x2QGd!;wgCm!Cx0s3 zV?qJy!8Pbeawdk{nnDaVwgTh9b);%2jV(NN_RAMYdBZ^b+IpEsKo~TbE$Ie;g3&>r z-~k|YXG*k$x_XJ`LXG-IS4Om7cCn#i(*}ZOZj}1-#iIwNw-A%Ne8u8S_C`mbP-wrS zM+&_}{HF{A)9L^AhO=V_g6Q<4M4uuM^AdRxI#8l75S6XKpr@~us>R~j$V^bC5L0|# z^6?m(jE+bxs%X$wi0!NH<_HTXa>>l_PL=?Do7OVVvp-P6(jZNUkV}OB* zsV#qLdR69^ag2S;sgn+iQ|BU%aMML&Z8A*UKNTzl;|pIV+b@VFm8^5eW}^eK6a%Wq zqrr`aIG2`X#&Gu>9=SovFk`WwLv3 z9s4*)0i3HTGPL&^85aP_@IUW&ffTPtB&hNoltln#H7j(i>t^tB7v>4uZhz7qyl?0m zK1`ml_r$8v2mOOFC0O=+9-@(A@Ji_n@J6KJo`14E6`wfpY=I9x5ZOf!fjNk|7QnO9 zl55OW@q3|{5XAd4)WpzHoX+mjE)%@5ll|MM+}jwHjBVu?EOZ&RrFgC*u1ampw(MfTC(F#F;0xv@c21%hwg5=?@h>b znPVpc@(skS$lO+d-4F!sLR5p*>GkQI` zraEARu;`F@`hkTc2ol=&(z*m7kTmd;ep~*8oTlI9T-09JjWHXWgEql8Agwv-&T>Aj zsOzq{TAg1j?=i=DqI4O~v(zY!uz2i;;IeaAWqw@8Zh$UDfI@RkLj&)!%z4=K?z|t7 zr^yYTNp2tNV9X;7%QlgV_&4ap<>0+&>Og()2uQNW_>kQ(b5V_bMKs0P9C@2|DP>T9 zOv6r#3>mRR#?^1R;`X9(0q21eDIz(>L%!m_Z2MI==eUtAu0^gxzE^%ubhM|XSoo@4 zXZrVEiWuU!iB3R%IUQ_1>9I}53i11zC&j(fcrl&L2|42DaJ%rTXHVQ@hTYQG;ei?s z!|}$9SEw4tIb!{u8}(;BW$3cAbV|=CV$~IQB4Smm!MQh1FHfy#v=1v(UF*D((R>P< zJZWYMqSnG`&nbNyk$TS%wOUXo{ZKO1XVR8V8t6(4v>a^9h-X|ciZsYLUR4?crLPzh z8}5>I?r3f2mw#)VG1v7&IyDilAL6}n6n9u}lR31+c=v|;^U5ZR4eyC6BavwpZulCK zXXR@t4(A-=J+0mmei47dpuLxzMmT7rxivF284k z7^q1(BbVg45+g(yFB&$TB_oVELiCKImnuBL`02rdtSdT9Q;E z70KF)v_%DSQHPz(8NfgiJV6c~Fie9@EK^Wn#h5t*{7(f^u~ejPrW#}#*g5241))W; zZDOe{EdgdUvsW>pvk)JGDl*#wkK~z&JpZpWGE$J^IUP&8TD1(~L3yysl6A?T#UyvK zYdnFxX78v}uvk`7wy0LMQEh9x3r%y%gQWaXZzmBH zVp=g00g6wm7zm$Rvqi1jFEl49MAHm78VMe)Leh#W_f)9GR@6c#rySzEp=z&bB7 zYmUYVoi0J~N-MhL1R$k0X@i{*-*PGuNeYVg8(&V%)T4*?Q4nid(ch7Qv2eVh?=fu6 zt3rktz;~VrT)ix-8jla|6c$Xr*{mS) zi+X2u_j^*$yQybSug{r!_u$T-OfXBYsAeplf90m5A<#WDIActgJqomE6BlRtS2{nV zxs2Iv=p(j-j#OXxk<>YTf)HhnFqXu*dFRMS=ZO56#aj#ASMchKIPDiy67kcQPTN;j z>$AM=wRpn8FDkxtB1v_BHLF^RTZt22{S5DKREb=hdsd0S6h8s0Vv))`G;Ssya(g5c zzv|-OoC5^Rb-l0^#9Q4zztdB5ruHc5=~xYhqHizwK2;@u-jGQmckXz=^-9m9^3wz0 z>C1yed_3-PX>%_XvGf#nObEU~&ttlc@U2>Smbkj}7m`uKPJh(&;OToaBlXvO-@;el zwNu?i6(nrve`>i!$H^o7q>ptGJ$NH$=?MTEN}SSLA@w1=0g-vpVyd_CFTs!6F_B+7 z4w>v*#)xnv?#>8bhKx_HA$Qx{f?@}K-bn=s$`r%)R@f6MC;UWtQcC9f3KEM4Qnzum z-vOma_4AO2h$mbJ`4+@&lNqJR=c*d?sg3$N9L*=cH#@#J!NFybpWE15XENeTPgzqm z>1o=Dy`x~YIve6;SC6(#U)+lBN7;1_$%4o1)O9z_&Pp!aR(d}5t2-NRqx2j{d{3Vt z-yUA-&e1<>K4tutF27< zy0cQWACc@iVvN{nAFZA3O|3mYzSnJ)!y$W@bRCHoxH;Onmv%L^zdv)jnpW3)6dRnN z?lAaosQHf~g&VsRznj8})K()|*ljzwJrg zPD%NQ$?4#i^OXT)auLy5Qzv^?a;{g7pWoTOZ-2c`cW>|AF+i?ChE$2;f>v0jQ)Wm= zjdm}B73_vw_R7smD4IU7Rbdn#%-zySistFfB@IQIOn@sQ&yE-3@vq0*Rl{NXg z4dd6Jjl&uZ9qMB0f)pwu`BkSt?9|IMj(Ku1z=0A)T&Tmh!EwY{Qj=!8xeX!Ikx#(K zz@G0M8qKp0j*BiU>5*7uelZ{+I)l#oC;qUA1h%cZXPKn}HMY|e>V#M}Wm_Z?jW3vy zLjsYjgTv%dALirn8_jBZ)euluDFq-Cewo7i{We7iTo>q1epDM4@1Z4dt$P;Q&Sb!Q zcmcB;z9$PXHs|UNE0GX0-z)bezG>hq8*f#uAPUPj9Lg{uIJ~3=jxjeN04m85Tjq*Y zyzP)jWFD@6Bvud0kqw3gIg>+lG+Bz*T_c=Ss7Fv|%RD)p9MFcdD}v~StS{m-+LPhn zor?vPsqY`C$My(5j;~kFU*{SDzJmi*4#nYlE1b8d{oOi2LNCQ&>idu4<-U`>6r1S0;nQDV5=kTD;z1Xb+R?6G_b z8&1=eVy!Jn>*sGa_f{TTztttJ#+JBuKU1@4ZZ;7G! z(LeG-^lS4u6$*dg$l_HC11ZmqLJ-I2_iRbT(a1#kJz6$UibXVAl4f%DOGUWp^6QOV5 zoZa6pTs3lE8gFr#Q>gh`h#%RFXZR)LQehaB$D#}M=`_uqK5aqHPGkg4d&VyR z+o@~Yz)3^dx3p=YQ+e)BPkz&L9e|3>!F#OVJpAf63P9`_!(vSI&C+daColh)RsPlD zLD$;ZN)?#iAN{@k?fc`oerko2y{&$DFhY@qzx}WmT1Lxdp?`+M;MwkCrOHlOVY-1t zQ%J(G&!X^`hgK}s5-5w*tMAfoVX<1aJp+TRG}P0tj3$v9YF3S0(o28=BnU)U3G6)J}O-~KG8MnP;2NHnE&2SDywB>CX*$xY}q z@5m2SRSD+ud%Hc{olgwu%j5BKdA>UDwmF%u>k3ZDw0XY`sr&oBbo@D`-|O@FbX|S2 zE82MwL+wJjw^wy^TeSc^i{UR47#^obnG@WDpy52EigpnW0 zk5^)E#u$UZNTUGKOI!Ov#1ycW7P0A|YZG?o21R8Itf#ll+Kwl3E`%UGr(U!UaKkLt zMbiSdUwI`RedmxkeU(!Njq8qFK&-t-C=~zIk`Q4-0-tuSG4|9EAT!5cD(4@>*|wo0Z`iH1SQj+7 zzSJw9-ViAR%Gvz3EgW+`j>io{j51e~Es1o#F8@lHLg8e`U>JPM{0BDiB>_CeM)t)v zDApy97Nku;$5l!+aGX4PIcaL@SH|sOk{qHM74W9LgqKVb^V3&Kv2k${m>V9YF9Yg1S|~w)XDUdU^_oV+eaVzjqUBj+mvg;Ji+dWmTt}V zVGZ;PWx=BW4dw2k)%C2QUM5VwqAk_(tW!^7mbgQPJu=KTjp*d4WX5Yu#2JB*v&O#q z3Y*KQ^BVKbG-kMKpOqT6kV6978;uDxnF9fD%x5BfYoJn|KLR6 zvD(&C&lL_pt4hQ{B@tA~?|W<`%!DJ+s! zM+QkVQ_MWb=}HBDcD8w~wx|@W7ZXZVTS5MUMQ^;0G$LmSEXzV_5ZSEb7VHIIc5LiI z_qCki9(?*ej#c;+D19L_2M=~Mi}&w6G0hW7bl%}2ntdr3Cf10^{t98qZMWmQwG{#6 z62d6$7OD&9}D1;NmRF(IrYeXx?kB=ol9_XsA5P(5DI}fA9Kc6KIJSK^9Io zF_*+$5d|Z^A}U}GLYz4NN=+7WkXhz6A+_bbib%?I-7f*f6@}HfGajM0n8IjJFmNVK}YL`-~uNOn%-+$3}6Xfx@kK!Q+s$LO74^J5+s_zz;JptBD^dizL7D8>FnAGas zci`S#e-d6IwRD@_-KkE=`X$%1eE;Rua;r|=V|NWGLqil*<@dZ`3IML?lHu>Ac#WN> zf3Tvt70MVrCF83{NqunfN4ll;>rb?>fXfYdi(u961z3q%4>N^lk6qI;RIptIdPwYU zKKlF2>VDuQ4rTpXMY!I)eOizeMp}11(K)+zNtk+-Yqwb0#tRqxgDFf5PjWmD8iL-4 z^^5&~{M^UviGB_G=b%#o008md9_D6bsNiI8Woqm~XJl!2r33AwGSZRf?8dIi2FOMz zbhIKI1odmo4oOJCD0zkq1QZDpq|PW=*6ATY)@@@)VA+a2P_3D-U(4pUhNruxq(-Y= z&AQHL-)hR%R#aR2@mcLExwqEB+WPiZ{pGullevpL3pT`|<@(F@E|2*mC&ONE&*#q! zyED(X(CWljxLNOP(je;e;BKs}ktJDY5Jw<5xiJ+{h`VvaFB0PS_&fJyV1Gf~Ym9E3 zeyDW-tUoRWNDR0R0GI+~44A)wWI(e8&=O!}faw4v(9HHZ@y9{wK+J%e0yg?_4Cw9v z1%OWgJq7q2636`;Jidh!c0cemhJaqt2Q-!&`FMn{z#hL}hg>9Ls!1nCG6n}Gzc3qM z>8a63qVx=lZOri0eC0^vWNgC4l8%$7OQAkWv5zMoW-M15?N)~dZFs#1huIp~cJZ@D zb&E1&R4r!bbqc&<*bi}8HV`rudgJ^NPjVILWdz??_)YO+!Xal?N>nUC7Egxf&qyY{(5avYtO9TKFAW#5D4tSriN~lMg zU^HM-fTaVV3@9Bi9XRV@%0VO^`5;sPNxbp$!R~-s1aRwd%E8qD)Pd9isRLE}t?~ga zKx)BO0c88N3~=XRs=;dkzaiVv+Tqp#bl`m;EC96t@#n#sfpG)iT!3^1*yn+5KqQDN za(XG*i+8~P0u#GH^IM({)O!5aMm@KKJ6V*_V zMBYVV3tusV8Nt;J36N76EgBo^e#175$D$KPd-df(D?q2R*06NS8_LdlTtM*E|ELG`q0Zw-Ad>k$vrjv@BQ-6}o3XPk|8B_3vZ9ZA?!i0#a% zw`#0g-*?IoJlwRE1B#Jn95b?#y1MT2Q(=7{2Ul|;K|VD%UPz8NbVB-DOrLn$%!eWYsJb z12O!ivE@wtv)H}e+IIfp*^<0mmYp9foJVRdP3QIbepN^7(y;FFsOgEfk{mXm!KHN0 zyl92IW*&xXAtQrTe}CEZF;_mfY#XLmoJfAtj8n2Gq{MV$5K7p?(QKb6bsoFjur64M z%rWlUgwuB9BT|<%JUr_y^v(>$XEHaQpdlr%DX*z49fuq_^RAo$uWSQ6og;T|j~HeN zDN`#)L&C?CPHBzYwNvus61pfKi^tY8-=7! zxKurx>2g-PA+!N!wo8$6UEd^0rERS-=aELO-6c=8mD8!xn%7pBI*A4u+GxsGU_)!= zx0+vIvt-9YxrL@tD2uTu#xvo^x3(Wbvg9OjvG8ln{8T{epq&AH`Z)QTFY#e!kvsR3 zj)W*HbC6175w||`tG=7O5xD3%If?vd++#~WsQGf(Y-8K6P(J?)>do3B72E#JulTFf z;VN{sCz)Z|jy2`9?3N&+Pw6Y2vQAu~QQ^jK zW-HNNVzSKw4)V~R45GdT=nB@&A9^a|t_|bS=a^P!WT-=Y|AzxbiI@)8Whs;0{2rFt zOvjJd=e%&j1oAr?gpWDy`l!5+Q$i6vagZUutb3Zsj`gI{ZU4=VFSf*92co5oYt|t+ z9^jw*E$b)Aua|G>Q@-5>==vX;!)q#c30x-T-k)qrx3arKGNWgYP7#`Ww%W*L(^w;p zWz)4`!gIv$wd30#Qk=Jt0f-&|WGi1TQ@`TT^cz$Opcq7J`@0P*;^0 zAA$MFGvb=sZTh8b2X9{_oma{mXs+6UHu&~g$<`XgOXJUI8xxo;;M9y8Sswv)8Slmz zN;|gizGR%-0nLx!D3b@)&A;M04m`DZ=7xvpJV?skuso~|c9>eEd?P%UnO3S+1Iah8 zR9D@Nha&KiG06+aGV_rw*IDS2ZiL=}Oa0OxbMkLx1na~7B)&-zeZq9fy>zuv6{$vKI?pYj(p5^RM6-(Rpk z`9#n85TYks1m`LGICW9_{1b<7mGc$-EKC~pvWMdb=aOD?1h6LQS=c9ahmK!=?USF1 zr?w<6S=uQjJSr3YuqfJli9ZqlFoC|yIvHu82U&QLck+KHcqW}cyhtKLlOM3$mW(mD z;x)QkHZXlkQND;C6F-ZRIy_Kq7=0X#GUKnBQPRwj5S2K`%V~oBI7D6TpQG^TI_6HM zAQsQ6Z0khEh?$}-_1c=q=Wfw&Rvb5W3vzcy4mQUuZUoj#6}gq(=Z@ePYfj{vH$xko zumro2!uQJdR^c^kH#LxNh+87$P2nA4(NgltkxjmFAjp%?;>uy3J05tDdW#>GaMS<{ zo0DCALJ`ARRvNECyrXck50t%LKSh7_H1OLP+ZZFeO zpEZkf0dh$u7be*4&~7WOHMP~mj^DMWvOI37Y0>YtDs}C(Cc&+(Gr8h*3Hc(GRb#il z6J766dk-S^LN0S_HQx0?-I6t7BY1gpb7^&Ud3!s)zavae8_64G&_uzAG&*=!@{zxU>Rko87^rSbc zQheZ9E!P{IJUqs{Jz*ryi}ek2X1lm!nxs+J2P^?Lc7)A^e8+lH?Y32sug4GSg}k*K zBfk7&tNc~|{m_=!myuPLLK5KfSe!^UHHhKZh2c%NWl|HdM-x74W8kyjmLsKn{kR_( z7IZc|Qn;!57K9ZgI1myFHr?Qyoa(oB*hV{M*H$Dy$bnA`SoEm^d?epABnk}9z^_N> zg>YMwU$*h#7_>ZVPP-rp6#Ee6P3!{znpy`cwMGP zKEVeXQ_rVhG~aChmj!t&I_R+H1c#ihM~z92jhkXKVCd3FogG#(TR z7v5HuZrQ`W{PgNNqlvqkxz6jW3o1vuyjC);cX(;6>lL_K`|&kvme;5M#P%VyfTyot zEO4pF6FeEL>s2nWWsz6SRUMnE<;rko&U@V}A)jAIak0Yf`}G~sn8^B0w6i&Kw{5>( zx!s$zqgQluTi<%raPAtYPzTSdiMy_qe_X+F&72YdMw`&4ps9mm2#ole-CTM@r5hiD zepKR_&dhnOxjR@$wo})3Du#pgnPLn5@UEV2ZfcW-W=k=@Xd_zPT4y{Eu!mi5f35x6 z@D@kLYlQvoVd@oEL|Fc!Y2&@&swM1Cvi>6=@@CPyRj}?|ILEoOx!J#eRmd86w(6iL zo8M=@rP?}Bfo-3qg?#t&!uBFN+4)p4NmxVnZsYMCg!eo=SXf{jhpNoAv9$WQRcdA3 z<=SF@793lU+Z$mv|RsIzIggW~;#rhNk1YWgRP0hvoyz&mPYwrR>$s32|pHEZW zWEn^Jac9R>hi5Nw0y;K{&qN|E4A=VC9ljw0aoM5uOp(Suzxuc#Tvtw?O zgZYt{M6tPF-iNZG7aj#xDGb1*B=2QVFRCQBhSpfj7oRDiR@)_fqt@az46mdQEmY@M zOWkdLZ(#Rqn+a5@idzV`3pV3^bc;&(<5-KmX85<3IWOuF>AanBDL1sC7ZSFm&q&8^ z+FIT2k=E&2exqFeQB#9lmn?27ytw#9bg3eDe0*+8i#N@NVt*g0&5u`ME+a-uiz&^}^=N*=yfb?k@7b%fJ5<*n?o~&q`6^3>=Tg4%&d&7d zPIa*-fvKmg>K%CEAGj@&U+gTa&b6GTvRQ)FpP@$Fb`?FTCv3d26%DqMhY96y6I`63wb z(YO*OSCeOW*^a=?pj}_A?W*picKa)LSuTfFFgN;(jacx96HksL7f3nVf!J;Zf6jz9 zxALstKb6*8cEWsB#ERAdzs;Gn#>w6bb{Ss#3aG7WfUvb}&h3?s#r9OoZ=MKycsr zY2+asofAAy@~(>;bBCD&w6R#C_eL!Vz2bs#jmTaC7B40CLR3(iGn(W&?U$nc zNOPW>)x$Sd45=@KAX`a^yQdI)w4uFl1$z_?B(DO;q8w0q3lwC})0Hf{N029yr?WjR`&?TP)1O?< zoG?Bn6S3el>!B}TTqc2+n;Bw>Hdo|bUb2p94QR;1eqZpk1){IBMp7Gqq_y&=_f1f6BEonP~2$U!nhoA zw4&%+p823>s8tNES|5BWG|_pj=9(?uIi&_JiZz62mr+fJ!uK z`DA6oYiiB5f&{mG*a5f(kNCAt!49oAzIA)Tbl(@QuhuUEZz=M@nc4byBk|$4HQG0F zKL?Jt(s^%xR%VI2dY?c!P1RcDK8EUubJfB7`h4e%*U~;E7x6JBeRmyCqt4|Y>DnpQ zS32|-&(DK=L_5k+si8G94}b>JG`Rt8-5!<5n@rfeD}Nr5$(uCSULHH9;gB0Yzw6RePW7crHxTs2fxGv+0eb@dRnMIx9O%OA2c3L}hKIov$-XQDLht)44N( z*V)5>u%DjCf1791%;3ejfPB7_Yfd)VrWMs7O(%HA!zu(E{*dS5i1{2qp zxIydO-5sCy2GL}+Cq#byDl_BK^di&wKDxJ`a%#kcr&X{Z!?g21e@d788UMs5s#|e* z#rMqE1d{*hM4#sav-eN`wjzUSP8!Pl{PJ2+&z5O;Zss~~SO^yfBPQ>=yZ5(CMAlb= z;^)sHOep%PVKtcAU+6o#q=>%v3d3#cPj@uu#f8)PfaoEb`&{KqNBV;TurcBQi=o?%X72kC| z@M#!XY8*kg`h5zUnEXQAbET^I5i7pHCKo*-Vr0a72@5kJ!9@Q#QnAjtXlOzGzNvxr z;NXB7J)?fEHAIR5GdQcN9E69W9oLi(Oc{uA4>W?uBy8dYX2xO#?Z7zfC zUs3IW5na?#Wo(2zN@Vh66EYrsU+_EN#iQ zYY;P+mexBda|V6bTeH;bm}!MEhq9oY@V9z7x)CBfOdiFKat@6Ay66S)bfbkZFW*MQ zK~`*|k`7VpT!WVNFX5a*lf!6OH9u!R$wX>=H@yZzr*;^a1xWNEFbjCl!9clRc|PxG zhUiE%wUGM}(NCg-Bd&z+DkjvD0{>4t=iv@V+qQ8eI?;)U5}jBzh%QR>5?z*Eq9kgt z+KLdpiyoa2CAzRyCweD{5;cgj(K|uDeLT|CTIhc%xXhKbrGwcG4FWEMz`mIQ^tivg4RF;8c&W;?gn^d0Vo>2HV+-ZHz%spAw+MeYAOS(n9ipJ za_5MRZ(3+e(3h8487joL3UKf5OH&xMeh<=LkbR@pTg>I=P723M-T%1aK;L*|)cYkc zzPXHlua24pR%+QtHxQ`ZkzL({sM(`9oHt4hox+P85Zmsq+Z8`lk?09XH-04hoJ&fy z_mfV1slHt%k1#mRFaz{K^gO`OO;=(s%}`{#X@A3Ttre1~Tl-dTVx1$D#RJ;;)Zph( zt6#;&A*s-3ucxi4KC6(z;khAEtg`i5B!U;&kP;zkh2bn(LG}>{@+&~ZSNI{d8 z)Xb0Rley|_7E|(_RlMBKtKQY_)J@bzEQqKxW-wg~AZyl4(#lm+G)Yn^3>@wiiC zVpp!la6!q%tz&VUHf4D;uk?rRi164r=m1&ruW~p5I;?JKKo3-C?usd+H7(8RDo@Z* z-Vkz}b*+2emNpK}-Qz^!Qj!{6^4D%axZ`P+@84Qvp%;e9J84ZUlW;f|x9L#bEtK?& z>QkwfR85V@XT&lc#U}OT?ZL(wLkB7%W zA528}jjTGtgvwRJv%Z1^sQRT|P+4Gha(xke$QCTp8qV?{;bqsog%7rdw2;Ztl;Mrr z73=Yxa~x+G-z`NlE<_@Y>ZL%j;*EjPEWNW9G0Ae1fq64Vha}pye%U>g8(QDwFZlYn zqivmTG+k#eAb!f)2@tcIW-CB1or$)cY zS%vo`ChJay&5#L)aj#QkNUr5jNH5_6m`5Byo9ZpxlM7xji+l8KI?M@lZw5b~KVH^O zIx*{ujLwY`+7P<#O#bdgUbIA@cx^*t2`zT0^p{ zZPS{bFS~xUXhFyiJ;I;KMPw3ilN|0C&muRnjLJCK$8HIC1i_AqboLd&!MJTwLvNkd zyvsk4NOh6$TUai~z$!MDVcM^g=6YN^blH!-9cIH82x+PIGRwpk?s0tO1SWBWSXtHt zo!=tT%GU_zi;a;|k6(*zdL6&N^cu(_(JQ7kj$g~UmEGn>&%|~ios}zYNjKw_c;x&c zlo-ws6O(rgb-k-VumBKd-5H>qCLL36MIo z-iox3q{4$*fr@QEpJR}%Zs`~fz<&0N_Z?0ra%)?CVL6|(_P1~Y&1sfw>n+dd01?~( zppl;bDmS1MPz2Ok<}BKd18_UXC%7ZTKhN$CBfg~Uv5M9E9A1DLc(klaTz1+Ij^`-1 zO_WV1vY2M6KNpk3($|}R5=j5=ku&|TiTI&Hy`yf0nFA$vDr5ywXPT6_#O5Q32e*0WU8$PPL z>N-A3p*NZkPg!g9nVWpUwT4oE&J$XZcjyG!dL^J=bew5`Eeqk%tHrB4_7;q#efX0_ zTYgTL8^AM!LqVZ}U%AVof>+rc(o6hPLF=4IXiI_UjOULJ?0R$sVNZ~S;10+lMG_>A z#r(M$@@bs|gvac;lf^$Uv;R?8kWJ?wGo{kXd$WBG^Jh>L8|GAHT{WPRwichArmKj` z6Tcf?Jdw*1Qg?QgJEJE??x{L(;w7@e^wHr>&a-REY&8VsTOK!kmTDB2INNx3M%T>V z5ytxF)c6x`Jy z+?vE<37$~ztX8X<$1Zo>a@L}OPZihM>GRooWz-Ko9n{rji~d$}f1aH<)d{n2i8GmN zp?e)GVhcpyu}WebvC!@!eJju@iDSgl{-{w^dU`9HZ;Ba1Ezaj2Lz6{V>6hEHXg;=* z9?u|JvtP0u#oHhC?qNrcyVO5ehrJ)qE51-TIi2)OI&z4n6*yB_7b^y>A3e*HJ-7FB z$B@(A+>;{xi$U<8v!Qr~MYW@lfk}?sO8jeJnmRcAFD{V*`OlJyBuY(5{{@*lCK{XV z7Oj-gtpxdJ#$C&gCS8RZyk4XjD1iwi`h(}n0lwNE2s=qo!(QKda@b5&x2Wop8T+Vb zLLq@)SPoH&j6~6M^`^q`n=-g+1P1vMF|}oE;6DC#O0pO4RJkxH3M}oZ9>*3s;@^vP zjZ&u=p)?q-{8V00-}-$ORCUuJCwFByrRpY*-9Co2d6+wjm%Mu_?Dgh{yo9F*o2^N9N+`lXZs2t zry2KGfW8{$YMo&>XglMgy<@MXzhB42c~K_g5+#0}vKb`ADmz`-)_oDVmSio*nk~;u z8RSrq)^U-NMudSI8PM<%hcUve4Yq={rVsOP`^k{55rQ2U?bZgxbUjF8y9hxi>&nV7 z2s*GpfFYZn?zus(w52{f=aHTA6$N)pIr5~YPc(VqPA#MRtonlfgb7>8gAo_!^qm^^ zD=QUeHrzy_@2Sss(l(H&ls`lX{ncAAkJ~Oql|0{}Zqtx(P zc!>j!eBE#=;P1J0-dTNArkFvX%ZLgEoW(H*&(7jharar8G(z{5`Q#5qL&b+qW^ZBj za$);EoTw6}^_zkj+WH(ftM$eUcFhOS6*x)Wy{?~?P%q3ZdUH@ZkawN^KqhNhvf^6u z{Tg5%G`RSCKKo~6C2g&R2 zE|1+57a^jpEX9rIrlJiwo_{=5-IVuXE66F0_;mjQVVq5$Aj^JvE?56QbJ1q;pP7pk z${1BFVuo9+5fy5wg8ufj24X`W5-pJbQ+Z5Bd`F#QuZ)M!;oFz&IYYxTTkwsvgkjbO z@wT;*3*41A>mu1<0K;zeX{{=g2U&|Xo{;6fRDq0vBBNP|?KjE;&#)Q_n8A>4KrNO4 zzzv>dFKlyyq39-dlJ&^@D$W#b8t^9+-BW1yVbrGfn4y`9Q7(})g>(It#Vmad{{k5MoAvOdNoL^3nUzC>RC@; zJPrNm!Cji4!x+vW^iY#8d8K7ZE)4zIeXNC!?XPlE2`i9Pkaay8B`b~%mk&^N@zmJb zpsmC;Sb?CdO%PEAY_oUx01y`{{Z2lc__c0*?l|4Nej#xc!95>wfW{=AEF%<)wf85*rp(6feYv&pLtEC?k+Xlhx zgkIq$SO!&hduAg7#k_Etf&1>5%=(I3cfzBHPfwQQ0A#(xZjXc7@m`Q#cV4qep6r;$Ldus6&5|+lWV3sU%vv&-HA(w zw~42)@OQ8kUyg=OhncS7xVQ%wvfUyex(KbLqiYl=1xKvx0>e*TbcCd}ai-|bZ)xBG z=neKG@@-#re8>6jiA8E)D=!APRr1VCLAnEq7B0i@a7_(oAZ1(nK9j?n4h%QkfsRK@ zpwpk%H@P$t#EbkhydzbZre9Q+_>I5Sy#E#LTy~VMiL#W}Ui7O#63knscstu{UtHsu zVKW4c=m*vdHfO~9BRQoDUa-anF4d~4B3S{g^|Wfyd5*xCSA~$9`U|#0gF@X$rWXf~ zjr-39QrC>ve2duDsI>Gdl)8#KB)&ai9ef<)I*ti-!%TM(R0-G(x9GpQB-_nU;VHhG zMcs|3G#YMBD{-5-@H+IiQVh(UJBC7j135HroY=mB-LbJ(QP(v=gjv)39&=s{˺ zcw2(L@%1*uj8H}WFq&NGQJ+GweDQII=%hE>y5onRUhERojgSQi2|q5C=f^NyEb2*U zj5PPf)ODvNDH5N0Q3{{iok{7^zGS`fxDw|aSo8+Yg$?%5`dE``57wYK`n=@FspXCc z2^uF?t57gkT7z6l#6h9WK^}k2#ZC7@!3-OFyCMlO;S3&2(o^%rH7RdC03aSdDm+|e zB9`dLoGR-oX?hSKU^`U5tGf4~;bS{y`tm7`LxomDm?ipMOAlT1oTWq|1KqkOt zxltHX2?(Ro_A{`=XpF<;Y0_Hbp+`7XCs(8UF$;WSgfy@>pbsll;KS+qSR6J?AAx(F z1=o1<-)K|Tm;yJ|zVxdq#cm{aLU5rRbp-yykY>24kakt$q2 zM(@0ndU}wvFA`nmwH)XV#4ub*zaK!ln)IWby(IiyiPo@TOlQV-z6<~EaNllMU;3K) z&n%5#;qu3&r?H^yX5_rl@!{=GDo!hJ{Nnq6hm`vctbeFYexJ=+>2BcSWM^> zUy#J1KWGau;73na$G_t*mv@~k3PF~{Xv;;<*IDt-E0NW1yHQPeMu?^fK^CB)J%SK% zh&*+8!^RK#NI^b}2;mahAaYP4oJt{ru;doK$UuWZ{cD%{ zj}AmCI28eP?Vfveqy57D`Ul|Z)uy%#M6)PQlevXsl+h^W=95SoXA=k=>5H=sj34H{ z=_E;+a}Sk;TKKpgju!ddb+!`ls9ln{&4)+`1@R^6=0SZbG_f4-$GxN)j-Z|EEbCGc zEH;c&*P&h+$7@VsE|D`>F32C|9LLPkWZi9385%b;#uC*YB+ybjaIXrz0|R_tB!g8q zkgIR&@}&QWOk&W8NEm^5}ux^0YA}{>Rac4m6cj+CUQkcHavDGfX|SShbd*_ z#+3z7P@me@iHP;=C@b*?ywGcpsSZ#wm$d44ZFyE5I&1mFNy{)aIdzXxaFDvci!7@x zlgMRe^`XKd8M{a0r=GF_7Uz>tO;exsr_J&`w^uijl*Ye%0q7V2Bv18b9QA&gS^E>?$RHjXQ(cy zWTYz>ZX{IjR~Hmc5~>j@bmq$FHj)hbR}1}%ph1 Date: Thu, 2 Apr 2020 14:46:30 -0400 Subject: [PATCH 67/83] Add files via upload --- watchlistGenerator_20200402.xlsm | Bin 0 -> 26270 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 watchlistGenerator_20200402.xlsm diff --git a/watchlistGenerator_20200402.xlsm b/watchlistGenerator_20200402.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..7ea25f28e3e7ad16529b147457756104a80ef1ee GIT binary patch literal 26270 zcmeFXW1D4BvNf8vZQHhORNAhzt)0%Sv~5>b+O}=mwtcI+&pqe8xBDNQcYRnp)|#>R z^Xxez#)vs$D#?O^p#ebvK>+~)5d(z|6R__A0|6yK0s)}{L4oLq+S|F9*|`{~dODan z>oIuP+7K0hfl%cEf&BIVzt{ib8K_9^wZmaX3cXH#L!dP%*GnY$^T&9USUT3Ws0h*U zBEa=_EyY}9=aTna&jJ@%77Wv^cj9~UgCMrFIdci!TFN4*dQhGn8QcRu>Tz8A!|O{Q zfDWE;C(*i-kD(*v$ou|c^wtsW4=(9lAufv6Egjw#pl*at;-RkdEp-;(7y?BXh`d`?&YpW94Srm%{m6+;RE4T69rl@T5Y0AbhNm)1Jsoldb{+ z^+9%g4t)r0%n($lvfQ{%PEJv1AS6EyG94PP3z0`v&Cyf=4j1YC?+*|CoaeSNG%kGA7=%XU95tT@ zyL*rI*jqL@r4%=c8DJwT;G?@#!QNd%8iQaos6|isXnI^_goRY7s1mfpsj>3}t5q3# z0`*o{Q=dP;uTk=j$@jegPoLr07YS$AO6H0=MKawiu{Qk7w8d?&JnKb)8FL({ssk7`u{*fqZ$+G!{2z9`MZr{|gEKi*exp`0Eu3@{0XTaG}>yA7LZUi<@ysBC_tnQtia50DtKX z#K!1CGThB>N<1W0oFGt1zfQo%*!m`4^w|jU(;izzBnlcYX_I?pXzH7zDF6WQ#^$S4J|i~7kFPjtDi++9HO4tk zJS3h5rZzqIVwv5jpFZ>oStCD4*ic?rrX`2T^B(=Q8`y5gvpokmq5I26Zbkzm34d?> zWyya}5{Te03(CJEt)M_aI6zRq9yW~s$`f~cCu?JSd+UEN=>MBDz<+7Gx`Gqgq~rXt2?TnBsi;RtdNoou%p7`Adxg8 zhUzkiPpPE4v)fMq6?hE7%`6vNJYrN%JqMJhx1DQqrneC{FU1wYL#$<-YAfy)TX#~08FEtrx*|Mq;mm06p!5DcU z7c#>gMhN2e&@MJgQ_`drn~DkT5_t&N_!a4Mk)txY90PdV>u)`dVkqVZ@Za|h3FP<$ zrAri{2rprF47i{Ln_#BmXk3a8VkvlY~s`%-a8LSWq(BM5b|^>>rbc}aCXL`E)b7e9iMwCwbTcJ6zu zJ-#>n@=6OTb*H18c0RfI1Cp}qy`_joidGh$nN2P3KAE##lVbX6d0`XNd5ORJwNBXrD5IPV*AbS)I=3{gI~Cp*B_q$bJgA>IFPs*-F~XO+OtEgxvm!>sGGz zHRs)r^V2~~!Ye@@f8rq}k#(v4OU&n!znS$P5S(;vcGUSVD!2blFSLK9ma~PClbNZC zi<70Dx${2&JW1uBJl9EjOZX=%z(!mIs!`n7f^vXNU~0sAlRS=#+!6U*S@#w6-NZBq zel|wBog4sox{plM>(WW=$VXgLW(cJOjVDU3nqwOu-0y#R(IpEApkaz(!gPk)tK;Gu z5!oSgqCOB|=EVFF`XfKYVGpP1*TR&}j>jV_HcqS(c*w}ohzk=}A_iM{kqf;e!<_Fo-K$thD*F-z(B^aV%r!QX1Xp!H!w&{L9fLU)*%k9#oWZY6j^oaPbVj0 zu$s?q1dAE~T?MsT@dRC{-+qlQJE_+sT<41&FH5+cC~$Upv_ zwtuf(D1P(hkN+Jh{!1!Y|C&@&CnNWN1U=(_8ULKlEH&HMbq=^M0mEA zh1r+Af}SOU4D?S;syaMaO4+I+-30W{>q4^9&VIWU9#Cbfc%K)N1no{9L=b)!+m-}$ z1$&gJw4y(UcS^gler&TKq$c4u;YtZ=FMV);#;?cJ#n#2~#MXHzpdzilroPU`eU=#b z%T=L?Xq4=r6jQFL8sMYqKUQ~itLJQDclxhu7y)KLt zOKH0DE#mc4dp3{YX*HrgT+in=ELl?B>2?3#(|) zSjnMhDP(6eitQ#$yPezh_NZuimWz{t*#wer4(=C%-s+-Sjs9I@~v_wwd? zQeMd1obqF}AU6npR%uHKa%&&X`(CjnF=&Y(<~fHLHR*1^00}7m3KjL@2Vd7nR>pk~ zEd%B*=*v((Cmtnj!Pw}G;9@JoVF-rAK*^@jovLruz~YJmA$w6WqEdMYd?h%VQg71l zM_~YgM}XoEITp#txa&~9986#B7X*X3pX&-MMum}6?v;#E$cRGcFo+RjjT+E__RXHQ zXN6h|mCrb0l6zE{`l1edDS_lGXXc5?AoTjh2mb|Q;{HUE=I-Ir)e?p3=)d*^vj&r@ zGi<5#44ihPxQtG02sIHVnu3H%*Ml(-?Lko(%ZqhOl!;Ch`Sg{O$LueluGzQX&gg%H z=urRTk`LT?fayer3zj1qrNh;IXD3?V!W!6q`g5%&C{^8LNGAzp#o*6JfJMSAEmurGR}jNB%ayLL#&| zOb=$X=PY)vLW(rY#a0%wqxCR%#bHxEeA*C)u1xj!_DtiP^{&hdh(^Q zyeDOBQtE(T$`Rmvy(UBBNa0Qo>qGwMk|fgG)X|NQMIgrweQ`2F{Jxjr!kS94rByBx z5*D$t!;<=VQQREG>16e>S%YfklnR4B5bSIa(&cgG5EmGa;y0xU0Nag`GnBzSAN_rC z!9bu+Vr$p^!iPJrc0!sKXcHg%;qN2f@Km0BT5H6fq*ZfIdN zoY4cArfBsgswo|9bGie{HbF$r6%*%$<->dfFRwnX6r(81!r)hy9 ztbHQn4}Hen=o(8(6Von9E3u29#lG`utEE$~oh$0PJdMEH^u{(BaH~Enrt`!)GnroV zrUIs{R_3QKXjx5rrJM+)o&b8=LeL`*CMgrJjw1ZFl4wtHe2J&H^Rcn(gsMLu9Ifwp z9VNlt;L}z$lAg_b=q(0bq8xsma2&@P*^|OUvpdXJ%iRv2hHQ5$tsdVGVNn+)upEEo ztp7lH`xuZ#`_Mo@OR_*f@c)WB52|^8t3u)H?YWERh5l_C z;FlFs)sK9iN0Sy4BB{7Rt*Rs;upUbHAA->3ls^G@llM@BI&acw_T}poTSOaWxw0fT zWV62$h@__+ss%8%R?B1WsJ%Strus9Y`X;gT5d`@jw}~#Z zgvMAtgr!vKDDo$y^G9f+Y@=)ATp4?yz`SsZ9rcQ0L8~3_7m&*S*aQ_VFen zKS+!-De|`{on23_qd)llIN>7YY&>gaRqQ_aT4ItW6si!4ADjhg^hl4_*U%f+`X0^X zM{bS!S)h#v{MfO&1Cyty;=a^b!n%Bkv+%Gp&wLUTlsi?9Samj0;+j;`{-bWNyf6m9 z=|FrXG=Pnux6WddiRG!!$|HlhOA(we+s(>)X}#kQQN`}^PC-?$E=qD%f}@$&)8iN# zvzx*3p}4pE$bPa`5<|0I9tDxmF=jzDT26Lpi7)omR{T)xojfa)pn(lf=IJ`)2u2|F zOj8&@R?UJVbw_gwV$=VvH{WDiLjlFEl_0W5g(TNwg{7 z8+j)sm`K;2d9i$Ff;I8e zK>}S(Wn2ad#G68kXZ0Yxx0IGgE$)rG@F4hXC+p3gEi+$%RN(s}n!M+Ab!68LAt&R|A(e!ZGs+h&;ph7=YoYjo+4)+_n` zsC6w#(FR6sjbGZu5oaJjMruWlW0?6-;`|bi?3ivbekn}CVJ@@W*CNr<4lvn;rAWvFVV3#; zX*Fjind3#i&cXG8>CFUagZ1^;YK{)*#!-{*F&FhHk?DXdNk+g#k-|y8E*rYWB?V}4 zNXhh8z~~|f;FGsqKs)B_uoRKuw?w&$;#&yz?y!X7p___JmFQ*EiI9~CRbY)qDVc^y zNq}o1Cp-pMAdQ|8(MqsX#i5g6|HE$y^`CAZ`bFg3n3lefol@sx#6L_*<;$g2e}18D z4SP<1l+|eweQw~S8cj^!DOWGiu~+t*IgWFzRNhAB{bysfu{3Mzp3$Zx31sF zCsgRp%I*@}KOf`O`_tEY+ferUx|2c!89pCh@JQ>8-^_#XC=UJk6rc8p4{$Aw zHh}3eWm1>_w3kuzgo+b?St1S>gE*>pMe84;fRjtp33LUvUY|ev`I)gxP4}xGJtdsk zzc=uwH#G*)g67J$VGYrOZUp!qEnPw-6$YKJUKIF3Wo_I59LB>0!y;_Nf@a4hzVQ0` z-@eh1d{k#oFNs&J=0Yr%JvQC%yW+prin&Qm-dL)!vY_#hxecNS!(ahmfPp;-+@&3@ z{IM`PAjg=Dx>#MhSQf1}#+M;6$9lk4!6_EwP2;`>ru@gO*#zdC80Tq(n}OJ+<2O`W0K8)+SCQAbzUTvXkDg zvw{{?l-uu`{!ahx29lCzB(SfLgAs&?Y-%!PmwU@721OEds|j0+stm^bwSP?Agi&>Ry27;_f?*})Jlpe94eO-ixZLz<~n~X2` z@!1b4@|-B@#s~8|3IuOJ!~1Ec7!+#t8-##eXEkZt*)PPD$Q$@(bHYof$DWBGGG$#6 zpezFAAAq;=+hdX#htFJJl|SbA8z>#nOTYKh<8E4gyo;q((tju!jL7r9?p-cxT? z`<3xwOVf;j<`Mc($X4Bb`QjWgCjXgFmeb2^oA4>rcl^{d#z^4l@-%UuJL+nRH`Z#7 zz5h3YugGEcJBv&omNrcF7ppgB7Fa4JO+I_h%t?T5qTpZc=-&m9$`flXk-ycTHN}4m zApcO+|4UW+A3f~^C zxxP8Y0%fU5=HU++94ACnYoDq|1O}~3kg$9D1wGBU%d4ihxEVuv3f6mrWKH3!TYAPT zo2~8hCuN)a)O!dSQDm8rO|D#t1zy16BZimDCe8aY`c-@$ij?DoX`1jR)N@SqKKn>g zu+HZKa=M@3I374yc!kMZnN61lL$q}GosRBBQ~;>-9MTtK*V;i7E)3Wlf41xz{qjed z`UR`Ip-gZw5n|}}WgCLQbGC9WA_+8#L#+6W;6-b{Qhv6J)2=Is8=OwE05$qDx#Yf9 zGVR-=9_5W_H!eC}w?Wb$y~aBI3iFE#UQf8o`khw`F2o(;C|(DCP9F5542f;6H9ou- zVBQ-h5=!+D?jdP^KaQ_d6`1<+guC(yyl9uj#8$%!8Ri{Hh7ffSv+c=9bv2V!XwBCc zLw0zHE0`1syHX=S7nx`9`8u(3fW+vAmdsK2znc}AUt%ZASJ6L83WhYt1kr<F?Ae=oK z;kqs!lRP;xWUx+;M#oK!HTPv0vDJGeat6GS1TB@P^qkLyi8tS}mjWMeJ4on*{f(iL z1jCzElU~e)wft3j=~5D5(L5w&P0bA-P^9Tzqr9# zi0KOitaz?i{r4hGF;03qBIp<_ToSVcwgY#iKiVv|*+%P+wnp?uEU;pb)=pXsW27W% z*1J}q_TU)RR!f&98O6pSzre_~ z((YDG%MFP|=m}aO$JCicf+OO+>Z}g*x*tGNw0s&Qt90HL5=|WIbs3^-l4iQ3U0%@0T2U6AA{lk-%Ar5Dq_LQL=)ZPm= zrU!=Frbw1_5k5>n!^qZr!lDrRmrw?W7Cw=1i5oWyhTv835X1&!HmZP&Z+8+uJQlcu zD4Vv7aS*#kVI>XcW)kv!JA%ss_We)f?(+)mB|(4K*J zkAmu$obg59t4S)(e7ZK6ZKrN7lbPBb{Y`slzXiCpo!x{@lX|my6X9gTDQ3yz#p>`n zKPQ{R%66{zk`eOuX;qu>!uob@w)J&IwU66Rx2=r!)?26AcL@HaB!a#VDyj2%z)kv- ze1=UdpMB+U_VN3>^AWYc{pXiYsmYX8{NkO@Xbz+NN;g7lct54N?nKfVn~ryR<QBR?oQ~)IZ!V~k$*L;cU}SP4sxwA_=~Vhe7WgBrlCDxW_#w=hVxEt1b^s3a8D-n> zd)shqY2L>VXTQ>0Ky{gczZ2M&qU(0Ig{9x}8~}(0u56c97{&Ef65LtZHLT#OU1p=4 zG2l)tw%Q*D>dYIAlqwJq&u;1?u_nd%p`^Ue>J;?5Hc1%;r_l`*M*hbAJ1pih5VRmeOsxU{KyB>lAWxIcU(ReBgOHYybQ2v%aFov3cH3 zt;g#});4a=&%h(>?RltBHN)L%8qM7=4$lY{6^N5k%`jWMA!i~ znGg3@SJeo^?jkO<4Gn|&oT6UzTJGd`;1&{n1La^ylBLmSl-Rd1<_OB^$1Xq4b8nlq z=7wd3RqN|(PPviotrd>atNrB{Tae?>IM1|I2g;a$%sVuHLY4-~ZTt3T$mnLkP6kIA zpIi6&9KxUGKks_ad)>9?p}w4F@*gu@2E^MR@8?grU+P{I-It$$DLO+~juTBL(7>_P zmX5r{Ettg)fb?-NNBsSt#+``$%k$LjaPJPl>u1`VnC?_Ki-4*ebfx6H$hpEW%%PeN zA#Kx@ONG?_Z<9f^!RDepSdwApcqh+_r~+B3F{UfB*QL%0Xc;rXCAX$!^)hhg$BXCI_vMJQp#JmTwS`H@&BK`Y%j;pY-5O*9cszldsqHQ4h zd2}6wyEq!Y=eyWY!xl*}QW0*xgp`i2;QeAP^aRnNp@c0hVi=6PI7c&x1^%tbS6xcq zeUSY+gl+Kka-0VqJt(a$oQhU~bgtczlQvFBDn$aJOgy;tJEw{ZJ$;J-s!!FSSFt#wta_2uTT& zPN)Se>{6x>fbQ0)V?o)L63aEIGiq(ME0^}kKYH3!!y{;pIxjirwBb9+R(aQ`D>#+FSJ<%0Jwf_1mEB|}lAKDVT$@#ewF?U3^P&Sso7l?H z7&Zykt!U_g1ir^&B`H}07~gYIYIwGpnbfbekYJ8aWPa9!%JfIB%<+;2a%;_^S@$U) z=c!pvOuY^l#*!&y1#Tnh^-BHUEeHxjHX;dH>z(X)Nf}lB;4&1y>cE;e$&apzH)93c zez}PSn_T$&_PHyqM+c`}Cyo2SP5v@4bk6Fjre>_fcXH1z@uoD}^(3!N$`*LdEFm%#X@hz#JZBv=P@64-zss>WE*?Wry z%pfj(p#en?GtEUsUd>-OwebrMTjgEM?X@qTES5v)-y3Z2Y}_7B_s}XGZLjwrLJ*71 z{6tATME>zQ6p`a5TBh`v9j*gJJc%p}_auUFp?}e0IgYweqv9sz8Xl){!!sbz zN>d~C!gvg&wsOhXCAAn7NQy{2kSs=X>J}|JKSES&l!|AK2@2aHfgE+mYPr=?%-CnzAR z(}1qoOL@s9us(h!)xCd5)vdF?;jwLAz344;B%+-2x*jHl+V_7#Cbx%SjKae)jvq}t z3bzPCHNSUbUfEvXy^g!)&k$`5YU@>Q>{r4*Q|JF}(o%2jTU|~W>1V*@DcjO4OgVMN zXG%Jx+oQs5(20)?NvFR={W>8Man{_?SmbaSa$aV=n!pZo?Y2_KHTD^6UgM|R^W_+Q zDqsAwk@<74H=b&Z_Nxv535P@!GTIoi$*tP0k+o4nA33hcUPR=4f=szN&Y}W`7`B=u zU&4)nP8$P5{uGe>M-5{+AIR#wqNi^(;81=2vGW2Cs7dwLUigHH8(Ga*mE2V8PcI#& zGJW8h2u(Gi_|uewHdhZP7p<~Ri4u4e?bdX%29~H9u;axt!mKRwDjjhdcrO;T^5*=! zS&Ob%U0G!AVtBUMTVhJafI=EjE@HeGzdu@Rlweb=%OdIv z+hyU@sd}G6%8N=%F(-T?uTce&o)8)&Z6$?QOUyG@cg&(foT6MAqtH*;=9~4UR@mI~ zY?0jaO6c6yYl9D;@^?7p#whHXW^D+e=4Nc9 z$B*&S~PXk9>ch^Wh^gi|o@izn@tV2O)UmkqJAJQ-r6GXoUQVuf0-#8B} z4N4B=Lx`FQI}IcYQWs1P^e2#Wz5!<`!77}#}uNUkL?Hx{XZ8r}c_wJXo@17v+x=Y;cFIDf_Q) zf@Yv*J*#hm@5E+MWChe?MY@dR&6WszN)_egmff zH}*K~{McbJ1g}A9!FwT6f{c5{@kg40VgsJ+p~(Z+gx3Z3fzkx603T^P4^ZEcF$A4~ zumP(A;Q-bET?QhAr~|q%; zLvIck8EM{p7vy zdRQQ=X`Ul>uzAb&8)`;ddiSsHwH?6@`01Moe~EPcv>Xd07nL=fLiq?-KX6cKsH`oYMzZ~CI7iScK7v^ z$4ur0>P+9*X*g@#QOdc~3Nw_u#W&vBOZU~w%svBm*A_MqW3@a2Dy3_f+!#Da3hl3D& zL(@mw?z?%SLC_B_ypC!2*U{nSZr9=dZad$-twTR^Pi`sWHDmK=Qn3`Hi|yAVOgH@p zq4AmCVY>~%_a@BlV@O-LJ33BHyE&6o^Y2ADPCh;iPjwYHH&2N&4uI#+Y0%3UPn77J zZ|$6PZ<|*s1Vb9?Q5d&N>kPdiQr>Nv2jfXr(Xru8Nd^w-W$Tn~vn`|`eZljm`K;pp z_^JG9j$;Z*Zky(k{kmhQr#P=6-=XZ>ppTpDq{1N(y3wlP2J`y2cC1PCJ|&c%23nwY z96#aPglv_e)m!B zs_azzAyfIFSCaT&1oGYN1F`qP%X8Fz1~1>?Gy}vHqHDEot3c^949oIbi-Mt$fvyp9*PBmcxr1? zx?up_Q$S2pch2~{IS*yk`*h|Nr-(h*h)KrJDGn>wz8#5AjJtPH>h>zF;8VIAw#)j(Aq5a9 z+nfI^oZ6&0y~t$C07!)77Tis`PY^!Nv-w>4+fFl}&)zDi`K`?vIi0?x_s4JmxK^$k zhnW4arcxDpODj{y+H(r56sk*UYOBsLhD;kT{si+A)+hgoA0SdUO(ykK7wyiX^eAQe zpqUclQ7|#auypQP0ZI3F`x?==I~`0LMl4zZ_`e&iIa-# zG$*_g7)B|yI1@DFGA2TM9lpdGW0~qrj1Qis4f;ue`i*U%fl;0jNfK={tbst)rHvXW zy$aEf@^p#;(`tZ{$|Ku_^CQ!6bUrT;8$JlONmPc`Ey$yPGXluIg?eY(!MVk=fAYS+EjZFasKswj9+JXZR9xe zvTUHyN8o!vZA_nOG#58FKtg9ef2NTrsV1xsvjb965ml-mBZ z6N=?7uU~T&&(?KYtZcqa7vRSDKXNFwCnLq8>G0?4wBt8*`JG7m0N^o?a)>Wj^HTJ?2lorjL$ zAXiX9W_t~Ps0y>pQ6SE=sPd+jEaM_Si-d>BlZcyFFw9$f6@~-O+g^|gB}qpoxlI0W zf^gI3>KJ;Lcy;Q}U%-pf%7vPA$U*MHc4Xf=bTB6D*dd+<)okWrdZY(g*10Dt#3Y@5 z9<7Qhnxu;y5}Zo1Wp5c_$qi5Y(AMR-5PhQAAnp&V286yE!q%jWo|>c4clQA7%djE< zuO}93Z;i|qiiOA)QEQ=MrHkTb-eMI5QWASXwZB_3vRT$rkw!xzeY%Fa07j43Hdm1n zbbh{lR;alICt4THd!YP77x25lv#44&uHpsC-z5$%BQ_goF{N*PpreE8xwAFnE!~tT z1~#_0DQN=k=Q8C02PT@gw!YD>6(R9I%yry+X!1BZV%A)%)_T99gU_3B-QHIM!I(ux6{Abnl0q-0E-vX{hLfSfj>F(+K+{8r ztrkQyNwLkblb+TGuWYu~*jVVvTh8WCmpw*Sf+&Vq;GF2Ukgj3f+YxF$)Pi?4NzK*2 zqte2bzAYh2K-qZSqHZwlj`V}`aH(9$4hH6@Q7m%Rg;;h^g zPghCn*kz(ch=;v#!pl*8zHn+>HHnm!qQGK2g;z8FS@E4~_S*Y-OYgpGn^+OuiR^6n z45_p43o1R%-+gz$VW7f>taZuQF~KsebAjrb;{A98aosk8(6PO@Zu{^mGK=M6ZyYg= z2_q@KaE2>IwlCUSg}RQ~6`HV+t72lDIq}x2pzLHzUS>~T-&dq@M!Gyd)z~PTGgTXu z=2X%j!^^lyU*l{On>jbGTpYdA&(S@ViBv5=)e?JliYley6lsudyK$y*q)bsTQNQt~ zQKGMSc=J)QpC(aEy6O29_3atsQti@mj_(HH|utYEC zN>iYq<`p|CEfM>w_d&qXs^9_gzOUaB+wa@M3jBqTscYYHa2Ia9DZb}ghyl2cZ&;27 zjpK8d?soT#5HGKt9Bk|XMhq$Y^o~6Sq9WhJB&ec6$b4c{;jwWWdC*Pk!%Mh&lmJTd z=F=sVLpwk0O+|QKmapRMJ~WPrX-!N0l!|0#VkjB*z)E1L9zHk?>8DtRb6ZOsc>QUI z%_Ti+#uYC7L2&9f(@*hMG)%9d8I>0RxHM!9aqrP(S*jF)#`35VcF)3dwSNU- zbo`phaMUvV@n-^G)@V2tdf5mqVtQ=tZM7P!SufP5>tbWbELs8LdfMM$DPW3tSzOXo zUeeTe&}@zLUdpc;cY<_$;x3_XTP3baZ)nZrt|MG8=+()&`5>fxLuDZGsQi@UjCr)g zeY7d_heJCgEki7{!oF4_HF%hO)hlAAZrLjHHfevC9pBzliFGw5B&h)Xr_V%<^{oiv z@=vp!F*&&fl!HiW|C#5s_P8xOLqs6@&=-{*lb&HVPo+umDD20|)}(wB}($KX9V!5BMAQopYeD$Ke2bpl|utPmBwbF<-nV=pE^uYyVPz zd(ds*90&!FZ~PZ;e^dsU06(xUNIuXkkR0$X#1Ehs%AK&DSRjQx1<=9}uCZeT%R089tS2i#85fggwKcTc}L2(5?G(m|@w*pfzy+7^#re zf!|1U{1F{5V={)??qK||MN>jxR1p&%{=`A?uKR@e+iwhu;ux}n3o#jc-b|XO=UJh8 zEIYHe_L9pqOy*ipHScj{*FcP&`HS*~4_^h}(*xdRX{+|s-sJlH+3LHu^;`9^N_*-l z>a!cU(xJ)XsXwTbZfeU9woCDJJH`c&|FduEP9v7lceQW9w{CS9Ww7w(!9M|E>LImD z@$kE(@Jo_{`{}b(NPYbH)bN_SOzr1(?fJo?Ez{B`rL#D_Os|F0wARmSOhLsuY4K$CbwXZIKCs9ihI=`~9+L5czmtA^R~0Y0PrVed=J7i z-uE-l0b3bi3O_EXT&&S}JYyuTuV>`HCO5BVd`de?D`!vEM8o#X5i9|QHt+b$J;%Hk z?ok_5BdfoD9oUIw-Rlq6ISV4|rfo&W?MpA|2b&mx@VqFRU^4}wb4CzWmYRpu6~G6L zW42K_AsDSnihf=Juf&Q{*VJ%bb~MF`QWoa#@=L`0MGKeS4(N)ANVLq3q8_ zIbjaSqjmo_mU3qs^$8w(a_6=olE0SJ!6O*XR8e6up>wC3IcDdPPSEd4DrsVen4Ua_ZEXML%72 zVX#$LYl|MCcW0=#Z^1KSi?C^GCQWexxMPFU*k$vw9a;RahA_Lfh9G~k zhB*8HZuMv%SE0HJtoprp;^?S4Zx>_g?%4u!;pq4<=Mp0ncF3c4UcwdHd2lC`su{OL zo>1Z%jyH}4J50r!V#^RC8!OD%s>Jv6$CDq(n_$V5YC4XJ5mzYpk+IEtJZ7lzlomt^ zh5O=}_^8&Cwvc?vd~*MzYt?E3g#&{P?or_4NY>0xI}29MhIH1o32fV==yK_!XjIdq zSdM$C%-4gVGBz#iAJ1INMaOktF0iJQwrP}tah+cS1qKZ7+vShP?)@_~MtP+a88-%| z)kEoYh}`J~Q#(eNDHXV)i!H}Xbc!p@`%O6ZhD|28KA?7udI6loo{5uH2lbzOU;Dqb zxpdMfR|@`=y6%VS_}EAvJ`PS^Zm4tVxY+mfFY%pM_i)|y-d88dB?29p&?(QTh`FL1 zzg0W=oOYkzr52Vehe?}kLpX0WVvR@FzNSg25?%Og@MgxgZ#=Ga;SXT131qSMei2?^ z*`ZS2{H!b*yv+jQD9;??-C+dztCCE{$@VzI1!T(Hr4oCxa=>lno`*`2)%jB&cFTQn$K; zMfX;nzs^ZWdJc}1NG#u^wkLU)4zPp2VQ3yq6WzVBMR3<+W^Y71vngpG+&8|*98}^d zXyWslO+Cf0Ku{pH({6Z8(?M>_F&3jN|D#N-4Q~hqf64J5B=n zAkTff@(t!9<%JcW=bh6K9jC!Fhe(HudSP*;@rj}|XPbJWu&<-dw(M%v_7^AZtl^aS ziJ3u9Nw+5LE%}^;qqGn(bp=EWS}i1(9ubi?cMe|g0ta;xxPiFLQ5lXRg158?R74(d zPVVmIiTlp(2|+jf^Q*JEQ(-`>3+~q;b)yK553Fw$U`<2q$fP>83R5ink!19Q&@%zG z-MQUb9Xo2frZxR!pGJ_sY*CuzV=unmR`#?x@>)GlJiE*=dlOyYz23iEbhy-T@(}jJ zV~8uB1O1|NJ8e#->NZlb%R5Ner*?OzgpTL_q4dq((C}2z?IJIN5BQ-r+>b>7 zSN|K8F|S>G1>nsYrfzME!nmc1UTh4rrY$oze4vIrRxXm8Rly2pJ`-^SI5gRH1*oz2 zq{RVXZUOW$w?7G|hS6ND>^QSuOQq?te7vV^?LJe~b-;WCIS=NrMv0k$ zpY<0{Tkkw?Z|Ac;MU~r}9CX{l=~8R0O?+XAWx^<1U$LDToHt4#>7|K8Gco0R3>+X{lMo(h_&^1G*Gr zj>C1#^9^KuEYjOZ&B&1)NJ@|V@=tTISQVL$HAM=mw*vAarl;}a6Hlpkn24< zBj^?=K?WzN9gEYexm7f1g|Ch^lLaO(@bPasK-1coJDqvw?%t0x0DK*;ZM@NO(buw9 zuPO8?qH>i$&Ij>Vq2{C2m~ezjKE~oUo@+a5gNVZkG>>^RbRE`$XGM)2>awU*LK17n z8O|;~U~&*w+-%O@wePEIoYvT-wox84v@r^txaI`<>E)#xPhe?yR5SKXQ439U-@TF> zi)@Jgfo%Cz(UgABG>@o${f)@bUNvv!GC^d`Kn1ujzU6H!=r#{Lb4qO`H5M53(fqa3 zRB5!!GcCOJSt(68C8Iv)M?=l8quk8+s0D$Ity#}*D7lLs^han2074nW_NWzNa&US_ zB3=aPHV014!n%|#K=?Yg+gBIEy-K4wS0qcZWQYvQnn`p{=EOo#MumQbUhzn}Hc5!I z!EO2QwfyDtxQh>A3w-Z|bao;uN||=s@&dWWRcde(nm^{0j)bp|6y+M8!a09Q!C0UO z{mP`C&}`Wrocj&Kwa()WcrAWSsOw3}ySmm!jat^`X82DwuU3=MC)H|!-%{6IgWe6N zSjcwc6TSG#a^?^4y-xVZQqE7REzU?1Z-_Agh@vr0=D3d=%Y0N=)<%;~Fccf=Yicaz zoboAjMjk=;i*Qv={u?AROLp@*re~g^@ixKK#vt*Nl2^ukX%THyfIf@uy9w?>tmH+a zcjdW~(tcx2LJ4ZwwXNFq4cjvLW4FrPC28baDOC}^dy4$D$zRVmKl=6~6gH-pTUr+6 zHa|3~W(jN}3y+OYg@FvR8f+~bu*SDHVj=_)sno6HJ^?vWtV$0QI$f8KPrN-#zA#2j ztHKqXr_u#p;K|J=YR5kLKq$P2ry~7{J5o-hB^@)SH?{WWiqLDvc%M-=BvK*TnNmdL z%Eb$2*>jFwAd0Aby?gKo0H3T+pX5y}ogIged1_B+=cB(Mg5NVH6!t0QawXMAeQKpC ztBtQ^)vzB=r!XyL)4DL3EWaVmzz%HmTE@shZ9U_}(W$&D{&*oixG5*{KF+`E4 z#eKz+Z4Hj9g(`sIVT)r6V^~F`UE5>;$+gUu8p1cK8I86hzs_Igh#C z{`;|60;(6xZ;#D%;T*(`upKxYkjn^Gu5(akWZu37V=y)lUMPP?&_r>3V`DXJVo*|ydsH*mNGnm5Esy&teazL4@4m=3d!dEL zA~#tWRxjsNDd`Y1&}14WH};^tx5muiZuWF0IlWoXzXYF5^OoPn&73>O)ge-$+7Xp_ ziv&a~v)n+;aWqRdR6nlUZ|h;^5+06jK;iI?^MYSIacy>RwbZ3QmlHeNGLSD}6Ne5< zGGa27SDk^t>C`+}x~ByBOncAWHLT1^Su$`;{tdMaH#5IvF5lJs6&sP0&ZxfSP9+(r zGf`@OsnjXw-Xy3+QX;Fk-)yfCEwe}{wk9V3lrg_wOyJ91IACy7al6R7nxr<^)0|Ab zUKn*QPdIqe4>~gdzpA|ypl^Nf{d7Gf8PuEnH zGJYM7fw<~ZmW+cB&Ki8WADn08Dpt?!>=rT1Tz6^f2g}%-=u-7v zHbe$PfFzxh5#(Ea;ADTZ7keeIj1I}CUgL#~4W?zL;O$6geg0wyUJJ(zLQw689~#6I zxM9J(ZpW=!3;NK-&gjIn73O;0ZG_nu@wfpDnzWCP7=!<@0GFOLC3f!2MMbIBpnBcC ziRk#07hjqxIoYz27ro@23AXh*IO{orv3@?-Twh$vW|CFp7`2qjsveC;C`wSTpV(ny zURQ6tyUKV^s*Cz1(4tA@{#?9mF`~saYXQ~mN8av&uZ#Yf`56D^tDf16SBTT7YGHUB za*SX%n4u?8%xonoo0Z{PJ=;!Kj_Hga2dW<5sW_Z=ZpfCX5{P38*#>_c;Igyc0gjT! z5Rq{%yokS53C|_BH@6U$F?U$9=|7+!8p^(@NzdkK`8J=rM5fU+`cz9ae$4sR)(~*l zt8gHHSkop($3mPwAKanyXpEqiGQ$!a%h{E*RvFGO6dK-lzm;kixiEZa2|naK<8G=P zWxaJ26!{uzXT=aRm2WEJlvd`H^!k=UXmrryzzcX=q*>Kn%)9xbfIoi%Tdx^_VqgvK zwof-1+I6ZGy3xLa+io1ZzGw0g5E2jH?(}puy2Zk^o^3Sryl*Ietkwo!0HiCTYoEOMmch+wAXZ1r-N&er6eck z2uX-eA>y+hJNlFKjoDn`>VYHFmd6cI?mQskZ8k=VAw*T#bwN-}AHuMKgA2JvMSM8T zks8vmPEYiyU4Qa$X~lG!weC8y59{uHxIx|NR>53>p@|&mGjO62sHm^?)QYv#wxEO& z6K?Nu`sT-vzO7?7I;`^(BQA**EpIEbWV>>asSN4OTeP2Q+GPI_rx9+D+*DSx*VfW+ znqkD8Vy=$USkDD(Z5r=uFLwDc6=Gp45uvp!HQAJ_#r)t~^Lcsx<9Y7&r$2^%oVq08 zm_QOr93ZLl*bwHIsl5p#?!&>E&BWfx>~CV`e^FnMqVtN;lj&e52sncOA>RAZPjAdl z8h;LB5s{v#w}{LgKgLa`Tu$c6<;juUysbPg+Xv?*y6r}4LYpw+;^)alsvH-BxKxT6 zv5DHhl!6z7Kq}1Ey@ADGqd4PLg9@%oS_r8xc$_PE_p9{q{?nFVc z6BtTQsigOq_(s?d!@m;cQf%5ydj-P_5Tu&GVNl)y1pAV1I^1mS?d6tQRqJeODt@_Vs#TP0& z`yL{96Rlp*X1-*{3vwt(?S4p3#e9Su8PL>*L>XbyS+$L@t5Nl?^9OmFLI`5ud$&#x zcvr~C{~-hxr#Iu1X3)9Wo`LhBmwQf-D@m#E$$ezc%ZdUDBZgd&g=j?T>=G)o9~STnzFtANTTpgfwNhLa94hi{2M#wVq^>< zQLz17{cjMw_4;2y@WBkRaNk}z9a^T?u61J7gACV2W!MK^koFjZ9J3vt*=fz_fA+Q@ zlV+%_9J#gi%+0QpV#9R2sq|^TrtuuwF_uwptYD1=YDVw4b31Ph@@^A*XI6j@W~yVU zwytybaYKYNu><%6b$C-dC}#`f&SYMk@PqayoJiEENwz*%TStjh_wV|4;SwBNy&T(U ztjZ{89yNV-ZoYu$ydu?cZqvV->y~%J5;a=CY#Kfvr#(^$Kbeyw{s^6^nj*6^XQ|kg z$-dS#%;~JPQg#WuKG>LuX+9`&KV9vm(>I2mC7Z0f86su7}a@AePShR@Mp(O@Dd&?1(iPZTHPp{dOPiX0-S#e4z$$+@QI#TE-G= ziD|hOvr&1P(VcRM_eE?)-&mdmG^A)hpkH3tjW?k;6uz%go7=LRt>in4Z7WHPV@8a# z5J;dZf`Kg+e4&SW(Xyd!JAVS`uoY~4g(5IWPE6%aKBd(P8p2>x#f%Mf{;Yo-D(YQ3 zBCu(bTW$nyL@vxuu_NWJhAk1ZdVrC?_K=PrRS5*SwtfTNOw2blxw!n4_e{>YP@c5XzS)oW!yvP@_49l&&;`` z;4wKSRY~Ud!1LzBz;>b50Hq-cSZa3B?YhCVy(#C(pkiT(YW0El7`h(wL(}`F;5#$v zQqGI{k#fSEZRhZ0SxLX%_u>i)`{z1?>_5Y6kO7_*VzbVQtezYz{>e~st zG4qpP&y!#Uu1YTwk$Z}%OA}^q_!x@s-lS3YENKVB?$uGEr{3S(SzpA~i%444&$!ah zEk)%B`oL4mguA0tOTHreOh}QwhyMX}H}x|QEDD*V@)4X7R>We>b3Y&=`C`KlC+^`{ zxAy>Z4#TE#w{@O7La84Qa51eVZk#as1}gaJ_-`-e%l$fa_1iPBsB<|pq z5sNb}O{$7YtK32x=mfsYKZFz=rZ&&v8$?Z?N*0~Z=M{%3BH0YTiNX))MGS5RRDrM? zb40gMqhZQVmJvnOXmH$;EW=+d1o(EML?|l1 zXsmcz^mAm%6N;60QAqCX16Ea(urQ39D1BKWUzSkbIom93W%o^bp*#x-YE!sitz#}Jy@>#u$0w(hVJ zS`E=zS~4FR??)Q%cfPYex|J?#AWnpB&Ll@pc?5ejzIu;_NxVPfXOX<|4i=N(!{qAi8YKgerHWpx(@{oG_fSUrgC9C9 zWz(L=spNfJVcJjM2R+Fx4q!&mihdZ&XUn1G*hfA;)7sl?$;`QCaORt!wQHyDQ`lTn zIZxrPk*8Bc>?bV|Pd_x`G?@GnD0A`)R<_;woERh=3r zsJVm_G5n=|w%Ql{TCoL32N0W97DG2Ta;l1>ep_o^O`vMlrsH5bLS+ZgqGC5afOKnr z==D;CXfEj?yO`l%VCeqp^&B7oN*6OH6*Cu?pHM!iZH}K|=E?)o9iq5GmX*Oo_isyd zHDvo#50sPX-)A9znDCaCK#G->8jo08zT&v|8w)U4QP`34{!A&>6|sWmJe)X?>b$*_ zhy{;}Fp?L%k7?3jvqZ)D^>OQp*UXg8Q%6MG%;z>lw8aVsRv**vo<|N#hT}^{pqCJm z@eeg=Hb#LO+Z-@ukSYQiy1dRBCcg51)i^h(-D&CkwAU)Y)?#Yr7_B=2e`p*@wOkM13Pl7*zF2Sk zu?Ujop0ZvUo?@+7dDW-e(J!OzDBnj>35W~gE=I?3T-@ktL!Dx{j813w6 zFmBWjSRT0yvbdw_k3tgDf#g{j=+uq?qKSvJBHo3?Is;=xk-={aRb{1CiV4gS!cE%l zXf=!2xM5P6$gyPsfTuTh4g7-rC(=@!0iNnzF|`3wroxtAUE3{cLzi9~J1J|0CZ(L= z@eDux+KZFX`56TZhO+$m0Lc=nCN$<&_i{=+P1KI^T_4Aht zi1DWjbRsCU0d(HYF9Uv#p9a5Y;XuoOzjyOX3 Date: Fri, 3 Apr 2020 10:35:01 -0400 Subject: [PATCH 68/83] Modfications for future deployments --- docker-compose.yml | 9 +++++ .../default.application.properties | 8 ++--- .../gov/gtas/config/CommonServicesConfig.java | 10 ++++++ .../resources/default.application.properties | 1 + .../webapp/dashboard/DashboardController.js | 2 +- remote-deployment.yml | 33 +++++++++++++++---- 6 files changed, 52 insertions(+), 11 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1ce2512340..d107bed4ce 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,6 +36,9 @@ services: - ACTIVEMQ_HOST=activemq - PROXY_HOST=httpproxy - ELASTICSEARCH=elasticsearch + - PROXY_IP=localhost + - OPTS="-Xms4g -Xmx8g -XX:MaxPermSize=16g -Duser.timezone=GMT" + - J_HOME="/opt/jdk1.8.0_191-amd64/jre" networks: - GTAS_webapp-network restart: always @@ -58,6 +61,10 @@ services: volumes: - m2:/root/.m2 - scheduler-logs:/scheduler-logs + - type: bind + source: /var/opt/tomcat/java_version/java8 + target: /opt/java_from_host + consistency: consistent gtas-scheduler: image: wcogtas/gtas-scheduler:1.0.0 @@ -72,6 +79,8 @@ services: NEO4J_HOST: neo4j ACTIVEMQ_HOST: activemq JAVA_OPTS: "-Xms8048m -Xmx16000m -Duser.timezone=UTC" + OPTS: "-Xms4g -Xmx8g -XX:MaxPermSize=16g -Duser.timezone=GMT" + J_HOME: "/opt/jdk1.8.0_191-amd64/jre" volumes: - scheduler-logs:/usr/local/tomcat/logs secrets: diff --git a/gtas-parent/docker-resources/default.application.properties b/gtas-parent/docker-resources/default.application.properties index 5f35f5a257..5f62645115 100755 --- a/gtas-parent/docker-resources/default.application.properties +++ b/gtas-parent/docker-resources/default.application.properties @@ -98,7 +98,6 @@ sqs.loader.initialDelay.in.milliseconds=1000 # 5. sqs.loader.accessKey = # 6. sqs.loader.secretKey = # - sqs.loader.enabled=false sqs.loader.usecredentials=N sqs.loader.region= @@ -155,9 +154,9 @@ default.landing.page=dashboard neo4j.protocol=https kibana.protocol=https -neo4j.url=/browser/ -cypher.url=/db/data/transaction/commit -kibana.url=/app/kibana#/dashboard/7cfbbdc0-2e13-11e9-81a3-0f5bd8b0a7ac?embed=true&_g=(refreshInterval%3A(pause%3A!t%2Cvalue%3A0)%2Ctime%3A(from%3Anow-3d%2Fd%2Cmode%3Arelative%2Cto%3Anow%2B3d%2Fd)) +neo4j.url=https://${PROXY_IP}:443/browser/ +cypher.url=https://${PROXY_IP}:443/db/data/transaction/commit +kibana.url=https://${PROXY_IP}:80/app/kibana#/dashboard/7cfbbdc0-2e13-11e9-81a3-0f5bd8b0a7ac?embed=true&_g=(refreshInterval%3A(pause%3A!t%2Cvalue%3A0)%2Ctime%3A(from%3Anow-3d%2Fd%2Cmode%3Arelative%2Cto%3Anow%2B3d%2Fd)) ########Email service properties########## enable.email.notification.service=false @@ -170,6 +169,7 @@ spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smpt.auth=true spring.mail.properties.mail.smtp.starttls.required=true email.hit.notification.enabled=false +spring.mail.properties.ssl.trust.host= login.page.url=gtas.login.page.url path-to-attachment= diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/config/CommonServicesConfig.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/config/CommonServicesConfig.java index 422a4c6ef2..b52178c7b1 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/config/CommonServicesConfig.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/config/CommonServicesConfig.java @@ -29,6 +29,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; import com.mchange.v2.c3p0.ComboPooledDataSource; +import org.springframework.util.StringUtils; /** * The configuration class can be imported into an XML configuration by:
@@ -95,6 +96,10 @@ public class CommonServicesConfig { @Value("${spring.mail.properties.mail.smtp.starttls.enable}") private String mail_sender_smtp_starttls_enable; + + @Value("${spring.mail.properties.ssl.trust.host}") + private String mailSenderSslTrustHost; + @SuppressWarnings("Duplicates") private Properties hibProperties() { Properties properties = new Properties(); @@ -182,6 +187,7 @@ public JpaTransactionManager transactionManager() { return transactionManager; } + @Bean public JavaMailSenderImpl javaMailSenderImpl() { @@ -196,6 +202,10 @@ public JavaMailSenderImpl javaMailSenderImpl() { props.put("mail.smtp.host", mailSenderHost); props.put("mail.smtp.port", mailSenderPort); + if(!StringUtils.isEmpty(mailSenderSslTrustHost)) { + props.put("mail.smtp.ssl.trust", mailSenderSslTrustHost); + } + mailSender.setJavaMailProperties(props); return mailSender; diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index c38b07727f..d17ddcafa2 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -169,6 +169,7 @@ spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smpt.auth=true spring.mail.properties.mail.smtp.starttls.required=true email.hit.notification.enabled=false +spring.mail.properties.ssl.trust.host= login.page.url=gtas.login.page.url path-to-attachment= diff --git a/gtas-parent/gtas-webapp/src/main/webapp/dashboard/DashboardController.js b/gtas-parent/gtas-webapp/src/main/webapp/dashboard/DashboardController.js index f55ea2b843..78adbb8877 100644 --- a/gtas-parent/gtas-webapp/src/main/webapp/dashboard/DashboardController.js +++ b/gtas-parent/gtas-webapp/src/main/webapp/dashboard/DashboardController.js @@ -35,7 +35,7 @@ }); $scope.getKibanaUrl = function() { - return $sce.trustAsResourceUrl($scope.kibanaProtocol + '://' + location.hostname + ':80' + $scope.dashUrl); + return $sce.trustAsResourceUrl($scope.dashUrl); }; $scope.sampleData = sampleData; diff --git a/remote-deployment.yml b/remote-deployment.yml index a788cd7433..5c61883a68 100644 --- a/remote-deployment.yml +++ b/remote-deployment.yml @@ -4,27 +4,48 @@ services: deploy: placement: constraints: - - node.hostname == gtas-app-node + - node.hostname == gtas-webapp-node web-app: + environment: + JAVA_TOOL_OPTIONS: "-XX:+IgnoreUnrecognizedVMOptions -XX:+UseContainerSupport" + JAVA_HOME: "/usr/local/gtas-java-jre" + PROXY_IP: "" + volumes: + - type: bind + source: /mnt/gtas-java-jre + target: /usr/local/gtas-java-jre + - type: bind + source: /var/opt/gtas_web_app_application_properties + target: /usr/local/tomcat/conf deploy: placement: constraints: - - node.hostname == gtas-app-node + - node.hostname == gtas-webapp-node gtas-scheduler: + environment: + JAVA_TOOL_OPTIONS: "-XX:+IgnoreUnrecognizedVMOptions -XX:+UseContainerSupport" + JAVA_HOME: "/usr/local/gtas-java-jre" + JAVA_OPTS: "-Xms8000m -Xmx16000m -Duser.timezone=UTC -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom" volumes: + - type: bind + source: /mnt/gtas-java-jre + target: /usr/local/gtas-java-jre + - type: bind + source: /var/opt/gtas_scheduler_application_properties + target: /usr/local/tomcat/conf - type: bind source: /mnt - target: /usr/local/gtas-data + target: /var/opt/tomcat/gtas-data consistency: consistent deploy: placement: constraints: - - node.hostname == gtas-app-node + - node.hostname == gtas-messenger-node activemq: deploy: placement: constraints: - - node.hostname == gtas-db-node + - node.hostname == gtas-neo4j-node mariadb: deploy: placement: @@ -54,7 +75,7 @@ services: deploy: placement: constraints: - - node.hostname == gtas-app-node + - node.hostname == gtas-neo4j-node networks: GTAS_webapp-network: From 5b3c2c8bfb312554f41efca3011badd628268672 Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 10:49:32 -0400 Subject: [PATCH 69/83] java_opts --- docker-compose.yml | 6 ------ remote-deployment.yml | 1 + 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d107bed4ce..64efa279b7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,8 +37,6 @@ services: - PROXY_HOST=httpproxy - ELASTICSEARCH=elasticsearch - PROXY_IP=localhost - - OPTS="-Xms4g -Xmx8g -XX:MaxPermSize=16g -Duser.timezone=GMT" - - J_HOME="/opt/jdk1.8.0_191-amd64/jre" networks: - GTAS_webapp-network restart: always @@ -61,10 +59,6 @@ services: volumes: - m2:/root/.m2 - scheduler-logs:/scheduler-logs - - type: bind - source: /var/opt/tomcat/java_version/java8 - target: /opt/java_from_host - consistency: consistent gtas-scheduler: image: wcogtas/gtas-scheduler:1.0.0 diff --git a/remote-deployment.yml b/remote-deployment.yml index 5c61883a68..a945ebd58c 100644 --- a/remote-deployment.yml +++ b/remote-deployment.yml @@ -9,6 +9,7 @@ services: environment: JAVA_TOOL_OPTIONS: "-XX:+IgnoreUnrecognizedVMOptions -XX:+UseContainerSupport" JAVA_HOME: "/usr/local/gtas-java-jre" + JAVA_OPTS: "-Xms4g -Xmx8g -XX:MaxPermSize=16g -Duser.timezone=GMT" PROXY_IP: "" volumes: - type: bind From 249fd4789ff0c1aaaee04f23a51b333889d55161 Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 10:56:32 -0400 Subject: [PATCH 70/83] change back directory --- remote-deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/remote-deployment.yml b/remote-deployment.yml index a945ebd58c..e22c610367 100644 --- a/remote-deployment.yml +++ b/remote-deployment.yml @@ -36,7 +36,7 @@ services: target: /usr/local/tomcat/conf - type: bind source: /mnt - target: /var/opt/tomcat/gtas-data + target: /usr/local/gtas-data consistency: consistent deploy: placement: From 58a0e08e6eba35ebfbb14876ccba42d0a2c4fbc4 Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 10:59:59 -0400 Subject: [PATCH 71/83] remove duplicative values --- docker-compose.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 64efa279b7..70da05910b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -72,9 +72,6 @@ services: KIBANA_HOST: kibana NEO4J_HOST: neo4j ACTIVEMQ_HOST: activemq - JAVA_OPTS: "-Xms8048m -Xmx16000m -Duser.timezone=UTC" - OPTS: "-Xms4g -Xmx8g -XX:MaxPermSize=16g -Duser.timezone=GMT" - J_HOME: "/opt/jdk1.8.0_191-amd64/jre" volumes: - scheduler-logs:/usr/local/tomcat/logs secrets: From 57351e6f2f4fb5e118ed01069a623122d525373e Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 11:43:46 -0400 Subject: [PATCH 72/83] externalize email settings notifications --- .../docker-resources/default.application.properties | 8 ++++---- remote-deployment.yml | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/gtas-parent/docker-resources/default.application.properties b/gtas-parent/docker-resources/default.application.properties index 5f62645115..1ecc1fe99d 100755 --- a/gtas-parent/docker-resources/default.application.properties +++ b/gtas-parent/docker-resources/default.application.properties @@ -160,16 +160,16 @@ kibana.url=https://${PROXY_IP}:80/app/kibana#/dashboard/7cfbbdc0-2e13-11e9-81a3- ########Email service properties########## enable.email.notification.service=false -spring.mail.host=smtp.office365.com -spring.mail.username=email -spring.mail.password=password +spring.mail.host=${EMAIL_SENDER_HOST} +spring.mail.username=${EMAIL_SENDER_USERNAME} +spring.mail.password=${EMAIL_SENDER_PASSWORD} spring.mail.port=587 spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smpt.auth=true spring.mail.properties.mail.smtp.starttls.required=true email.hit.notification.enabled=false -spring.mail.properties.ssl.trust.host= +spring.mail.properties.ssl.trust.host=${SSL_TRUST_HOST} login.page.url=gtas.login.page.url path-to-attachment= diff --git a/remote-deployment.yml b/remote-deployment.yml index e22c610367..deb5cdc91e 100644 --- a/remote-deployment.yml +++ b/remote-deployment.yml @@ -9,7 +9,11 @@ services: environment: JAVA_TOOL_OPTIONS: "-XX:+IgnoreUnrecognizedVMOptions -XX:+UseContainerSupport" JAVA_HOME: "/usr/local/gtas-java-jre" - JAVA_OPTS: "-Xms4g -Xmx8g -XX:MaxPermSize=16g -Duser.timezone=GMT" + JAVA_OPTS: "-Xms4g -Xmx8g -XX:MaxPermSize=16g -Duser.timezone=UTC" + EMAIL_SENDER_USERNAME: "" + EMAIL_SENDER_PASSWORD: "" + EMAIL_SENDER_HOST: "" + SSL_TRUST_HOST: "" PROXY_IP: "" volumes: - type: bind From ff1f897455de76d217d6e053a4fac404fe49d164 Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 11:51:19 -0400 Subject: [PATCH 73/83] externalize toggle to enable notification --- gtas-parent/docker-resources/default.application.properties | 2 +- remote-deployment.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gtas-parent/docker-resources/default.application.properties b/gtas-parent/docker-resources/default.application.properties index 1ecc1fe99d..a8592be40e 100755 --- a/gtas-parent/docker-resources/default.application.properties +++ b/gtas-parent/docker-resources/default.application.properties @@ -168,7 +168,7 @@ spring.mail.port=587 spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smpt.auth=true spring.mail.properties.mail.smtp.starttls.required=true -email.hit.notification.enabled=false +email.hit.notification.enabled=${HIT_NOTIFICATION_EMAIL_ENABLED} spring.mail.properties.ssl.trust.host=${SSL_TRUST_HOST} login.page.url=gtas.login.page.url diff --git a/remote-deployment.yml b/remote-deployment.yml index deb5cdc91e..e75de449d3 100644 --- a/remote-deployment.yml +++ b/remote-deployment.yml @@ -14,6 +14,7 @@ services: EMAIL_SENDER_PASSWORD: "" EMAIL_SENDER_HOST: "" SSL_TRUST_HOST: "" + HIT_NOTIFICATION_EMAIL_ENABLED: true PROXY_IP: "" volumes: - type: bind From cc86f87d4680809f91419188c06d8db5ccaff8f1 Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 12:24:06 -0400 Subject: [PATCH 74/83] Default email toggles to false --- gtas-parent/docker-resources/default.application.properties | 4 ++-- remote-deployment.yml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gtas-parent/docker-resources/default.application.properties b/gtas-parent/docker-resources/default.application.properties index a8592be40e..5a13a1e6a6 100755 --- a/gtas-parent/docker-resources/default.application.properties +++ b/gtas-parent/docker-resources/default.application.properties @@ -159,7 +159,7 @@ cypher.url=https://${PROXY_IP}:443/db/data/transaction/commit kibana.url=https://${PROXY_IP}:80/app/kibana#/dashboard/7cfbbdc0-2e13-11e9-81a3-0f5bd8b0a7ac?embed=true&_g=(refreshInterval%3A(pause%3A!t%2Cvalue%3A0)%2Ctime%3A(from%3Anow-3d%2Fd%2Cmode%3Arelative%2Cto%3Anow%2B3d%2Fd)) ########Email service properties########## -enable.email.notification.service=false +enable.email.notification.service=${MANUAL_HIT_NOTIFICATION_EMAIL_ENABLED} spring.mail.host=${EMAIL_SENDER_HOST} spring.mail.username=${EMAIL_SENDER_USERNAME} spring.mail.password=${EMAIL_SENDER_PASSWORD} @@ -168,7 +168,7 @@ spring.mail.port=587 spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smpt.auth=true spring.mail.properties.mail.smtp.starttls.required=true -email.hit.notification.enabled=${HIT_NOTIFICATION_EMAIL_ENABLED} +email.hit.notification.enabled=${AUTOMATED_HIT_NOTIFICATION_EMAIL_ENABLED} spring.mail.properties.ssl.trust.host=${SSL_TRUST_HOST} login.page.url=gtas.login.page.url diff --git a/remote-deployment.yml b/remote-deployment.yml index e75de449d3..8e450fc9b9 100644 --- a/remote-deployment.yml +++ b/remote-deployment.yml @@ -14,7 +14,8 @@ services: EMAIL_SENDER_PASSWORD: "" EMAIL_SENDER_HOST: "" SSL_TRUST_HOST: "" - HIT_NOTIFICATION_EMAIL_ENABLED: true + AUTOMATED_HIT_NOTIFICATION_EMAIL_ENABLED: false + MANUAL_HIT_NOTIFICATION_EMAIL_ENABLED: false PROXY_IP: "" volumes: - type: bind From 57c3312ad0639179a57ca27720b1d1c792830cc9 Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 13:03:11 -0400 Subject: [PATCH 75/83] move proxyip setting for local test deployments --- docker-compose.yml | 1 - local-deployment.yml | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 70da05910b..f7b290564a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,6 @@ services: - ACTIVEMQ_HOST=activemq - PROXY_HOST=httpproxy - ELASTICSEARCH=elasticsearch - - PROXY_IP=localhost networks: - GTAS_webapp-network restart: always diff --git a/local-deployment.yml b/local-deployment.yml index 78f0698779..fa03d4c67f 100644 --- a/local-deployment.yml +++ b/local-deployment.yml @@ -1,5 +1,8 @@ version: '3.7' services: + web-app: + environment: + PROXY_IP: localhost gtas-scheduler: volumes: - type: bind From 7ec126e5ac8bb3d63e577a366eb466a63559e6fe Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 14:27:18 -0400 Subject: [PATCH 76/83] env variables for local deployment --- local-deployment.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/local-deployment.yml b/local-deployment.yml index fa03d4c67f..6be5d7b8d2 100644 --- a/local-deployment.yml +++ b/local-deployment.yml @@ -2,6 +2,12 @@ version: '3.7' services: web-app: environment: + EMAIL_SENDER_USERNAME: "" + EMAIL_SENDER_PASSWORD: "" + EMAIL_SENDER_HOST: "" + SSL_TRUST_HOST: "" + AUTOMATED_HIT_NOTIFICATION_EMAIL_ENABLED: false + MANUAL_HIT_NOTIFICATION_EMAIL_ENABLED: false PROXY_IP: localhost gtas-scheduler: volumes: From 68b507398f6ce58a05e79fc38a794763f44b0986 Mon Sep 17 00:00:00 2001 From: simbam1 Date: Fri, 3 Apr 2020 17:25:49 -0400 Subject: [PATCH 77/83] comment --- .../src/main/resources/default.application.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index d17ddcafa2..8f8772e0ca 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -169,6 +169,8 @@ spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smpt.auth=true spring.mail.properties.mail.smtp.starttls.required=true email.hit.notification.enabled=false + +# Intentionally blank, this property has a counterpart in docker application properties spring.mail.properties.ssl.trust.host= login.page.url=gtas.login.page.url From 1128545e082be77728633a2cdf398a899a7f0f39 Mon Sep 17 00:00:00 2001 From: Rob Stine Date: Mon, 6 Apr 2020 16:44:19 -0400 Subject: [PATCH 78/83] The FlightPax class combines several different tables into a single class. This confused where the actual data was and so it was decided to remove the table. Due to the structure having links to both flight and passenger, apis information and baginformation this class was used in several places throughout the application. The work encompassed here deprecates the FlightPax and removes it from business logic in the application. I kept the class in the rule engine as well as kept the logic to load into the database. This will be removed in a future release. --- .../email/HitEmailNotificationService.java | 2 +- .../src/main/java/gov/gtas/model/Address.java | 11 --- .../main/java/gov/gtas/model/FlightPax.java | 13 +-- .../repository/ApisMessageRepository.java | 10 +- .../repository/BookingDetailRepository.java | 16 ++-- .../gtas/repository/CountryRepository.java | 1 - .../gtas/repository/FlightPaxRepository.java | 4 +- .../gtas/repository/PassengerRepository.java | 9 +- .../gtas/services/ApisControllerService.java | 2 +- .../services/ApisControllerServiceImpl.java | 46 ++++----- .../gtas/services/EventReportServiceImpl.java | 7 +- .../gov/gtas/services/PassengerService.java | 8 +- .../gtas/services/PassengerServiceImpl.java | 33 +++---- .../gtas/services/search/ElasticHelper.java | 1 - .../java/gov/gtas/util/PaxDetailVoUtil.java | 34 +------ .../gov/gtas/vo/passenger/ApisMessageVo.java | 8 -- .../gtas/services/EventReportServiceTest.java | 11 ++- .../java/gov/gtas/services/ServiceUtil.java | 26 ++--- .../pnr/FlightPaxConditionBuilder.java | 1 + .../gtas/svc/util/TargetingResultUtils.java | 10 +- .../gtas/common/BagStatisticCalculator.java | 53 +++++++++++ .../PassengerDetailsController.java | 94 ++++--------------- .../gov/gtas/controller/SearchController.java | 2 +- .../src/main/webapp/pax/paxTabs.html | 2 +- .../PassengerDetailsControllerTest.java | 6 +- 25 files changed, 163 insertions(+), 247 deletions(-) create mode 100644 gtas-parent/gtas-webapp/src/main/java/gov/gtas/common/BagStatisticCalculator.java diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/email/HitEmailNotificationService.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/email/HitEmailNotificationService.java index 4dc97afa44..d399c00cd5 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/email/HitEmailNotificationService.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/email/HitEmailNotificationService.java @@ -116,7 +116,7 @@ private boolean hasHighPriorityHitCategory(Passenger passenger) { public EmailDTO generateManualNotificationEmailDTO(String[] to, String note, Long paxId, String userID) throws IOException, TemplateException { User sender = userRepository.userAndGroups(userID).orElseThrow(RuntimeException::new); - Passenger passenger = passengerService.findByIdWithFlightPaxAndDocumentsAndHitDetails(paxId); + Passenger passenger = passengerService.findByIdWithFlightAndDocumentsAndHitDetails(paxId); EmailDTO emailDTO = new EmailDTO(); HitEmailDTO hitEmailDTO = generateHitEmailDTO(passenger, note, sender); diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/Address.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/Address.java index d8e81aaa14..bfa6b3d321 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/Address.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/Address.java @@ -50,17 +50,6 @@ public Address() { @ManyToMany(mappedBy = "addresses", targetEntity = Pnr.class) private Set pnrs = new HashSet<>(); - @OneToMany(cascade = CascadeType.ALL, mappedBy = "installationAddress", orphanRemoval = true) - private Set flightPaxList = new HashSet<>(); - - public Set getFlightPaxList() { - return flightPaxList; - } - - public void setFlightPaxList(Set flightPaxList) { - this.flightPaxList = flightPaxList; - } - public String getLine1() { return line1; } diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPax.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPax.java index 690e8e3a8d..908d035703 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPax.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/FlightPax.java @@ -7,6 +7,7 @@ import javax.persistence.*; +@Deprecated @Entity @Table(name = "flight_pax", indexes = @Index(columnList = "ref_number", name = "flight_pax_ref_number_index")) public class FlightPax implements Serializable { @@ -32,10 +33,6 @@ public FlightPax(Long passengerId) { @Column(name = "residence_country") private String residenceCountry; - @ManyToOne - @JoinColumn(name = "install_address_id", nullable = true, referencedColumnName = "id") - private Address installationAddress; - @Column(name = "embarkation") private String embarkation; @@ -150,14 +147,6 @@ public void setResidenceCountry(String residenceCountry) { this.residenceCountry = residenceCountry; } - public Address getInstallationAddress() { - return installationAddress; - } - - public void setInstallationAddress(Address installationAddress) { - this.installationAddress = installationAddress; - } - public String getEmbarkation() { return embarkation; } diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/ApisMessageRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/ApisMessageRepository.java index c372c7c00b..14a3518c3b 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/ApisMessageRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/ApisMessageRepository.java @@ -25,12 +25,12 @@ List findByFlightIdAndPassengerId(@Param("flightId") Long flightId, List findApisRefByFlightIdandPassengerId(@Param("flightId") Long flightId, @Param("passengerId") Long passengerId); - @Query("SELECT fp FROM ApisMessage apis join apis.flightPaxList fp where fp.reservationReferenceNumber = :refNumber and fp.flightId = :flightId") - Set findFlightPaxByApisRef(@Param("refNumber") String refNumber, @Param("flightId") long flightId); + @Query("SELECT p FROM Passenger p join p.passengerTripDetails ptd where p.flight.id = :flightId and ptd.reservationReferenceNumber = :refNumber") + Set findPassengerByApisRef(@Param("refNumber") String refNumber, @Param("flightId") long flightId); - @Query("SELECT fp FROM ApisMessage apis join apis.flightPaxList fp where fp.passenger.id = :passengerId and fp.flight.id = :flightId") - List findFlightPaxByFlightIdandPassengerId(@Param("flightId") Long flightId, - @Param("passengerId") Long passengerId); + @Query("SELECT p FROM Passenger p left join fetch p.bags pbags left join fetch pbags.bagMeasurements where p.id = :passengerId and p.flight.id = :flightId") + Passenger findPaxByFlightIdandPassengerId(@Param("flightId") Long flightId, + @Param("passengerId") Long passengerId); @Query("SELECT apis FROM ApisMessage apis WHERE apis.createDate >= current_date() - 1") public List getAPIsByDates(); diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java index aa233433c9..3dc5ab81bd 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/BookingDetailRepository.java @@ -20,18 +20,20 @@ public interface BookingDetailRepository extends CrudRepository { @Query("SELECT pax FROM Passenger pax " + "left join fetch pax.passengerDetails " - + "left join fetch pax.bookingDetails " + "left join fetch pax.flightPaxList pfpl " - + "left join fetch pax.passengerTripDetails " + "left join fetch pfpl.flight " - + "left join fetch pfpl.passenger WHERE pax.id IN (" + + "left join fetch pax.bookingDetails " + + "left join fetch pax.passengerTripDetails " + + "left join fetch pax.flight " + + "WHERE pax.id IN (" + "SELECT pxtag.pax_id FROM PassengerIDTag pxtag WHERE pxtag.idTag IN (SELECT p.idTag FROM PassengerIDTag p WHERE p.pax_id = (:pax_id) ))") List getBookingDetailsByPassengerIdTag(@Param("pax_id") Long pax_id); @Query("SELECT pax FROM Passenger pax " + "left join fetch pax.passengerDetails " - + "left join fetch pax.bookingDetails " + "left join fetch pax.flightPaxList pfpl " - + "left join fetch pax.passengerTripDetails " + "left join fetch pfpl.flight " - + "left join fetch pfpl.passenger WHERE pax.id IN (" + + "left join fetch pax.bookingDetails " + + "left join fetch pax.passengerTripDetails " + + "left join fetch pax.flight " + + "WHERE pax.id IN (" + "SELECT pxtag.pax_id FROM PassengerIDTag pxtag WHERE " - + "pxtag.tamrId IN (SELECT p.tamrId FROM PassengerIDTag p WHERE p.pax_id = (:pax_id)) " + + "pxtag.tamrId IN (SELECT p.tamrId FROM PassengerIDTag p WHERE p.pax_id = (:pax_id)) " + "AND pxtag.tamrId IS NOT NULL)") List getBookingDetailsByTamrId(@Param("pax_id") Long pax_id); diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/CountryRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/CountryRepository.java index 3d051387bf..3e27baaec1 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/CountryRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/CountryRepository.java @@ -5,7 +5,6 @@ */ package gov.gtas.repository; -import gov.gtas.model.FlightPax; import gov.gtas.model.lookup.Country; import java.util.List; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPaxRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPaxRepository.java index 1c27fbd3a9..ff1ffbf140 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPaxRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/FlightPaxRepository.java @@ -10,11 +10,9 @@ import java.util.Collection; import java.util.Set; +@Deprecated public interface FlightPaxRepository extends CrudRepository { - default FlightPax findOne(Long flightPaxId) { - return findById(flightPaxId).orElse(null); - } @Transactional @Query("SELECT fps FROM FlightPax fps WHERE fps.passenger.id IN :pidList") diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PassengerRepository.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PassengerRepository.java index 190c20a280..5189e9a6bb 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PassengerRepository.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/repository/PassengerRepository.java @@ -33,14 +33,14 @@ public interface PassengerRepository extends JpaRepository, Pas @Query("SELECT p FROM Passenger p " + "left join fetch p.passengerTripDetails " + "left join fetch p.passengerDetails " + "left join fetch p.documents " - + "left join fetch p.flightPaxList pfl " + "left join fetch pfl.flight " + "WHERE p.id = :id") - Passenger findByIdWithFlightPaxAndDocuments(@Param("id") Long id); + + "left join fetch p.flight " + "WHERE p.id = :id") + Passenger findByIdWithFlightAndDocuments(@Param("id") Long id); @Query("SELECT p FROM Passenger p " + "left join fetch p.passengerTripDetails " + "left join fetch p.passengerDetails " + "left join fetch p.documents " - + "left join fetch p.flightPaxList pfl " + "left join fetch pfl.flight " + + "left join fetch p.flight " + "left join fetch p.hitDetails " + "WHERE p.id = :id") - Passenger findByIdWithFlightPaxAndDocumentsAndHitDetails(@Param("id") Long id); + Passenger findByIdWithFlightAndDocumentsAndHitDetails(@Param("id") Long id); default Passenger findOne(Long passengerId) { return findById(passengerId).orElse(null); @@ -93,4 +93,5 @@ Set getPassengerUsingREF(@NonNull @Param("flightId") Long flightId, @Query("SELECT p from Passenger p where p.id in :paxIds") Set getPassengersForEmailDto(@Param("paxIds") Set paxIds); + } diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerService.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerService.java index a90739313e..7a3729e679 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerService.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerService.java @@ -6,5 +6,5 @@ public interface ApisControllerService { - List generateFlightPaxVoByApisRef(String ref, long flightId); + List generateFlightPassengerList(String ref, long flightId); } diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerServiceImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerServiceImpl.java index d9b36072e9..b3ba60670a 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerServiceImpl.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/ApisControllerServiceImpl.java @@ -1,10 +1,8 @@ package gov.gtas.services; -import gov.gtas.model.Address; -import gov.gtas.model.FlightPax; +import gov.gtas.model.Passenger; import gov.gtas.repository.ApisMessageRepository; import gov.gtas.services.search.FlightPassengerVo; -import gov.gtas.vo.passenger.AddressVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,35 +18,23 @@ public class ApisControllerServiceImpl implements ApisControllerService { ApisMessageRepository apisMessageRepository; @Transactional - public List generateFlightPaxVoByApisRef(String ref, long flightId) { - Set fpList = apisMessageRepository.findFlightPaxByApisRef(ref, flightId); + public List generateFlightPassengerList(String ref, long flightId) { + Set fpList = apisMessageRepository.findPassengerByApisRef(ref, flightId); List flightPassengerVos = new ArrayList<>(); - for (FlightPax fp : fpList) { + for (Passenger p : fpList) { FlightPassengerVo fpVo = new FlightPassengerVo(); - fpVo.setFirstName(fp.getPassenger().getPassengerDetails().getFirstName()); - fpVo.setLastName(fp.getPassenger().getPassengerDetails().getLastName()); - fpVo.setMiddleName(fp.getPassenger().getPassengerDetails().getMiddleName()); - fpVo.setEmbarkation(fp.getEmbarkation()); - fpVo.setDebarkation(fp.getDebarkation()); - if (fp.getInstallationAddress() != null) { - AddressVo add = new AddressVo(); - Address installAdd = fp.getInstallationAddress(); - add.setLine1(installAdd.getLine1()); - add.setLine2(installAdd.getLine2()); - add.setLine3(installAdd.getLine3()); - add.setCity(installAdd.getCity()); - add.setCountry(installAdd.getCountry()); - add.setPostalCode(installAdd.getPostalCode()); - add.setState(installAdd.getState()); - fpVo.setInstallationAddress(add); - } - fpVo.setPortOfFirstArrival(fp.getPortOfFirstArrival()); - fpVo.setResidencyCountry(fp.getResidenceCountry()); - fpVo.setPassengerType(fp.getTravelerType()); - fpVo.setNationality(fp.getPassenger().getPassengerDetails().getNationality()); - fpVo.setResRefNumber(fp.getReservationReferenceNumber()); - fpVo.setFlightId(fp.getFlight().getId()); - fpVo.setPassengerId(fp.getPassenger().getId()); + fpVo.setFirstName(p.getPassengerDetails().getFirstName()); + fpVo.setLastName(p.getPassengerDetails().getLastName()); + fpVo.setMiddleName(p.getPassengerDetails().getMiddleName()); + fpVo.setEmbarkation(p.getPassengerTripDetails().getEmbarkation()); + fpVo.setDebarkation(p.getPassengerTripDetails().getDebarkation()); + fpVo.setPortOfFirstArrival(p.getFlight().getDestination()); + fpVo.setResidencyCountry(p.getPassengerDetails().getNationality()); + fpVo.setPassengerType(p.getPassengerDetails().getPassengerType()); + fpVo.setNationality(p.getPassengerDetails().getNationality()); + fpVo.setResRefNumber(p.getPassengerTripDetails().getReservationReferenceNumber()); + fpVo.setFlightId(p.getFlight().getId()); + fpVo.setPassengerId(p.getId()); flightPassengerVos.add(fpVo); } return flightPassengerVos; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportServiceImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportServiceImpl.java index 11b6f4f7f5..6a44f8329c 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportServiceImpl.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportServiceImpl.java @@ -12,7 +12,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import gov.gtas.enumtype.HitSeverityEnum; @@ -23,7 +22,6 @@ import gov.gtas.model.HitViewStatus; import gov.gtas.model.Passenger; import gov.gtas.model.Pnr; -import gov.gtas.model.UserGroup; import gov.gtas.model.lookup.HitCategory; import gov.gtas.repository.ApisMessageRepository; import gov.gtas.services.dto.PassengerNoteSetDto; @@ -31,7 +29,6 @@ import gov.gtas.services.dto.PaxDetailPdfDocResponse; import gov.gtas.util.PaxDetailVoUtil; import gov.gtas.vo.HitDetailVo; -import gov.gtas.vo.NoteVo; import gov.gtas.vo.passenger.DocumentVo; import gov.gtas.vo.passenger.FlightVoForFlightHistory; import gov.gtas.vo.passenger.PassengerVo; @@ -59,7 +56,7 @@ public class EventReportServiceImpl implements EventReportService { public EventReportServiceImpl(FlightService flightService, PnrService pnrService, PassengerService passengerService, HitDetailService hitDetailService, EventReportPdfService passengerEventReportService, - HitDetailService hitsDetailsService, PassengerNoteService passengerNoteService) { + PassengerNoteService passengerNoteService) { this.flightService = flightService; this.pnrService = pnrService; this.passengerService = passengerService; @@ -77,7 +74,7 @@ public PaxDetailPdfDocResponse createPassengerEventReport(Long paxId, Long fligh PassengerVo passengerVo = new PassengerVo(); Flight flight = flightService.findById(flightId); - Passenger passenger = passengerService.findByIdWithFlightPaxAndDocuments(paxId); + Passenger passenger = passengerService.findByIdWithFlightAndDocuments(paxId); if (passenger != null && flight != null) { if (flight.getId().equals(flightId)) { diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerService.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerService.java index 750c77d6e9..a5ca85947b 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerService.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerService.java @@ -28,10 +28,10 @@ public interface PassengerService { Passenger findById(Long id); @PreAuthorize(PRIVILEGES_ADMIN_AND_VIEW_PASSENGER) - Passenger findByIdWithFlightPaxAndDocuments(Long paxId); - + Passenger findByIdWithFlightAndDocuments(Long paxId); + @PreAuthorize(PRIVILEGES_ADMIN_AND_VIEW_PASSENGER) - Passenger findByIdWithFlightPaxAndDocumentsAndHitDetails(Long paxId); + Passenger findByIdWithFlightAndDocumentsAndHitDetails(Long paxId); /** * Gets the passengers by criteria. @@ -54,7 +54,7 @@ public interface PassengerService { @PreAuthorize(PRIVILEGES_ADMIN_AND_VIEW_PASSENGER) List getBookingDetailHistoryByPaxID(Long pId); - Set findFlightPaxFromPassengerIds(List passengerIdList); + Set findPassengerFromPassengerIds(List passengerIdList); void setAllFlights(Set flights, Long id); diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java index a5f641d3f6..64383c83b3 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/PassengerServiceImpl.java @@ -60,9 +60,6 @@ public class PassengerServiceImpl implements PassengerService { @Autowired PassengerRepository passengerRepository; - @Autowired - FlightPaxRepository flightPaxRepository; - @Autowired AppConfigurationService appConfigurationService; @@ -120,15 +117,15 @@ public PassengersPageDto getPassengersByCriteria(Long flightId, PassengersReques } // grab flight info - Flight flightPaxOn = passenger.getFlight(); - vo.setFlightId(flightPaxOn.getId().toString()); - vo.setFlightNumber(flightPaxOn.getFlightNumber()); - vo.setFullFlightNumber(flightPaxOn.getFullFlightNumber()); - vo.setCarrier(flightPaxOn.getCarrier()); - vo.setFlightOrigin(flightPaxOn.getOrigin()); - vo.setFlightDestination(flightPaxOn.getDestination()); - vo.setEtd(flightPaxOn.getMutableFlightDetails().getEtd()); - vo.setEta(flightPaxOn.getMutableFlightDetails().getEta()); + Flight passengerFlight = passenger.getFlight(); + vo.setFlightId(passengerFlight.getId().toString()); + vo.setFlightNumber(passengerFlight.getFlightNumber()); + vo.setFullFlightNumber(passengerFlight.getFullFlightNumber()); + vo.setCarrier(passengerFlight.getCarrier()); + vo.setFlightOrigin(passengerFlight.getOrigin()); + vo.setFlightDestination(passengerFlight.getDestination()); + vo.setEtd(passengerFlight.getMutableFlightDetails().getEtd()); + vo.setEta(passengerFlight.getMutableFlightDetails().getEta()); rv.add(vo); count++; } @@ -195,14 +192,14 @@ public Passenger findById(Long id) { @Override @Transactional - public Passenger findByIdWithFlightPaxAndDocuments(Long paxId) { - return passengerRepository.findByIdWithFlightPaxAndDocuments(paxId); + public Passenger findByIdWithFlightAndDocuments(Long paxId) { + return passengerRepository.findByIdWithFlightAndDocuments(paxId); } @Override @Transactional - public Passenger findByIdWithFlightPaxAndDocumentsAndHitDetails(Long paxId) { - return passengerRepository.findByIdWithFlightPaxAndDocumentsAndHitDetails(paxId); + public Passenger findByIdWithFlightAndDocumentsAndHitDetails(Long paxId) { + return passengerRepository.findByIdWithFlightAndDocumentsAndHitDetails(paxId); } @Override @@ -240,8 +237,8 @@ public List getBookingDetailHistoryByPaxID(Long pId) { } @Override - public Set findFlightPaxFromPassengerIds(List passengerIdList) { - return flightPaxRepository.findFlightFromPassIdList(passengerIdList); + public Set findPassengerFromPassengerIds(List passengerIdList) { + return new HashSet<>(passengerRepository.getPassengersById(passengerIdList)); } @Override diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/search/ElasticHelper.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/search/ElasticHelper.java index 31a17fe931..a52cb19e26 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/search/ElasticHelper.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/search/ElasticHelper.java @@ -60,7 +60,6 @@ public class ElasticHelper { private static final Logger logger = LoggerFactory.getLogger(ElasticHelper.class); private static final String INDEX_NAME = "flightpax"; - private static final String FLIGHTPAX_TYPE = "doc"; private static final String CREDENTIALS = "xpack.security.user"; private static final String NODE_NAME = "node.name"; private static final String CLUSTER_NAME = "cluster.name"; diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/util/PaxDetailVoUtil.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/util/PaxDetailVoUtil.java index 9b63b22792..77baa644d7 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/util/PaxDetailVoUtil.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/util/PaxDetailVoUtil.java @@ -2,13 +2,7 @@ import static java.util.stream.Collectors.toList; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; @@ -26,7 +20,6 @@ import gov.gtas.model.Email; import gov.gtas.model.Flight; import gov.gtas.model.FlightLeg; -import gov.gtas.model.FlightPax; import gov.gtas.model.FrequentFlyer; import gov.gtas.model.Passenger; import gov.gtas.model.Phone; @@ -50,15 +43,11 @@ public class PaxDetailVoUtil { public static List copyBookingDetailFlightModelToVo( List allPassengersRelatingToSingleIdTag) { - List flightsAndBookingDetailsRelatingToSamePaxIdTag = new ArrayList<>(); - try { - - List flightPassengersList = getFlightPaxes(allPassengersRelatingToSingleIdTag); - + Set flightPassengersList = new HashSet<>(allPassengersRelatingToSingleIdTag); Set> associatedPaxFlights = flightPassengersList.stream() - .map(flightPax -> new ImmutablePair<>(flightPax.getPassenger(), flightPax.getFlight())) + .map(p -> new ImmutablePair<>(p, p.getFlight())) .collect(Collectors.toSet()); List flightHistory = associatedPaxFlights.stream().map(passengerFlightPair -> { @@ -91,23 +80,6 @@ public static List copyBookingDetailFlightModelToVo( return flightsAndBookingDetailsRelatingToSamePaxIdTag; } - public static List getFlightPaxes(List allPassengersRelatingToSingleIdTag) { - - List flightPaxes = allPassengersRelatingToSingleIdTag.stream() - .flatMap(p -> p.getFlightPaxList().stream()).collect(toList()); - - List filteredFlightPax = new ArrayList<>(); - Map, Boolean> flightPaxRecorded = new HashMap<>(); - for (FlightPax fp : flightPaxes) { - Pair flightPaxCombination = new ImmutablePair<>(fp.getPassenger(), fp.getFlight()); - if (!flightPaxRecorded.containsKey(flightPaxCombination)) { - flightPaxRecorded.put(flightPaxCombination, true); - filteredFlightPax.add(fp); - } - } - return filteredFlightPax; - } - public static void populateFlightVoWithBookingDetail(BookingDetail source, FlightVo target) { try { diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/vo/passenger/ApisMessageVo.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/vo/passenger/ApisMessageVo.java index 7a03c4ad5b..8deae20baf 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/vo/passenger/ApisMessageVo.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/vo/passenger/ApisMessageVo.java @@ -79,14 +79,6 @@ public void addBag(BagVo b) { bags.add(b); } - public Set getFlightpaxs() { - return flightpaxs; - } - - public void setFlightpaxs(Set flightpaxs) { - this.flightpaxs = flightpaxs; - } - public void addFlightpax(FlightPassengerVo flightpax) { this.flightpaxs.add(flightpax); } diff --git a/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportServiceTest.java b/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportServiceTest.java index 6fc3b68473..caa24f348b 100644 --- a/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportServiceTest.java +++ b/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportServiceTest.java @@ -141,10 +141,13 @@ public void setFlightHistoryTest() { try { eventReportService.setFlightHistory(paxDetailPdfDocRequest, 1L); List flightHistory = paxDetailPdfDocRequest.getFlightHistoryVoList(); - Assert.assertNotNull(flightHistory); - FlightVoForFlightHistory flightVoForFlightHistory = flightHistory.get(0); - Assert.assertEquals(String.valueOf("22"), flightVoForFlightHistory.getFlightId()); - Assert.assertEquals(String.valueOf("501"), flightVoForFlightHistory.getFlightNumber()); + Assert.assertEquals(2, flightHistory.size()); + FlightVoForFlightHistory fHistory = flightHistory.get(0); + FlightVoForFlightHistory bdHistory = flightHistory.get(1); + Assert.assertEquals(String.valueOf("150"), fHistory.getFlightId()); + Assert.assertEquals(String.valueOf("501"), bdHistory.getFlightNumber()); + Assert.assertEquals(String.valueOf("22"), bdHistory.getFlightId()); + Assert.assertEquals(String.valueOf("501"), bdHistory.getFlightNumber()); } catch (Exception e) { e.printStackTrace(); diff --git a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ServiceUtil.java b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ServiceUtil.java index 6a54fcefdb..698e756a3c 100644 --- a/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ServiceUtil.java +++ b/gtas-parent/gtas-loader/src/main/java/gov/gtas/services/ServiceUtil.java @@ -173,7 +173,7 @@ public Passenger findPassengerOnFlight(Flight f, PassengerVo pvo) { return null; } - Set flightPaxList; + Set passengerSet; Passenger existingPassenger = null; Long flightId = f.getId(); @@ -195,18 +195,18 @@ public Passenger findPassengerOnFlight(Flight f, PassengerVo pvo) { // Resolve passenger by Flight -> pnr recordLocator# -> pnr REF number if (newPaxHasRecordLocator && newPaxHasRef) { - flightPaxList = passengerRepository.getPassengerUsingREF(flightId, ref, recordLocator); - foundPassenger = !CollectionUtils.isEmpty(flightPaxList); - existingPassenger = foundPassenger ? flightPaxList.iterator().next() : null; + passengerSet = passengerRepository.getPassengerUsingREF(flightId, ref, recordLocator); + foundPassenger = !CollectionUtils.isEmpty(passengerSet); + existingPassenger = foundPassenger ? passengerSet.iterator().next() : null; } - flightPaxList = passengerRepository.returnAPassengerFromParameters(flightId, firstName, lastName); - if (!foundPassenger && !CollectionUtils.isEmpty(flightPaxList)) { + passengerSet = passengerRepository.returnAPassengerFromParameters(flightId, firstName, lastName); + if (!foundPassenger && !CollectionUtils.isEmpty(passengerSet)) { // Resolve passenger by passengerIdTag if (newPaxHasGender && newPaxHasDob) { String passengerIdTag = createPassengerIdTag(pvo); - for (Passenger pax : flightPaxList) { + for (Passenger pax : passengerSet) { if (pax.getPassengerIDTag() != null) { String paxIdTag = pax.getPassengerIDTag().getIdTag(); if (paxIdTag.equals(passengerIdTag)) { @@ -221,7 +221,7 @@ public Passenger findPassengerOnFlight(Flight f, PassengerVo pvo) { if (!foundPassenger && allowLoosenResolution) { // Find passenger by First Name, Last Name, document# and dob if (newPaxHasDocument && newPaxHasDob) { - for (Passenger pax : flightPaxList) { + for (Passenger pax : passengerSet) { if (haveSameDocument(pax, pvo) && haveSameDateOfBirth(pax, pvo)) { existingPassenger = pax; foundPassenger = true; @@ -232,7 +232,7 @@ public Passenger findPassengerOnFlight(Flight f, PassengerVo pvo) { // Find passenger by First Name, Last Name, document# and gender if (!foundPassenger && newPaxHasDocument && newPaxHasGender) { - for (Passenger pax : flightPaxList) { + for (Passenger pax : passengerSet) { if (haveSameDocument(pax, pvo) && haveSameGender(pax, pvo)) { existingPassenger = pax; foundPassenger = true; @@ -243,7 +243,7 @@ public Passenger findPassengerOnFlight(Flight f, PassengerVo pvo) { // Find passenger by First Name, Last Name, and document# if (!foundPassenger && newPaxHasDocument) { - for (Passenger pax : flightPaxList) { + for (Passenger pax : passengerSet) { if (haveSameDocument(pax, pvo)) { existingPassenger = pax; foundPassenger = true; @@ -254,7 +254,7 @@ public Passenger findPassengerOnFlight(Flight f, PassengerVo pvo) { // Find passenger by First Name, Last Name, and dob if (!foundPassenger && newPaxHasDob) { - for (Passenger pax : flightPaxList) { + for (Passenger pax : passengerSet) { if (haveSameDateOfBirth(pax, pvo)) { existingPassenger = pax; break; @@ -264,7 +264,7 @@ public Passenger findPassengerOnFlight(Flight f, PassengerVo pvo) { // Find passenger by First Name, Last Name, and gender if (!foundPassenger && newPaxHasGender) { - for (Passenger pax : flightPaxList) { + for (Passenger pax : passengerSet) { if (haveSameGender(pax, pvo) && isNull(pax.getPassengerDetails().getDob()) && isNull(pax.getDocuments())) { existingPassenger = pax; @@ -275,7 +275,7 @@ && isNull(pax.getDocuments())) { // Find passenger by First Name and Last Name if (!foundPassenger) { - for (Passenger pax : flightPaxList) { + for (Passenger pax : passengerSet) { if (isNull(pax.getPassengerDetails().getDob()) && isNull(pax.getPassengerDetails().getGender()) && isNull(pax.getDocuments())) { existingPassenger = pax; diff --git a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/rule/builder/pnr/FlightPaxConditionBuilder.java b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/rule/builder/pnr/FlightPaxConditionBuilder.java index 38596cf29c..f665d9b60a 100644 --- a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/rule/builder/pnr/FlightPaxConditionBuilder.java +++ b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/rule/builder/pnr/FlightPaxConditionBuilder.java @@ -10,6 +10,7 @@ import gov.gtas.querybuilder.mappings.FlightPaxMapping; import gov.gtas.rule.builder.EntityConditionBuilder; +@Deprecated public class FlightPaxConditionBuilder extends EntityConditionBuilder { public FlightPaxConditionBuilder(final String drlVariableName) { diff --git a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/util/TargetingResultUtils.java b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/util/TargetingResultUtils.java index 3ba9076e9b..371dd2984f 100644 --- a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/util/TargetingResultUtils.java +++ b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/util/TargetingResultUtils.java @@ -36,12 +36,12 @@ private static Map> createPassengerFlightMap(List allFlightPaxByPassengerId = passengerService - .findFlightPaxFromPassengerIds(ruleHitDetailPassengerIdList); + Set passengerFromPassengerIds = passengerService + .findPassengerFromPassengerIds(ruleHitDetailPassengerIdList); - for (FlightPax flightPax : allFlightPaxByPassengerId) { - Long passengerId = flightPax.getPassengerId(); - Long flightId = flightPax.getFlightId(); + for (Passenger p : passengerFromPassengerIds) { + Long passengerId = p.getId(); + Long flightId = p.getFlight().getId(); if (passengerFlightMap.containsKey(passengerId)) { passengerFlightMap.get(passengerId).add(flightId); } else { diff --git a/gtas-parent/gtas-webapp/src/main/java/gov/gtas/common/BagStatisticCalculator.java b/gtas-parent/gtas-webapp/src/main/java/gov/gtas/common/BagStatisticCalculator.java new file mode 100644 index 0000000000..6d821fb6bd --- /dev/null +++ b/gtas-parent/gtas-webapp/src/main/java/gov/gtas/common/BagStatisticCalculator.java @@ -0,0 +1,53 @@ +package gov.gtas.common; + +import gov.gtas.model.Bag; +import gov.gtas.model.BagMeasurements; +import gov.gtas.model.Passenger; + +import java.util.HashSet; +import java.util.Set; + +public class BagStatisticCalculator { + private int bagCount; + private double bagWeight; + private Set bagsSet; + + public BagStatisticCalculator(Passenger passenger) { + this.bagsSet = passenger.getBags(); + this.bagCount = 0; + this.bagWeight = 0; + } + + public BagStatisticCalculator(Set bagsSet) { + this.bagsSet = bagsSet; + this.bagCount = 0; + this.bagWeight = 0; + } + + public int getBagCount() { + return bagCount; + } + + public double getBagWeight() { + return bagWeight; + } + + public BagStatisticCalculator invoke(String bagType) { + Set bagMeasurementsSet = new HashSet<>(); + for (Bag paxBag : bagsSet) { + if (bagType.equalsIgnoreCase(paxBag.getData_source())) + if (paxBag.getBagMeasurements() != null) { + BagMeasurements bagMeasurements = paxBag.getBagMeasurements(); + if (bagMeasurementsSet.add(bagMeasurements)) { + if (bagMeasurements.getBagCount() != null) { + bagCount += bagMeasurements.getBagCount(); + } + if (bagMeasurements.getWeight() != null) { + bagWeight += bagMeasurements.getWeight(); + } + } + } + } + return this; + } +} diff --git a/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/PassengerDetailsController.java b/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/PassengerDetailsController.java index 6ea15e776a..62c04f106b 100644 --- a/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/PassengerDetailsController.java +++ b/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/PassengerDetailsController.java @@ -13,6 +13,7 @@ import javax.annotation.Resource; +import gov.gtas.common.BagStatisticCalculator; import gov.gtas.enumtype.HitTypeEnum; import gov.gtas.model.*; import gov.gtas.repository.BookingDetailRepository; @@ -42,12 +43,9 @@ import gov.gtas.json.KeyValue; import gov.gtas.repository.ApisMessageRepository; import gov.gtas.repository.BagRepository; -import gov.gtas.repository.SeatRepository; import gov.gtas.services.matcher.MatchingService; import gov.gtas.services.matching.PaxWatchlistLinkVo; import gov.gtas.services.search.FlightPassengerVo; -import gov.gtas.services.security.UserService; -import gov.gtas.util.DateCalendarUtils; import gov.gtas.util.LobUtils; import static java.util.stream.Collectors.*; @@ -101,7 +99,7 @@ public class PassengerDetailsController { public PassengerVo getPassengerByPaxIdAndFlightId(@PathVariable(value = "id") String paxId, @RequestParam(value = "flightId", required = false) String flightId) { PassengerVo vo = new PassengerVo(); - Passenger t = pService.findByIdWithFlightPaxAndDocuments(Long.valueOf(paxId)); + Passenger t = pService.findByIdWithFlightAndDocuments(Long.valueOf(paxId)); Flight flight = fService.findById(Long.parseLong(flightId)); List bagList = new ArrayList<>(); if (flightId != null && flight.getId().toString().equals(flightId)) { @@ -172,9 +170,6 @@ public PassengerVo getPassengerByPaxIdAndFlightId(@PathVariable(value = "id") St // Assign seat for every passenger on pnr for (Passenger p : pnrList.get(0).getPassengers()) { - FlightPax flightPax = getPnrFlightPax(p, flight); - Optional bagVoOptional = getBagOptional(flightPax); - bagVoOptional.ifPresent(tempVo::addBag); for (Seat s : p.getSeatAssignments()) { // exclude APIS seat data if (!s.getApis()) { @@ -188,11 +183,10 @@ public PassengerVo getPassengerByPaxIdAndFlightId(@PathVariable(value = "id") St } } } - - FlightPax mainPassengerFlightPax = getPnrFlightPax(t, flight); - Optional bagOptional = getBagOptional(mainPassengerFlightPax); - bagOptional.ifPresent(bagVo -> tempVo.setBagCount(bagVo.getBag_count())); - + BagStatisticCalculator bagStatisticCalculator = new BagStatisticCalculator(new HashSet<>(bagList)).invoke("PNR"); + tempVo.setBagCount(bagStatisticCalculator.getBagCount()); + tempVo.setBaggageWeight(bagStatisticCalculator.getBagWeight()); + tempVo.setTotal_bag_count(bagStatisticCalculator.getBagCount()); parseRawMessageToSegmentList(tempVo); vo.setPnrVo(tempVo); } @@ -206,18 +200,16 @@ public PassengerVo getPassengerByPaxIdAndFlightId(@PathVariable(value = "id") St List refList = apisMessageRepository.findApisRefByFlightIdandPassengerId(Long.parseLong(flightId), t.getId()); - List apisMessageFlightPaxs = apisMessageRepository - .findFlightPaxByFlightIdandPassengerId(Long.parseLong(flightId), t.getId()).stream() - .filter(a -> a.getMessageSource().equals("APIS")).collect(Collectors.toList()); - - if (!apisMessageFlightPaxs.isEmpty()) { - FlightPax apisMessageFlightPax = apisMessageFlightPaxs.get(0); - apisVo.setBagCount(apisMessageFlightPax.getBagCount()); - apisVo.setBagWeight(apisMessageFlightPax.getBagWeight()); - } + Passenger passenger = apisMessageRepository + .findPaxByFlightIdandPassengerId(Long.parseLong(flightId), t.getId()); + BagStatisticCalculator bagStatisticCalculator = new BagStatisticCalculator(passenger).invoke("APIS"); + int bagCount = bagStatisticCalculator.getBagCount(); + double bagWeight = bagStatisticCalculator.getBagWeight(); + apisVo.setBagCount(bagCount); + apisVo.setBagWeight(bagWeight); if (!refList.isEmpty()) { - List fpList = apisControllerService.generateFlightPaxVoByApisRef(refList.get(0), + List fpList = apisControllerService.generateFlightPassengerList(refList.get(0), Long.parseLong(flightId)); for (FlightPassengerVo flightPassengerVo : fpList) { apisVo.addFlightpax(flightPassengerVo); @@ -249,39 +241,6 @@ public PassengerVo getPassengerByPaxIdAndFlightId(@PathVariable(value = "id") St return vo; } - private FlightPax getPnrFlightPax(Passenger p, Flight flight) { - FlightPax flightPax; - if (p.getFlightPaxList() != null && !p.getFlightPaxList().isEmpty()) { - flightPax = p.getFlightPaxList().stream().filter(fp -> isPnr(fp, flight)).findFirst().orElse(null); - } else { - flightPax = null; - } - return flightPax; - } - - private boolean isPnr(FlightPax fp, Flight flight) { - return fp.getMessageSource() != null && fp.getMessageSource().equalsIgnoreCase("PNR") - && fp.getFlight().equals(flight); - } - - private Optional getBagOptional(FlightPax fp) { - Optional bagVoOptional; - if (fp != null && fp.getBagCount() > 0) { - BagVo bagVo = new BagVo(); - bagVo.setBag_count(fp.getBagCount()); - bagVo.setAverage_bag_weight(fp.getAverageBagWeight()); - bagVo.setBag_weight(fp.getBagWeight()); - bagVo.setData_source(fp.getMessageSource()); - bagVo.setPassFirstName(fp.getPassenger().getPassengerDetails().getFirstName()); - bagVo.setPassLastName(fp.getPassenger().getPassengerDetails().getLastName()); - bagVo.setData_source(fp.getMessageSource()); - bagVoOptional = Optional.of(bagVo); - } else { - bagVoOptional = Optional.empty(); - } - return bagVoOptional; - } - /** * Gets the travel history by pnr id and pnr ref. * @@ -477,10 +436,6 @@ public PnrVo mapPnrToPnrVo(Pnr source) { target.setDateReceived(source.getDateReceived()); target.setRaw(LobUtils.convertClobToString(source.getRaw())); target.setTransmissionDate(source.getEdifactMessage().getTransmissionDate()); - target.setTotal_bag_count(source.getTotal_bag_count()); - if (source.getBaggageWeight() != null) - target.setBaggageWeight(source.getBaggageWeight()); - target.setTripType(source.getTripType()); if (!source.getAddresses().isEmpty()) { @@ -809,10 +764,10 @@ private List copyBookingDetailFlightModelToVo( try { - List flightPassengersList = getFlightPaxes(allPassengersRelatingToSingleIdTag); + Set flightPassengersList = new HashSet<>(allPassengersRelatingToSingleIdTag); Set> associatedPaxFlights = flightPassengersList.stream() - .map(flightPax -> new ImmutablePair<>(flightPax.getPassenger(), flightPax.getFlight())) + .map(p -> new ImmutablePair<>(p, p.getFlight())) .collect(Collectors.toSet()); List flightHistory = associatedPaxFlights.stream().map(passengerFlightPair -> { @@ -845,23 +800,6 @@ private List copyBookingDetailFlightModelToVo( return flightsAndBookingDetailsRelatingToSamePaxIdTag; } - private List getFlightPaxes(List allPassengersRelatingToSingleIdTag) { - - List flightPaxes = allPassengersRelatingToSingleIdTag.stream() - .flatMap(p -> p.getFlightPaxList().stream()).collect(toList()); - - List filteredFlightPax = new ArrayList<>(); - Map, Boolean> flightPaxRecorded = new HashMap<>(); - for (FlightPax fp : flightPaxes) { - Pair flightPaxCombination = new ImmutablePair<>(fp.getPassenger(), fp.getFlight()); - if (!flightPaxRecorded.containsKey(flightPaxCombination)) { - flightPaxRecorded.put(flightPaxCombination, true); - filteredFlightPax.add(fp); - } - } - return filteredFlightPax; - } - /** * * @param source diff --git a/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/SearchController.java b/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/SearchController.java index a11507f662..57970ead47 100644 --- a/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/SearchController.java +++ b/gtas-parent/gtas-webapp/src/main/java/gov/gtas/controller/SearchController.java @@ -50,7 +50,7 @@ public JsonServiceResponse runLinksQuery(@RequestParam(value = "paxId") Long pax @RequestParam(value = "column") String column, @RequestParam(value = "dir") String dir) throws InvalidQueryException { - Passenger pax = paxService.findByIdWithFlightPaxAndDocuments(paxId); + Passenger pax = paxService.findByIdWithFlightAndDocuments(paxId); LinkAnalysisDto queryResults = searchService.findPaxLinks(pax, pageNumber, pageSize, column, dir); return new JsonServiceResponse(Status.SUCCESS, "success", queryResults); } diff --git a/gtas-parent/gtas-webapp/src/main/webapp/pax/paxTabs.html b/gtas-parent/gtas-webapp/src/main/webapp/pax/paxTabs.html index 7ee45f7e6f..93206ca4eb 100644 --- a/gtas-parent/gtas-webapp/src/main/webapp/pax/paxTabs.html +++ b/gtas-parent/gtas-webapp/src/main/webapp/pax/paxTabs.html @@ -716,7 +716,7 @@

- {{'bag.totalpnrbaggage' | translate}} ({{passenger.pnrVo.totalbagCount || 0}})    + {{'bag.totalpnrbaggage' | translate}} ({{passenger.pnrVo.bagCount || 0}})    {{'bag.baggageweight' | translate}} ({{passenger.pnrVo.baggageWeight}} Kg)

diff --git a/gtas-parent/gtas-webapp/src/test/java/gov/gtas/controller/PassengerDetailsControllerTest.java b/gtas-parent/gtas-webapp/src/test/java/gov/gtas/controller/PassengerDetailsControllerTest.java index 4464617cd5..ebee1ef621 100644 --- a/gtas-parent/gtas-webapp/src/test/java/gov/gtas/controller/PassengerDetailsControllerTest.java +++ b/gtas-parent/gtas-webapp/src/test/java/gov/gtas/controller/PassengerDetailsControllerTest.java @@ -71,14 +71,14 @@ public class PassengerDetailsControllerTest { public void passengerDetailControllerHappyPathTest() throws SQLException { Passenger wally = TestData.getPassenger(); Mockito.when(fService.findById(2L)).thenReturn(TestData.getFlight()); - Mockito.when(pService.findByIdWithFlightPaxAndDocuments(1L)).thenReturn(wally); + Mockito.when(pService.findByIdWithFlightAndDocuments(1L)).thenReturn(wally); List pnrs = TestData.getPnrList(); Mockito.when(pnrService.findPnrByPassengerIdAndFlightId(1L, 2L)).thenReturn(pnrs); Mockito.when(bagRepository.findFromFlightAndPassenger(2L, 1L)).thenReturn(TestData.getBags()); Mockito.when(apisMessageRepository.findByFlightIdAndPassengerId(2L, 1L)) .thenReturn(Collections.singletonList(TestData.getApisMessage())); - Mockito.when(apisMessageRepository.findFlightPaxByFlightIdandPassengerId(2L, 1L)) - .thenReturn(Collections.singletonList(TestData.getFlightPax())); + Mockito.when(apisMessageRepository.findPaxByFlightIdandPassengerId(2L, 1L)) + .thenReturn(TestData.getPassenger()); PassengerVo passengerVo = passengerDetailsController.getPassengerByPaxIdAndFlightId("1", "2"); Assert.assertNotNull(passengerVo); } From 9b530cb358faf5c0cbef8775aac4b75fa4beb7fc Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 7 Apr 2020 16:50:25 -0400 Subject: [PATCH 79/83] Added check for passenger middle name --- .../services/EventReportPdfServiceImpl.java | 29 +++++++- .../services/EventReportPdfServiceTest.java | 72 +++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportPdfServiceImpl.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportPdfServiceImpl.java index 17aa2646d6..295ea8259d 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportPdfServiceImpl.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/services/EventReportPdfServiceImpl.java @@ -181,8 +181,17 @@ public void createPdfCoverPage(PDDocument document, PDPage coverPage, PaxDetailP Row row = this.getRow(reportCoverTable); this.createEmptyWhiteCell(row, FIRST_COLUMN_WIDTH); this.createReportCoverLabelCell(row, SECOND_COLUMN_WIDTH, COVER_PAGE_TABLE_COLUMN_LABEL_NAME); - this.createValueCellWithRighBottomtBorder(row, THIRD_COLUMN_WIDTH, + if(passengerVo.getMiddleName()!=null && !passengerVo.getMiddleName().isEmpty()) + { + this.createValueCellWithRighBottomtBorder(row, THIRD_COLUMN_WIDTH, passengerVo.getLastName() + ", " + passengerVo.getFirstName() + ", " + passengerVo.getMiddleName()); + } + else + { + this.createValueCellWithRighBottomtBorder(row, THIRD_COLUMN_WIDTH, + passengerVo.getLastName() + ", " + passengerVo.getFirstName()); + } + this.createEmptyWhiteCell(row, FOUR_COLUMN_WIDTH); // Flight row row = this.getRow(reportCoverTable); @@ -317,8 +326,17 @@ public void createPdfPassengerDetailSection(PDDocument document, PDPage passenge Cell cell = this.creatPassengerVerticalColumnLabelCell(row, FIRST_COLUMN_WIDTH, PASSENGER_TABLE_COLUMN_LABEL_NAME); cell.setRightBorderStyle(new LineStyle(DEFAULT_LABEL_BACKGROUND_COLOR, 0)); + + if(passengerVo.getMiddleName()!=null && !passengerVo.getMiddleName().isEmpty()) + { this.createPassengerFirstVerticalColumnValueCell(row, SECOND_COLUMN_WIDTH, passengerVo.getLastName() + ", " + passengerVo.getFirstName() + " " + passengerVo.getMiddleName()); + } + else + { + this.createPassengerFirstVerticalColumnValueCell(row, SECOND_COLUMN_WIDTH, + passengerVo.getLastName() + ", " + passengerVo.getFirstName() ); + } this.createFieldValueCell(row, COLUMN_SEPARATOR_WIDTH, ""); cell = this.creatVerticalColumnLabelCell(row, THIRD_COLUMN_WIDTH, TRIP_TABLE_COLUMN_LABEL_FLIGHT_NUMBER); @@ -511,7 +529,14 @@ public void createCotravelerSection(PDDocument document, PDPage passengerDetailP cotravelerRow = this.getRow(cotravelerTable); this.createFirstColoredCell(cotravelerRow, HIT_HISTORY_COLUMN_1, cotraveler.getFirstName(), i); - this.createColoredCell(cotravelerRow, HIT_HISTORY_COLUMN_2, cotraveler.getMiddleName(), i); + if(cotraveler.getMiddleName()!=null && !cotraveler.getMiddleName().isEmpty()) + { + this.createColoredCell(cotravelerRow, HIT_HISTORY_COLUMN_2, cotraveler.getMiddleName(), i); + } + else + { + this.createColoredCell(cotravelerRow, HIT_HISTORY_COLUMN_2, "", i); + } this.createColoredCell(cotravelerRow, HIT_HISTORY_COLUMN_3, cotraveler.getLastName(), i); this.createColoredCell(cotravelerRow, HIT_HISTORY_COLUMN_4, cotraveler.getGender(), i); this.createLastColoredCell(cotravelerRow, HIT_HISTORY_COLUMN_5, changeToString(cotraveler.getAge()), diff --git a/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportPdfServiceTest.java b/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportPdfServiceTest.java index 058a848554..3f77382674 100644 --- a/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportPdfServiceTest.java +++ b/gtas-parent/gtas-commons/src/test/java/gov/gtas/services/EventReportPdfServiceTest.java @@ -221,6 +221,78 @@ public void createPnrValueCellTest() { } } + + @Test + public void createValueCellWithRighBottomtBorderTest() { + + try { + + int THIRD_COLUMN_WIDTH = 30; + PassengerVo passengerVo = new PassengerVo(); + passengerVo.setFirstName("First"); + passengerVo.setMiddleName("Middle"); + passengerVo.setLastName("Last"); + document.addPage(passengerDetailPage); + BaseTable table = eventReportPdfService.createReportCoverlTable(document, coverPage); + Row row = eventReportPdfService.getRow(table); + Cell cell = eventReportPdfService.createValueCellWithRighBottomtBorder(row, THIRD_COLUMN_WIDTH, + passengerVo.getLastName() + ", " + passengerVo.getFirstName() + ", " + passengerVo.getMiddleName()); + String cellText = cell.getText(); + String []name = cellText.split(","); + Assert.assertEquals(name.length,3); + Assert.assertEquals(name[2].trim(),"Middle"); + + passengerVo.setFirstName("First"); + passengerVo.setLastName("Last"); + cell = eventReportPdfService.createValueCellWithRighBottomtBorder(row, THIRD_COLUMN_WIDTH, + passengerVo.getLastName() + ", " + passengerVo.getFirstName() ); + String cellText2 = cell.getText(); + String []name2 = cellText2.split(","); + Assert.assertEquals(name2.length,2); + + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @Test + public void createPassengerFirstVerticalColumnValueCellTest() + { + + try { + + int THIRD_COLUMN_WIDTH = 30; + PassengerVo passengerVo = new PassengerVo(); + passengerVo.setFirstName("First"); + passengerVo.setMiddleName("Middle"); + passengerVo.setLastName("Last"); + document.addPage(passengerDetailPage); + + BaseTable table = eventReportPdfService.createReportCoverlTable(document, coverPage); + Row row = eventReportPdfService.getRow(table); + Cell cell = eventReportPdfService.createPassengerFirstVerticalColumnValueCell(row, THIRD_COLUMN_WIDTH, + passengerVo.getLastName() + ", " + passengerVo.getFirstName() + ", " + passengerVo.getMiddleName()); + String cellText = cell.getText(); + String []name = cellText.split(","); + Assert.assertEquals(name.length,3); + Assert.assertEquals(name[2].trim(),"Middle"); + + passengerVo.setFirstName("First"); + passengerVo.setLastName("Last"); + cell = eventReportPdfService.createValueCellWithRighBottomtBorder(row, THIRD_COLUMN_WIDTH, + passengerVo.getLastName() + ", " + passengerVo.getFirstName() ); + String cellText2 = cell.getText(); + String []name2 = cellText2.split(","); + Assert.assertEquals(name2.length,2); + + + } catch (Exception e) { + e.printStackTrace(); + } + + } From fafd5149fab56d253883d89b444b25fb3e00cf6a Mon Sep 17 00:00:00 2001 From: Rob Stine Date: Wed, 8 Apr 2020 16:56:04 -0400 Subject: [PATCH 80/83] Set configurable timeout with a 1 second default. Update from 5 second hard-coded timeout. --- gtas-parent/docker-resources/default.application.properties | 1 + .../src/main/resources/default.application.properties | 1 + .../main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gtas-parent/docker-resources/default.application.properties b/gtas-parent/docker-resources/default.application.properties index 5a13a1e6a6..179450fbce 100755 --- a/gtas-parent/docker-resources/default.application.properties +++ b/gtas-parent/docker-resources/default.application.properties @@ -147,6 +147,7 @@ ruleRunner.makeEmptyApisBagsOnNullBag=false ruleRunner.fixedDelay.in.milliseconds=5000 ruleRunner.initialDelay.in.milliseconds=2000 loader.permits=5000 +loader.worker.thread.timeout=1000 ruleRunner.isRunning=false partial.hits.case.create=true logs.dir.root=/logs diff --git a/gtas-parent/gtas-commons/src/main/resources/default.application.properties b/gtas-parent/gtas-commons/src/main/resources/default.application.properties index 8f8772e0ca..d60022e0e6 100644 --- a/gtas-parent/gtas-commons/src/main/resources/default.application.properties +++ b/gtas-parent/gtas-commons/src/main/resources/default.application.properties @@ -148,6 +148,7 @@ ruleRunner.makeEmptyApisBagsOnNullBag=false ruleRunner.fixedDelay.in.milliseconds=5000 ruleRunner.initialDelay.in.milliseconds=2000 loader.permits=5000 +loader.worker.thread.timeout=1000 ruleRunner.isRunning=false partial.hits.case.create=true logs.dir.root=C:\\TEST diff --git a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java index 1172381c62..dbee217425 100644 --- a/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java +++ b/gtas-parent/gtas-job-scheduler-war/src/main/java/gov/gtas/job/scheduler/LoaderWorkerThread.java @@ -14,6 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.messaging.Message; @@ -26,6 +27,8 @@ public class LoaderWorkerThread implements Runnable { @Autowired private LoaderScheduler loader; + @Value("${loader.worker.thread.timeout}") + private Integer timeout; private String text; private String fileName; private String[] primeFlightKeyArray; @@ -53,7 +56,7 @@ public void run() { while (true) { Message msg = null; try { - msg = queue.poll(5000, TimeUnit.MILLISECONDS); + msg = queue.poll(timeout, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { logger.error("error polling queue", e); Thread.currentThread().interrupt(); From 35f9a0a51bee272118b12184f2e519b8c89f3f05 Mon Sep 17 00:00:00 2001 From: Teddy Date: Fri, 10 Apr 2020 10:06:01 -0400 Subject: [PATCH 81/83] Fixed code to show the user session expired popup message --- .../gtas-webapp/src/main/webapp/app.js | 26 ++++++++++++++++--- .../src/main/webapp/login/LoginController.js | 6 ++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/gtas-parent/gtas-webapp/src/main/webapp/app.js b/gtas-parent/gtas-webapp/src/main/webapp/app.js index 4d0be553c3..33607924ec 100644 --- a/gtas-parent/gtas-webapp/src/main/webapp/app.js +++ b/gtas-parent/gtas-webapp/src/main/webapp/app.js @@ -90,7 +90,7 @@ var app; $rootScope.$on('$stateChangeStart', function (event, toState) { - Idle.watch(); + //Idle.watch(); var currentUser = $sessionStorage.get(APP_CONSTANTS.CURRENT_USER); if (currentUser === undefined) { $rootScope.$broadcast('unauthorizedEvent'); @@ -104,6 +104,24 @@ var app; }); $rootScope.currentlyLoggedInUser = $sessionStorage.get(APP_CONSTANTS.CURRENT_USER); + + if ($rootScope.currentlyLoggedInUser === undefined || $rootScope.currentlyLoggedInUser == null) + { + console.log('## User is not logged in ##'); + if(Idle.running()) + { + Idle.unwatch(); + console.log('## Idle Watch stopped. ##'); + } + } + else + { + if(!Idle.running()) + { + Idle.watch(); + console.log('## Started Idle Watch ##'); + } + } $rootScope.searchBarContent = { content : "" @@ -168,9 +186,9 @@ var app; $rootScope.triggerIdle = function(){ //Prevent triggers pre-login - if(Idle.running()){ + /* if(Idle.running()){ Idle.watch(); - } + }*/ }; $rootScope.setSelectedTab = function(route){ @@ -1109,7 +1127,7 @@ var app; .factory('httpSecurityInterceptor', function ($q, $rootScope ) { return { request: function(config){ - $rootScope.triggerIdle(); + //$rootScope.triggerIdle(); return config; }, responseError: function (response) { diff --git a/gtas-parent/gtas-webapp/src/main/webapp/login/LoginController.js b/gtas-parent/gtas-webapp/src/main/webapp/login/LoginController.js index 432a17eeb8..dd52c9fa51 100644 --- a/gtas-parent/gtas-webapp/src/main/webapp/login/LoginController.js +++ b/gtas-parent/gtas-webapp/src/main/webapp/login/LoginController.js @@ -18,9 +18,9 @@ $mdDialog.show( $mdDialog.alert() .clickOutsideToClose(false) - .textContent("{{'msg.sessiontimeout' | translate}}") - .ariaLabel("{{'msg.usertimeout' | translate}}") - .ok("{{'msg.ok' | translate}}") + .textContent("Your session has timed out. For security reasons you have been logged out automatically.") + .ariaLabel("User Timeout") + .ok("OK") .openFrom({ left: 1500 }) From 1c5cddd0cba126edb7c400b1170b826be8fc45ca Mon Sep 17 00:00:00 2001 From: Rob Stine Date: Fri, 10 Apr 2020 11:20:04 -0400 Subject: [PATCH 82/83] Add short circuit on message with no passengers. --- .../svc/request/builder/RuleEngineRequestBuilder.java | 3 +++ .../svc/request/builder/RuleEngineRequestBuilderTest.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilder.java b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilder.java index e1eb2ab92b..7fdd90a1f0 100644 --- a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilder.java +++ b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilder.java @@ -235,6 +235,9 @@ public void addPnr(List pnrList) { Map> pnrPaymentForm = createPaymentFormMap(pnrIds); Set passengersFromPnr = pnrRepository.getPassengersWithFlight(pnrIds); + if (passengersFromPnr.isEmpty()) { + return; + } logger.debug("pnr bags"); Set flightIds = passengersFromPnr.stream().map(p -> p.getFlight().getId()).collect(Collectors.toSet()); Set paxIds = passengersFromPnr.stream().map(Passenger::getId).collect(Collectors.toSet()); diff --git a/gtas-parent/gtas-rulesvc/src/test/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilderTest.java b/gtas-parent/gtas-rulesvc/src/test/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilderTest.java index 3364fb6de8..8f1fd23bd4 100644 --- a/gtas-parent/gtas-rulesvc/src/test/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilderTest.java +++ b/gtas-parent/gtas-rulesvc/src/test/java/gov/gtas/svc/request/builder/RuleEngineRequestBuilderTest.java @@ -23,6 +23,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import static org.mockito.ArgumentMatchers.any; @@ -75,6 +76,13 @@ public void addApisEarlyRelease() { ruleEngineRequestBuilder.addApisMessage(Collections.singletonList(apisMessage)); } + @Test + public void addPnrEarlyRelease() throws SQLException { + Pnr pnr = TestData.getPnrMessage(); + pnr.setId(1L); + pnr.setPassengers(new HashSet<>()); + ruleEngineRequestBuilder.addPnr(Collections.singletonList(pnr)); + } @Test public void addApisWithBags() { ApisMessage apisMessage = TestData.getApisMessage(); From 113c6a4d73e91369f2d464acf682e63bcfda6acc Mon Sep 17 00:00:00 2001 From: Rob Stine Date: Mon, 13 Apr 2020 13:24:19 -0400 Subject: [PATCH 83/83] Add enabled/disabled to graph rules --- .../main/java/gov/gtas/model/GraphRule.java | 12 +++++ .../gov/gtas/svc/GraphRulesServiceImpl.java | 44 ++++++++++--------- .../graph_rule_active_column.sql | 2 + .../graph_rule_active_column_rollback.sql | 3 ++ 4 files changed, 40 insertions(+), 21 deletions(-) create mode 100644 gtas-parent/scripts/db/1.10.0_to_1.11.0/graph_rule_active_column.sql create mode 100644 gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/graph_rule_active_column_rollback.sql diff --git a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/GraphRule.java b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/GraphRule.java index 6b49234cbd..c9d51cc993 100644 --- a/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/GraphRule.java +++ b/gtas-parent/gtas-commons/src/main/java/gov/gtas/model/GraphRule.java @@ -35,9 +35,21 @@ public void setDisplayCondition(String displayCondition) { @Column(name = "displayCondition") private String displayCondition; + + @Column(name = "enabled") + private boolean enabled = true; + @OneToMany(mappedBy = "graphRule") private Set graphParameter = new HashSet<>(); + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + public String getCipherQuery() { return cipherQuery; } diff --git a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/GraphRulesServiceImpl.java b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/GraphRulesServiceImpl.java index b679ba3d81..dda7328ead 100644 --- a/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/GraphRulesServiceImpl.java +++ b/gtas-parent/gtas-rulesvc/src/main/java/gov/gtas/svc/GraphRulesServiceImpl.java @@ -70,27 +70,29 @@ public Set graphResults(Set passengers) { } for (GraphRule graphRule : graphRules) { - Set passengerHitIds = getPassengerHitIds(graphRule, paxMap.keySet()); // This command runs the - // graph rules! - for (String idTag : passengerHitIds) { - for (Passenger passenger : paxMap.get(idTag)) { - RuleHitDetail rhd = new RuleHitDetail(HitTypeEnum.GRAPH_HIT); - rhd.setFlightId(passenger.getFlight().getId()); - rhd.setPassenger(passenger); - rhd.setPassengerName(passenger.getPassengerDetails().getFirstName() + " " - + passenger.getPassengerDetails().getLastName()); - rhd.setTitle(graphRule.getTitle()); - rhd.setDescription(graphRule.getDescription()); - rhd.setHitRule(graphRule.getDescription() + ":" + graphRule.getId()); - rhd.setHitCount(1); - rhd.setRuleId(graphRule.getId()); - rhd.setPassengerId(passenger.getId()); - rhd.setPassengerType(PassengerTypeCode.P); - rhd.setFlightId(passenger.getFlight().getId()); - rhd.setHitMakerId(graphRule.getId()); - rhd.setCipherQuery(graphRule.getCipherQuery()); - rhd.setGraphHitDisplay(graphRule.getDisplayCondition()); - ruleHitDetails.add(rhd); + if (graphRule.isEnabled()) { + Set passengerHitIds = getPassengerHitIds(graphRule, paxMap.keySet()); // This command runs the + // graph rules! + for (String idTag : passengerHitIds) { + for (Passenger passenger : paxMap.get(idTag)) { + RuleHitDetail rhd = new RuleHitDetail(HitTypeEnum.GRAPH_HIT); + rhd.setFlightId(passenger.getFlight().getId()); + rhd.setPassenger(passenger); + rhd.setPassengerName(passenger.getPassengerDetails().getFirstName() + " " + + passenger.getPassengerDetails().getLastName()); + rhd.setTitle(graphRule.getTitle()); + rhd.setDescription(graphRule.getDescription()); + rhd.setHitRule(graphRule.getDescription() + ":" + graphRule.getId()); + rhd.setHitCount(1); + rhd.setRuleId(graphRule.getId()); + rhd.setPassengerId(passenger.getId()); + rhd.setPassengerType(PassengerTypeCode.P); + rhd.setFlightId(passenger.getFlight().getId()); + rhd.setHitMakerId(graphRule.getId()); + rhd.setCipherQuery(graphRule.getCipherQuery()); + rhd.setGraphHitDisplay(graphRule.getDisplayCondition()); + ruleHitDetails.add(rhd); + } } } } diff --git a/gtas-parent/scripts/db/1.10.0_to_1.11.0/graph_rule_active_column.sql b/gtas-parent/scripts/db/1.10.0_to_1.11.0/graph_rule_active_column.sql new file mode 100644 index 0000000000..184df75f16 --- /dev/null +++ b/gtas-parent/scripts/db/1.10.0_to_1.11.0/graph_rule_active_column.sql @@ -0,0 +1,2 @@ +alter table graph_rules + add enabled bit null; \ No newline at end of file diff --git a/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/graph_rule_active_column_rollback.sql b/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/graph_rule_active_column_rollback.sql new file mode 100644 index 0000000000..12f7b9802a --- /dev/null +++ b/gtas-parent/scripts/db/1.10.0_to_1.11.0/rollback/graph_rule_active_column_rollback.sql @@ -0,0 +1,3 @@ +alter table graph_rules + DROP COLUMN IF EXISTS enabled; +